对指针的深入了解
初学者的福利来了!!!!
首先对变量这一词做一个本质的介绍。变量的实质就是一个可操作的空间,且变量的变是体现在该存储空间中所存储的地址所对应的值是可变的。比如举一个例子来说吧:现在不管打开任意一款游戏,而这款游戏中将会难免产生一些临时的数据,将会在内存中临时存储,随着游戏的不断进行,则衡量某一标准的数据随时会发生改变,因此这时随时发生变化的数据将会在内存中存储,这个时候为了确保这个可变数据所存储的地方,因此就有了变量。
【注:有些人会产生一种疑惑,问,内存不都是临时存储吗?如果这一进程结束之后,下一次进来的时候你怎么知道这个数据所存储的地址?而且这个地址并不是固定不变的,而是随机分配,你咋能确保这个地址就是呢?所以我估计对一个初学者来说会有这样的疑问吧!这个时候就会出现一个变量地址表,而是自动查找,因为这个时候你已经给了一个变量的名字了,所以就不必担心以上所出现的问题。】
指针实际上也是变量,它里面存储的实际是内存中的一个地址。打个比方吧:假如你是小明,我想找你本人的时候,这时我刚好知道你的家庭住址,那么我就可以通过你的家庭住址来找你。指针就好比小明的家庭住址,也可以说是一个间接的量吧。例如:int *p; 定义了一个指向整型的指针变量p,如果没有这个*,这就是定义了一个整型的变量,*p就是取值,把p所指向的地址空间里面的内容取出来。
例:
#include<stdio.h>
int main(){
int a=3;
int b=2;
int* c;
c=&b;
int** d;//二重指针只能指向一重指针,以此类推
d=&c;
printf("a的地址=%d\n",&a);//取变量a的地址
printf("b的地址=%d\n",&b);//取变量b的地址
printf("c的地址=%d\n",&c);//取变量c的地址——指针也是一种变量
printf("d的地址=%d\n",&d);//取变量d的地址——同理
printf("c的值=%d\n",c);//b的地址
printf("*c的值=%d\n",*c);//指针c所指向变量b中的内容——输出结果2
printf("d的值=%d\n",d);//变量c的地址
printf("*d的值=%d\n",*d);//同理,b的地址
printf("**d的值=%d\n",**d);//同理,结果为2
printf("%d\n",*&a);//变量的地址也可以是一种指针,3
printf("%d\n",&**d);//*d代表的是b的地址,**d代表的是b中所存放的值,&**d代表的是b的地址
printf("%d\n",*&**&d);//同理,b的地址
printf("%d\n",*&d);//c的地址
}
【特别注意:参考上面代码,比如*&**&d,这个为什么输出的结果为b的地址——详解:
1、d是指向c的,&d是代表的是指针变量d的地址;
2、*&d代表的是指针变量d所指向的指针变量c,结果为指针变量c的地址;
3、**&d==*c代表的是指针变量c所指向的内容,结果为变量b的地址;
4、&**&d代表的是指针变量c的地址;
5、*&**&d代表的指针变量从所指向的内容,结果为变量b的地址。】
我只是一个初学者,望许多大佬以后多批评指正。