int *p; int a = 99; p = &a; *p = 10; printf("%p %p %d\n",p,&a,a);
0x7fff5fbff744 0x7fff5fbff744 10 *p定义了一个指针变量,只能存放地址,所以通过&寻址符,将a的地址赋值给指针p然后使用*访问地址符,访问p地址并更改值为10 最终打印的结果也很明显,两个地址完全一样,而且a通过指针间接被修改为10
int **pp = &p; **pp = 5; printf("%d\n",a);
5 上面的代码表示了指向指针的指针,所以出现了多个*符号
int arr[5] = {10,9,8,7,6}; int *ap; ap = arr; printf("ap : %d\n",*(ap + 2));//加1的长度取决于类型 printf("arr : %d\n",*(arr + 2));
ap : 8 arr : 8 关于数组和指针呢,数组名代表其首元素的地址,所以不需要&符号而且由于数组本身就是地址,所以指针指向后和数组本身的方法是通用的 指针+1其实表示的是地址变更,而变更幅度和类型相关
//常量区,堆:对象,栈:局部变量 char name[] = "abc";//这种写法是字符串变量 char *name2 = "abc";//这种是字符串常量 char *name3 = "abc"; printf("name:%p\nname2:%p\nname3:%p\n",name,name2,name3);
name:0x7fff5fbff72c name2:0x100000f4b name3:0x100000f4b name[]和*name有根本的区别,存放的区域不同,而且*name无法更改注意:由于name2进入常量区,所以name3再次指向“abc”时,实际上是接入了同样的地址
char *name4[5] = {"abc","bbc"}; printf("%s\n",name4[0]); //name4[0][0] = 'A'; printf("%s\n",name4[1]);
abc bbc
字符串指针数组的写法
void (*o)(); o = text; (*o)(); o();
void text(){ printf("text!\n");}
text! text! 这里的代码展示了指向函数的指针,以及如何通过指针调用函数,因为函数名和数组一样就是地址,所以也不需要&符号
int *back(){ int *p; return p;}最后展示了一个返回指针的函数
|