**
为什么不同类型的指针变量所占字节数是固定不变的?
定义指针时指定基类型有何作用?
/2019年6月26日 /
*
笔者在学习的过程中也受到了以上的困扰,经过查阅资料后,得到以下理解:
首先,让我们先上代码,通过例子来深入理解
/*
2019年6月26日10:37:17
目的:一个指针变量所占字节数
*/
#include<stdio.h>
int main()
{
char ch = 'A';
int i = 9;
double x = 7.3;
char * p =&ch;
int * q = &i;
double * r = &x;
printf("p、q、r的字节长度分别为:%d,%d,%d\n",sizeof(p),sizeof(q),sizeof(r));//p,q,r变量所对应地址的存储空间大小
printf("char:%d,int:%d,double:%d\n",sizeof(char),sizeof(int), sizeof(double));
}
/*
在Visual C++6.0中运行输出的结果是:
----------------------------------
p、q、r的字节长度分别为:4,4,4
char:1,int:4,double:8
-----------------------------------
*/
定义一个指针:基类型 * 变量名 |
---|
我们发现无论定义的指针的基类型如何改变,但是输出的指针变量p,q,r所占字节长度均为4个字节。也就是说定义一个指针变量,则这个指针变量所占的字节数均为4个字节。(与计算机的地址总线位数有关) |
解释如下: |
我们以上例中的char * p = &ch为例,首先,我们要了解,计算机有很多个内存单元,每个内存单元都有其相应的编号,我们称之为地址(&ch),就如同家庭的的门牌号(&ch)一样,而指针变量便是存储这个地址的变量,就如同存放这个门牌号的一个门牌框(p)。而指针变量指向的对象(ch)就相当于这个门牌号对应的一间房子。 |
门牌框----指针变量p |
门牌号----地址&ch |
房间------普通变量ch |
有了以上的比喻之后,我们知道,指针变量p一定是用来存放地址的一个变量,也就是门牌框一定是用来放门牌的。而我们计算机的地址的编号与控制均是由地址总线控制的,以32位地址总线为例,无论是第一个内存单元的地址,还是最后一个单元的地址,都要由32位总线同时进行控制。因此每个地址的编号均是由一个32位(4个字节)大小的数组成,因此无论指针变量指向的变量ch存放的是什么内容,它的空间是多大,都不会影响指针变量所存放地址所占的字节数,也就是说,不管你房间里装的什么东西,能装多少东西,门牌号的大小整个小区都是统一规格的(4个字节)。
因此说,一个指针变量,无论它指向的变量占几个字节,该指针变量本身只占四个字节。
|那定义指针变量时它的基类型到底有何作用呢?|
首先,我们要知道一句话:一个变量的地址用该变量首字节的地址来表示。 |
---|
解释如下: |
还是上面那个比喻,假设你们村每户人家里所占有的房产数量各不相同,但是只要是自家的房子都连续的建在一起。比如有人家里是一间(char),有人家里是四间(int)等等,那么我们现在村支部要核查每户人家里的总资产,也就是你名下房子里面的东西。采取什么方法最合适呢?当然是,知道你家第一间房子的门牌号(&ch)然后再了解你名下有几间房子,由于你们村房子是顺序连续的,所以知道你家的第一间房的地址,再知道你家共有几套房,这样就能知道你家所有房子里的总资产了。 |
因此,第一间房的地址就是该指针变量的首地址,然后指针变量的基类型就是该户人家里有的房间数。通过这个方式,就能将指针变量 (p)指向的普通变量(ch)所有的内容都获取到。 |
总结
1、指针变量所占字节数是不变的均为4个字节,因为其存放的是地址。
2、定义指针变量时基类型是代表该指针变量所指向的变量所占的字节数。
3、变量的地址都是用该变量首字节的地址来表示的,例如ch变量的首地址是1000H则char * p = &ch则是通过基地址说明该地址的内容是属于ch变量的内容(因为char只占一个字节)。即1000H是ch变量的地址,这个地址里面存放的是ch变量的内容。