C语言(彻底理解指针和地址,彻底!)

来源:互联网 发布:周杰伦侯佩岑 知乎 编辑:程序博客网 时间:2024/05/19 09:17

天啊!为什么你学了3年还是无法正确理解指针地址的概念?别扯淡你一看C语言就懵逼,琢磨LOL英雄属性你挺6啊!

 

拓展:

有人一提到指针地址,就会一脸懵逼,因为在他们的脑海中,指针的概念始终建立不起来,总感觉自己跟指针之间隔着一层迷雾,那我现在就用1分钟的时间,拨开你们之间的这层迷雾!

首先你要知道,计算机编程世界中的任何东西,都是一块块的内存!然后,指针是什么?那当然是一块内存了,那为什么叫指针呢?因为这块内存不放鸡,不放鸭,也不放狗屎,而专用来存放另一块内存的地址!所以我们就把这样的内存称为指针。

 

那什么是内存地址呢?

理解内存地址,是猎杀指针的第一把尖刀。

地址是一片内存中每个字节(byte)的编号,就好比房号是一栋办公楼中每个房间的编号一样,假如我所在的办公楼房间数量总共不超过1000间,那么我用一个三位数来表示就足够了,比如302、508等等。

同样的道理,假如计算机内存的字节总数不超过1000个,也可以用三位数来表达,换算成二进制数,最多也就是11 1110 0111(即十进制的999),也就说说用10bits就可以完全表示1000以下的所有字节的编号的。但假如我们的内存有多达4GB个字节,10bits的编号显然太短了,经计算,我们至少需要32bits来表示所有的字节地址编号,因此一个数据的地址就类似于:0110 1101 1100 0010 1101 1110 0101 1101,由于写起来太长不够方便,因此我们更喜欢将上述地址表示为十六进制:0x6DC2DE5D。

内存这栋大楼的房间数多得惊人!他们的编号从0x00000000开始,到0xFFFFFFFF,总计达232个房间!每一个房间(字节/byte)包含8个比特/bit,每个比特可以存放一个1或者0,一图顶万言,附上一张内存的性感照片:

上图展现了一个32位系统的内存示意图,第0x0804FFB0号字节里面存放了一串数据:1111 0000,而紧挨着他的第0x0804FFB1号字节里面存放了另一串数据:1010 1010。

 

所以,对一个指针取地址,无非就是对一块内存取地址,跟对一个整数取地址,对一个浮点数取地址,对一个数组取地址,对一个函数取地址,没有任何区别!请看:

int a = 100; // 内存a的地址是:&a

float b = 3.14; // 内存b的地址是:&b

char c[5]="abc"; // 内存c的地址是:&c

void f(int size, float length); // 内存f的地址是:&f

int *p = &a; // 内存p的地址是:&p

懂了吧。smiley

2 1
原创粉丝点击