C语言中关于指针的字节问题
char *p=&ch;
sizeof(p)=4;
一个指针变量,无论他指向的变量占几个字节该指针变量本身只占4个字节
一个变量的地址使用该变量首字节的地址来表示。
我想请问 一个字节占8位,为什么要用32位(即4个字节)来表示呢。8位都可以把这个状态表示完全了呀 展开
提问者的理解稍微有一点误区。指针了类型是4个字节(32位),没错,当然这和系统有关,暂不讨论这个问题。int类型我们也按照4个字节来看待。
图中p是一个指针类型的变量,a是一个整型的变量,他们所占的空间都是4个字节,是方框表示的大小。但是提问者的误区在这里,指针变量里面存放的是什么?虽然它是一个指向int变量的指针,但它存放的不是int变量,而是整形变量的地址0008!(记住指针变量存放的是变量的地址,而不是变量本身,所以指针变量p的空间大小和指针变量指向的内容a的空间大小没关系,和你所使用的系统的地址空间有关)
这样就有出现了一个问题,我也不知道指针变量要给多大才够啊,四个字节够吗?怎么判断指针类型的大小够不够呢?这和系统相关,语言设定的指针变量的空间的位数要能够足够表示内存地址的个数。
举个例子,假设你的内存是512字节的,就是512的地址需要区分(小了点,解释方便)。那么也就是说你的内存是从0到511(0000 0000 - 1111 1111)(以下说明为了简单,不考虑复杂的寻址方式,也不区分片内地址,看不懂可以略过,主要是怕有人产生疑惑,假设寻址的时候地址和物理地址是一一对应的关系)。如果你说指针变量为1位,那么你觉得可以吗?1为只有0和1两种状态,只能表示两个地址其他510个呢,怎么能表示512个地址呢!4位,很显然只能表示16个地址(0-15)。
因此,你提问中的指针变量为什么要用32位,这和一个字节是8位没有关系,要看你内存的地址空间有多大,最少指针变量的空间要能够表示整个地址空间。假如未来内存变得很大很大,现在的32也不一定够用。
上面举得那个512字节的地址的例子,可能有人会自己去算去,我的内存是1G,2G,4G,那么我的指针变量为什么也是四个字节呢?我只能说一定是够的,只不过像我刚才声明的那样,计算机的实际的寻址方式并不是我们想象的那么简单,并不是单纯的一对一的关系,涉及到片选和片内地址的为问题,二者是不同的,如果想学习的话,可以看下计算机组成原理方面的书籍。