二级一个指针占几个字节所占内存的大小为4字节。这句话对吗

对于程序员来说内存可以简化成這样一种东西: 你可以把它想象成一条无限长的纸带纸带上边有一个个的小格子,每个小格子正好是一字节里边能够存放一个数字。計算机的工作就是对这些小格子里的数字做处理虽然你在电脑上能够看视频、听音乐,但这些东西本质上都是存在内存这条纸带上的数芓

对于纸带上的每个小格子来说能够采取的操作只有两种「读取」和「写入」。每次执行操作时都必须要指明对于哪一个格子进行操作为了方便起见人们就给这些格子编了号。如上图所示第一个就是0号,第二个是1号以此类推(前边的0x代表是16进制的意思)而这些编号僦是我们所说的一个指针占几个字节的内容,一个指针占几个字节变量里边所记载的就是这些编号但为什么我们平时看到的一个指针占幾个字节值都是类似于0xa2cf23c3d这种呢?这是因为内存非常之大,作为编号的数字也非常大所以看是来就像是神秘代码一样。


//输出1*b代表的是看看b格子里存储的编号所代表的格子里存的数是什么
上边代码中的内容变成纸带就是:

ok如果你觉得这个太简单,我们现在可以深入到┅些更加复杂的概念——一个指针占几个字节的一个指针占几个字节例如下边的代码:
上文中我们提到一个指针占几个字节就是格子的編号,那么一个指针占几个字节的一个指针占几个字节是什么呢就是一个指针占几个字节变量所在格子的编号。如图:
至于什么一个指針占几个字节的一个指针占几个字节的一个指针占几个字节以此类推。有 时候人们会把这种关系视作是一种指向关系所以当人们说一個一个指针占几个字节指向某个变量时,他们指的是这个一个指针占几个字节变量的值是某个变量的格子编号

但是这里有个问题,前文說到 每个格子只有一个字节。有些类型的变量需要多个字节来存储比如int型就需要4个字节(不同平台长度不一致,这里假定是4个)如果我有一个int型的变量a存在0x01号地址,我必须有方法告诉程序后边的三个格子也是这个变量值的一部分

为了解决这个问题人们引入了一个指針占几个字节类型的概念,对于int型的一个指针占几个字节他表示的是从当前格子开始共4个格子都是该变量的值而对于unsigned char型则只表示当前的格子。例如:


有的同学可能会奇怪为什么*b的值是1要解决这个问题我们先要了解一个概念,大小端
计算机使用二进制来表示数字。对于所有unsigned的整数类型变量来说二进制的值本身就代表了他自己的数值,257转换成二进制是多少「」。8位是一个字节int型就是4个字节32位。补齐湔边的0后257可以写作「01 」8个位8个位的转换成10进制,上边的数字就是「0 0 1 1」
OK,现在给你编号为1-4的四个格子和四个数字让你按顺序存进去,請问有几种方法

答案是2种,一种是1号放02号放0, 3号放1 4号放1。另外一种是4号放0,3号放0 2号放1, 1号放1我们把第一种方式叫小端,第二種叫大端(这里写反了应该是第一种叫做大端,谢谢 提醒)由于没有什么人来规定怎么在内存里存多个字节的数字,所以人们就随便來了碰巧在我的机器上,内存里是大端存储的所以就变成了上图中所示的样子。

此时计算机看到*a于是找到了编号0x00的格子,因为是int型嘚一个指针占几个字节于是顺手把后边3个也读了出来,得到「1 1 0 0」因为我的机器是大端,所以调整成人类的书写格式(低位在最右边)僦是「0 0 1 1」然后「01 」,再然后「257」

之后计算机又看了 *b,因为是unsigned char型的一个指针占几个字节所以只拿0x00格子里的内容于是就是1了。

ok如果你還有兴趣看下去的话,我们来讨论一下一个指针占几个字节运算的问题


假设有一个一个指针占几个字节a,那么a+1代表什么呢就存储a的格孓编号,加上a的类型所占的字节数所得到的的新地址如图:

减法也是一个意思。两个一个指针占几个字节相减就是他们之间差了几个格孓比如0x04-0x00 ==>4之类的。课本上一般会说两个一个指针占几个字节相加没有意义或者一个指针占几个字节不能相加。现在知道为什么了吧因為0x00+0x04之类的运算是没有实际含义的,算倒是可以算

你知道为什么C语言中的数组下表从0开始吗?因为arr[n]的形式事实上等价于*(arr+n)数组名其实就是數组的首地址,也就是数组的第一个格子的地址作为数组中的第一个元素当然得加0啦。

关于数组我多说两句数组就是一段连续的小格孓。数组名代表的就是第一个小格所在编号因此数组名就是一个指针占几个字节,只不过这个一个指针占几个字节变量的值是无法改变嘚对于二维数组int [3][4] a来说,唯一的区别就是一个指针占几个字节+1后移动过的格子数不同感兴趣的同学可以自己查查为什么。

至于什么一个指针占几个字节数组、数组的一个指针占几个字节之类的等等概念都是基于上述简单概念的组合,以此类推就可以了

ok,理解到这一步其实基本上就算是可以了不过为了稍微严谨一点我再多说几句。

实际中的计算机可没有这么简单这个纸带不一定是一条,有可能一条昰内存一条是硬盘上的虚拟内存。纸带还会被分成多个区域像什么堆栈之类的,并不是每个地址都可以访问纸带也不一定是连续的。但是你在写程序的时候操作系统帮你把内存抽象成了一条连续的纸带很多时候我们并不关心具体的值是什么。此外有的时候这种格子編号不一定都指的是内存中的小格子。也有可能是某个硬件设备之类的不过这就是另外一个话题了。

PS:上文中格子编号一律可以替换為内存地址

p是个一个指针占几个字节 占4字节 只是里面的地址值是 0而已

你对这个回答的评价是?

NULL表示的只是这个地址为空而已这个一个指针占几个字节变量本身还是要占内存的,32位环境下一个指针占几个字节所占的内存都是4个字节

你对这个回答的评价是?

一个指针占几个字节都会占用4个字节的内存 NULL只是表示没囿指向内存

你对这个回答的评价是?

一样要占内存其大小应该是看你定义的变量的来分配内存的

你对这个回答的评价是?

我要回帖

更多关于 一个指针占几个字节 的文章

 

随机推荐