一个初学者对于二级指针的个人分析,如果有错希望给与批评和指正
个人对于指针的理解就是其实指针就是一个变量,一个保证着地址的变量。
一级指针非常容易理解,如下:
#include<stdio.h>
void main()
{
int num =100; //一个普通的num变量
int *p = # //一个int类型的指针变量,保存着变量num的地址 ,变量名前加个*就是指针了
//(指定类型就是告诉指针往前走4个字节就好了,因为int是占用四个字节的类型)
// &变量名 就是取出该变量的地址编号
printf("num和*p是等价的:num=%d == *p=%d \n", num, *p); //*指针 是根据指针保存的地址取出值
printf("&num和p是等价的:&num=%p == p=%p \n", &num, p); //&变量 是根据变量取出值所在的地址
getchar();
}
执行结果:
num和*p是等价的:num = 100 == *p = 100
&num和p是等价的:&num = 001AF76C == p = 001AF76C
理解了普通指针,接下来就是二级指针:
一级指针p保存的是变量num在内存里的地址,那一级指针p在内存里的地址呢???
指针p的地址也用指针保存啊,那么保存指针p地址的指针就是二级指针了...........
看代码:
#include<stdio.h>
void main()
{
int num = 100; //一个普通的num变量
int *p = # //一个int类型的指针变量,保存着变量num的地址 ,变量名前加个*就是指针了
//(指定类型就是告诉指针往前走4个字节就好了,因为int是占用四个字节的类型)
// &变量名 就是取出该变量的地址编号
printf("num和*p是等价的:num = %d == *p = %d\n\n", num, *p); //*指针 是根据指针保存的地址取出值
printf("&num和p是等价的:&num = %p == p = %p\n\n", &num, p); //&变量 是根据变量取出值所在的地址
int **PP = &p; // 加多一个* 两个**就是二级指针le.... &p 取出指针 p 的地址给 pp 保存
printf("*p 和 **pp 是等价的 *p = %d == **pp =%d\n\n",*p, **PP);
printf("p 和 *pp 是等价的 p = %p == *pp = %p\n\n", p, *PP);
printf("pp和&p是等价的:pp = %p, &p = %p", PP, &p);
//通过上面的代码已经知道:
//p 保存的是 num 的地址, *p 根据地址取出 num 的值是100
//pp 保存的是 p 的地址, *pp 根据地址取出 p 的值是 num的地址
//pp 保存的是 p 的地址 &p 取出p的地址
getchar();
}
执行结果如下:
num和*p是等价的:num = 100 == *p = 100
&num和p是等价的:&num = 010FFE28 == p = 010FFE28
*p 和 **pp 是等价的 *p = 100 == **pp =100
p 和 *pp 是等价的 p = 010FFE28 == *pp = 010FFE28
pp和&p是等价的:pp = 010FFE1C, &p = 010FFE1C
问:pp 保存的是啥?
答:p 的地址啊
问:为什么*pp的值是和 p 是等价的?
答:因为pp保存的是 p 的地址,* 号是根据地址取出值,*pp 取出 p 的地址里面保存的值,也就是num的地址. 取出num的地址后,在加一个*号,就是根据num的地址取出值,所以 **pp == 100;
内存中的逻辑大概如下图(原谅我画的丑--_--||):
问: 为什么要使用二级指针保存指针的地址?难道一级指针就不能保存一级指针的地址了吗???
答:windows32位操作系统的指针变量是占四个字节,这就跟指针说明了,从首地址开始,往后要读四个字节,不能多也不能少。如果读少或者读多了,读出来的数据讲是不正确的。如果需要保存的值是地址,那么必须确保有四个字节的空间来保存。这才能保证数据的完整性。但是指针的类型又是多样的,定义int *P = &num;因为int类型占四个字节空间,所以int类型的指针会从首地址开始往后读四个字节。如果定义的是char 类型的指针,char 只占一个字节,这时候char,类型的指针就只会读取这一个字节,当指针类型为double是,指针便会往前读取包括首地址在内的8个字节。32位系统指针只占4个字节,这时读取的是地址的话便全都是错的,二级指针很好的规避了这个问题,二级指针,无论什么类型的指针都只会读取四个字节。
问:那如果要保存PP的地址呢?
答:那就再定义一个指针变量,用三个*。当然你也可以用两个或者int类型指针的一个*。但是这样你就取不出100的值了。定义的指针变量用两个*号,最多只能取出num的地址。 这是为什么呢?你自己做一下试验就知道咯哦,勤动手,多练习^-^