c指针的本质:指针就是地址,这是理解指针的第一步。指针之所以难以理解在于c的羞涩语义。
看一个一级指针例子:
#include <stdio.h>
int main()
{
int foo;
int *foo_p;
foo=5;
foo_p=&foo;
printf("foo....%d\n",foo);
printf("*foo_p....%d\n",*foo_p);
printf("&foo....%p\n",&foo);
printf("foo_p....%p\n",foo_p);
printf("&foo_p....%p\n",&foo_p);
return 0;
}
运行结果:
foo....5 // foo = 5
*foo_p....5 // *foo_p = 5 *xxx表示指针的内容
&foo....0x7ffd851df8f4 //foo的取地址操作
foo_p....0x7ffd851df8f4 //foo_p的值是foo的地址
&foo_p....0x7ffd851df8f8 //foo_p的地址
二级指针例子:
1 #include <stdio.h>
2 int main()
3
4 {
5 int foo;
6 int *foo_p;
7 int **foo_pp;
8
9 foo = 5;
10 foo_p = &foo;
11 foo_pp = &foo_p;
12
13 printf("foo....%d\n",foo);
14 printf("&foo....%p\n",&foo);
15
16 printf("foo_p....%p\n",foo_p);
17 printf("&foo_p....%p\n",&foo_p);
18 printf("*foo_p....%d\n",*foo_p);
19
20 printf("foo_pp....%p\n",foo_pp);
21 printf("&foo_pp....%p\n",&foo_pp);
22 printf("*foo_pp....%p\n",*foo_pp);
23 printf("**foo_pp....%d\n",**foo_pp);
24 return 0;
25
26 }
运行结果:
foo....5 //
&foo....0x7ffec682940c //取地址操作
foo_p....0x7ffec682940c //foo_p 存 的值是foo的地址
&foo_p....0x7ffec6829410 //取地址操作
*foo_p....5 // 引用操作符 * ,*foo_p 获取该地址(foo地址)的内容
foo_pp....0x7ffec6829410 //foo_pp 存的值是foo_p的地址
&foo_pp....0x7ffec6829418 //取地址操作
*foo_pp....0x7ffec682940c //引用操作符,*foo_pp 的值为foo_p的地址
**foo_pp....5 // 引用操作符*,引用两次,*foo_pp 的值为foo_p的地址,*(*foo_pp)地址的值为5
各变量名的类型推导,foo_p是指针,且指向int,故foo_p的类型是int*,也就是在‘*’前添加int;foo_pp也是指针,且指向foo_p,故foo_pp的类型是int**.也是在‘*’前添加int*.
更高阶的指针类型,以此类推