------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
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;
}
最后展示了一个返回指针的函数