指针(Pointer)
首先要说指针,就必须要说清楚“变量”这个名词的含义。
变量,就字面意思来说,就是本身可以变化的数据。
往更深层次的说,那变量的本质到底是什么呢?其实,变量本质就是在内存当中某一个进程里面的一个临时存储区域,它主要用来存储计算中产生的一些临时性数据。而每一个变量在创建的时候都会被系统给随机分配一个地址,这个地址是真实的物理内存地址,我们一般都是通过访问这个地址从而获取到这个变量具体的内容。但是,如果在代码中用变量的地址直接去访问内存空间中的数据的话,有可能会访问不到,因此为了避免地址的不确定性,我们引入了“变量名”这个概念,由 变量名-地址表 来保证变量名和变量之间的关系,这样的话,就不会存在前面所说的问题了。
而我们C语言当中学习的指针,说白了其实也就是变量空间的地址。打个比方,有一本书,书上有一张便利贴,便利贴上面记录了书的某一页的页码和行号,这张便利贴其实就可以当作一个指针,我们通过访问便利贴上面的页码和行号,就可以具体的访问到书中的那一页那一行的文字,这是不是很形象呢?
指针,用来存储内存地址的变量,它指向单个对象的地址。
简单举个例子,int *a 这里面的*表示指针变量,a表示指针变量名,int表示这个指针是一个整型的指针。这如果还不明白的话,下面我用一串代码来更加具体的说一下。
#include<stdio.h>
int main(){
int a=3; //创建一个名称为a的普通变量,这个变量里面存放数据3
int b=4; //创建一个名称为b的普通变量,这个变量里面存放数据4
int* c; //创建一个指针变量c,这个指针变量c指向普通变量b
c=&b; //这句话的意思是将变量b的地址赋予指针变量c
int** d; //创建一个指向指针变量c的指针变量d
d=&c;
printf("a的值=%d\n",a);//直接打印a的值,结果为3
printf("b的值=%d\n",b);//直接打印b的值,结果为4
printf("a的地址=%d\n",&a);//&是取地址符号,这里打印a的地址,结果为6487580
printf("b的地址=%d\n",&b);//这里打印b的地址,结果为6487576
printf("c的地址=%d\n",&c);//这里打印c的地址,结果为6487568
printf("d的地址=%d\n",&d);//这里打印d的地址,结果为6487560
printf("c的值=%d\n",c); //c是一个指针变量,它里面存放的是b的地址,所以这里打印的是c所指向
的那个变量的地址,即打印b的地址,结果为6487576
printf("*c的结果=%d\n",*c);//c本身存放的是b的地址,*c就是根据b的地址去找b,这里打印的是b
的值,结果为4
printf("d的值=%d\n",d);//d里面存放的是c的地址,这里打印c的地址,结果为6487568
printf("*d的结果=%d\n",*d); //d里面存放的是c的地址,*d就是根据c的地址去找c,而c里面存放的
是b的地址,所以这里打印b的地址,结果为6487576
printf("**d的结果=%d\n",**d); //同上,*d表示b的地址,**d就是根据b的地址去找b,这里打印的
是b的值,结果为4
printf("%d\n",*&a);//&a是取a的地址,*&a就是根据a的地址去找a,结果为3
printf("%d\n",&**d);//同上,*d就是c,*c就是b,&b就是取b的地址,结果为6487576
printf("%d\n",*&**&d); //&d是取d的地址,*&d就是d里面存放的c的地址,**&d就是c里面存放的b
的地址,&**&b就是取c的地址,*&**&b就是c所指的变量b的地址
}
以上就是我对指针的所有了解,初次尝试,有不足支持还望大家能够指出,多谢大家!