距离上篇博客整整一个月了,秋招的黄金期,感觉自己的节奏和去年此时的师兄师姐完全不在一个频道上,找工作真的是玄学,真的是有缘千里来相聚啊,不多说了,祝福每位毕业季的同学(比心)~
一直以来都想搞一个手工画图系列,以自己的理解落实到具体的纸面上,这样更加清晰明了,今天先来第一棒,也是“当头一棒”,悄悄地进入指针的大世界~
记得大一刚开始接触C语言时还是很感兴趣的,当时重点关注的网站是“编程中国”,也向很多人推荐过,但现在这个网站感觉要废了,时不时地崩一下,内容和排版也一直都没啥改进,但这依然不妨碍我对它的热爱,其中C语言的教程堪称经典,至今都将其奉若圭臬,现在就开始小小地谈论一波指针吧,可能会比较浅显,慢慢来,任重而道远。
关于指针的定义想必大家都了然于胸了,我们通常所说的指针全名应该是“指针变量”,也就是存放指针的变量,而指针则是指的“内存地址”,落实到具体的C程序中指针就是我们存放数据的内存地址,直接看例子吧:
#include <stdio.h>
int main(){
int a = 1;
double b=3.1415;
int *pa = &a;
int *pb = &b;
printf("a的地址:%#x\n", &a);
printf("pa的地址:%#x\n", &pa);
printf("*pa的地址:%#x\n", &*pa);
printf("pb的地址:%#x\n", &pb);
printf("b的地址:%#x\n", &b);
printf("a的值:%d\n", a);
printf("pa的值:%d\n", pa);
printf("*pa的值:%d\n", *pa);
printf("b的值:%f\n", b);
printf("a占据的内存大小:%d\n",sizeof(a));
printf("pa占据的内存大小:%d\n", sizeof(pa));
printf("pb占据的内存大小:%d\n", sizeof(pb));
printf("b占据的内存大小:%d\n", sizeof(b));
return 0;
}
看着好大一坨,其实都是浮云,核心就是定义了两个普通变量和两个指针变量,然后就是各种输出,先看看结果吧:
这一过程可以大体做图如下:
这里边有几个问题需要说明一下:
1.一开始我只设置了a和pa,结果发现多次运行得到二者的地址的都不一样,也就是说这两个变量的地址是 系统随机分配的,更有意思的是虽然每次的结果不一致,但二者差值均为28,不晓得这是不是有某种内在联系;还有一点就是对于这几个变量分配的内存不是连续的,中间有少许的间隔,这就很奇怪了,难道这两条指令运行期间还有第三者插足...
2.使用sizeof获取的大小单位是字节,对照本例大家发现pa和pb都为4,也就是说sizeof(XX)得到的是XX本身的大小,跟他所指向的类型没有关系;
3.内存分配的基本单位是字节,一开始画图时我是采用基本单位制的画法,每一小块为一个字节,但这样观感不太好,于是就如上图所示直接在后边标注了内存大小;另外大家可能也注意到a,b,pa和pb之间的关系,我们先定义声明的a,然后是b,结果发现b的地址小而a的地址大,这是由于我们定义的这些局部变量都存在栈中,原则是先进后出,这样定义是ab先后入栈,此时并没有给他们分配空间,之后ba先后出栈,这样便先给b分配空间了;
4.程序中比较特殊的两条输出:
printf("*pa的地址:%#x\n", &*pa);
printf("pa的值:%d\n", pa);
第一条就是输出的pa(&和*可相互抵消),这个对照一下第二条输出的
就会发现这二者输出的都是pa,只不过输出格式不一样,一个是十六进制另一个是十进制,关于&和*以及%x和%p大家可以自行查阅,都是很基础的知识点;
5.关于这几个变量以及他们的地址可以这样理解:一切为了方便!我们自定义的变量a、b等是为了方便我们记忆,而当程序编译运行时这些符号变量都会替换为对应的地址,毕竟计算机可不知道ab是个啥玩意,他们的眼中只有10101010这些二进制;
6.有三条输出可以放到一块进行比较:
printf("pa的地址:%#x\n", &pa);
printf("*pa的地址:%#x\n", &*pa);
printf("*pa的值:%d\n", *pa);
大家可以这三条自成体系,第一条为pa的地址;第二条为pa的值;第三条为pa所指内存单元的值;对照上图也很好理解这三个值的意义~
7.最后就是常见的几个概念,比如指针的类型,指针所指向的类型,指针的值以及指针本身占据的内存大小,对应于本例中的指针pa,它的类型为int *,指向的类型为int,值为0x4ffd7c,本身大小为4字节(这个在32位系统中是固定的,也可以理解成指针的值的类型是一样的,都为一个表示内存地址的十六进制数)
暂时就这些吧,有需要补充的后续还会继续跟进,指针值得好好钻研一番
—如果本篇内容对你有一点点帮助,请点个赞或者收藏关注一下,让我们一起努力—
转载:https://blog.csdn.net/u014483914/article/details/101165585