c语言学习之基础知识点介绍(十四):指针的进阶
一、指针的加、减法运算
/* 1、加法运算 1)、可以跟整数进行加法运算,得到的还是一个地址 公式: 地址 + 1 = 地址 + 1 * 类型所占的字节数 地址 + n = 地址 + n * 类型所占的字节数 2)、只能跟整数运算,不能跟浮点数运算 2、指针的减法运算: 1)、可以跟整数进行减法运算,得到的还是一个地址 公式: 地址 - 1 = 地址 - 1 * 类型所占的字节数 地址 - n = 地址 - n * 类型所占的字节数 2)、只能跟整数运算,不能跟浮点数运算 */ //例如: //int类型的指针+1,结果等于原地址+4个字节 //0x7fff5fbff7cc - 0x7fff5fbff7d0 /* int num = 10; int *pNum = #//变量名是pNum 类型是int * printf("%p\n",pNum);//0x7fff5fbff7cc printf("%p\n",pNum+1); //0x7fff5fbff7d0 */ //char类型的指针+1,结果等于原地址+1个字节 //0x7fff5fbff7cf - 0x7fff5fbff7d0 /* char ch = 'a'; char *pCh = &ch; printf("%p\n",pCh);//0x7fff5fbff7cf printf("%p\n",pCh + 1);//0x7fff5fbff7d0 */ //float类型的指针+1,结果等于原地址+4个字节 //0x7fff5fbff7cc - 0x7fff5fbff7d0 /* float f = 10.3f; float *p = &f; printf("%p\n",p); //0x7fff5fbff7cc printf("%p\n",p+1);//0x7fff5fbff7d0 */ //double类型的指针+1,结果等于原地址+8个字节 //0x7fff5fbff7c8 - 0x7fff5fbff7d0 /* double d = 10.3; double *p = &d; printf("%p\n",p); //0x7fff5fbff7c8 printf("%p\n",p+1);//0x7fff5fbff7d0 */ //long类型的指针+1,结果等于原地址+8个字节 //0x7fff5fbff7c8 - 0x7fff5fbff7d0 /* long num = 10l; long *p = # printf("%p\n",p);//0x7fff5fbff7c8 printf("%p\n",p+1);//0x7fff5fbff7d0 */ //指针只能跟整数运算,不能跟浮点数运算 /* int num = 10; int *p = # printf("%p\n",p+1.0); //报错 */
二、指针加减法的作用
/* 指针跟整数的加法和减法都可以用来遍历数组 加法: int nums[3] = {10,20,30}; int *p = &nums[0]; for (int i = 0; i<3; i++) { printf("%d\n",*(p+i)); } 减法: int nums[3] = {10,20,30}; int *p = &nums[2]; for (int i = 0; i<3; i++) { printf("%d\n",*(p-i)); } */
三、指针和指针的运算
/* 指针可以和指针进行运算,但是只能进行减法运算。 指针和指针的减法运算,结果是一个long类型。 a.指针跟指针之间只能做减法运算,加、乘、除、取余都不可以。 b.指针跟指针之间的运算结果是一个整数,而且是long类型的。 c.指针跟指针之间的运算,必须是相同类型的指针,否则报错。 作用:指针的减法运算,只要是为了计算两个地址之间,相差了几个位(几个相同类型的空间) 公式: 地址 - 地址 = (地址 - 地址)/ 类型所占字节数 */ //例如: int num1=10,num2=20,*p1 = &num1,*p2 = &num2; printf("%ld\n",p1-p2);//1
四:指针运算的注意事项
/* 注意: 指针和整数,不能相数 指针和整数,不能相除 指针和整数,不能取余 加法和减法都不能和浮点数进行运算。 */
五、指针函数的介绍
/* 指针函数: 其实应该在中间加一个的字。叫 指针的函数,本质上还是一个函数。 当函数的返回值是一个指针的时候,就叫指针函数。 定义语法: 类型 * 函数名(参数列表){ 函数体; } 注意:这个*可以放在类型和函数名中间的任意位置。 内存中有一个地方叫栈区,栈区里面放的是局部变量。 有一个特点:出了作用域,就会回收。 注意:用指针函数的话,目前没什么用,C语言中的数据类型只要是局部的都是存在栈里面的。 用处的话:只能返回全局变量或者返回字符串常量,还可以返回静态变量的地址。 */ #include <stdio.h> int qNum = 111; int *test(){ //函数名是test 返回值是int * // int num = 1; // int *p = # // return # return &qNum; } char *test2(){ char *str = "qwe"; return str; } int main(int argc, const char * argv[]) { /* int *p = test(); int nums[100] = {0}; printf("%d\n",*p); */ char *str = test2(); printf("%s\n",str); return 0; }
函数的指针将在下一篇介绍。