指针
C 指针
指针本质上是一种变量,而不管是何种类型的指针变量其存储的都是内存地址,根据存储的内存地址就能找到指针指向的那一块内存。不同类型指针的区别只是其所存储的内存地址指向的内存中存储的数据,指针的类型表明了其所指向的内存中存储的数据的类型。
指针的作用就是存储地址,指针类型的作用是 告诉编译器如何解析该地址的数据,也就是指针的类型决定了编译器将内存中的数据解析为什么类型。
例:
#include <stdio.h>
int main(void)
{
int a = 10; // 定义整数变量 a,值为 10
int *p = &a; // 定义指针变量 p,存储 a 的地址
int **pp = &p; // 定义二级指针 pp,存储 p 的地址
printf("%d\n", a); // 输出 a 的值,即 10
printf("%p\n", &a); // 输出 a 的地址(十进制表示,具体值因内存地址而异)
printf("%p\n", p); // 输出 p 的值,即 a 的地址
printf("%p\n", &p); // 输出 p 的地址
printf("%d\n", *p); // 解引用 p,即 a 的值,10
printf("%p\n", *pp); // 解引用 pp,得到 p 的值,即 a 的地址
printf("%p\n", &pp); // 输出 pp 的地址
printf("%d\n", **pp); // **pp(即 *(*pp) ),先解引用 pp 得到 p 的值(即 a 的地址),再解引用 p 得到 a 的值(即 10)
return 0;
}
总结:
&a、p和*pp的值相同,因为p存储的就是a的地址,而pp存储的是p的地址,*pp是指p存储的值即a的地址。*p和**pp的值相同,因为它们最终都解引用到a,其值为 10。&p和pp的值相同,因为pp存储的是p的地址。&pp是pp自身的地址。
**pp 先解引用 pp 得到 p 的值(即 a 的地址),再解引用 p 得到 a 的值(即 10)。
pp存储的是p的地址。*pp取出p的值,即a的地址。**pp再次解引用,取出a的值,即10。

浙公网安备 33010602011771号