指针——个人的一点理解
指针(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 ",a);//直接打印a的值,结果为3 printf("b的值=%d ",b);//直接打印b的值,结果为4 printf("a的地址=%d ",&a);//&是取地址符号,这里打印a的地址,结果为6487580 printf("b的地址=%d ",&b);//这里打印b的地址,结果为6487576 printf("c的地址=%d ",&c);//这里打印c的地址,结果为6487568 printf("d的地址=%d ",&d);//这里打印d的地址,结果为6487560 printf("c的值=%d ",c); //c是一个指针变量,它里面存放的是b的地址,所以这里打印的是c所指向 的那个变量的地址,即打印b的地址,结果为6487576 printf("*c的结果=%d ",*c);//c本身存放的是b的地址,*c就是根据b的地址去找b,这里打印的是b 的值,结果为4 printf("d的值=%d ",d);//d里面存放的是c的地址,这里打印c的地址,结果为6487568 printf("*d的结果=%d ",*d); //d里面存放的是c的地址,*d就是根据c的地址去找c,而c里面存放的 是b的地址,所以这里打印b的地址,结果为6487576 printf("**d的结果=%d ",**d); //同上,*d表示b的地址,**d就是根据b的地址去找b,这里打印的 是b的值,结果为4 printf("%d ",*&a);//&a是取a的地址,*&a就是根据a的地址去找a,结果为3 printf("%d ",&**d);//同上,*d就是c,*c就是b,&b就是取b的地址,结果为6487576 printf("%d ",*&**&d); //&d是取d的地址,*&d就是d里面存放的c的地址,**&d就是c里面存放的b 的地址,&**&b就是取c的地址,*&**&b就是c所指的变量b的地址 }
以上就是我对指针的所有了解,初次尝试,有不足支持还望大家能够指出,多谢大家!
上一篇:
通过多线程提高代码的执行效率例子