C语言 指针占4个字节 指针应该包含了一个数据地址 那这个数据地址占多大 我书上说是一个字节 。。。。

但书上又说32位的CPU可识别的数据地址在0-(2^32-1) 那不是数据地址是0到4个字节的大小 指针包含的数据地址到底有多大 我是新手可能理解有问题 求详解

举例来说。指针值为x,则从地址x开始,包含了一个指针指向的值,它可以是一个整数,字符,字符数组等,具体有多大得看定义:

int* p; 这个指针指向了一个4字节大小的整数。
---------------------------
第二、指针大小为4个字节时,它就可以索引4g范围中任何一个值。
第三、指针这4个字节自然也在内存中的,但它可以不由其他指针指向,否则就没完没了了。它的相对位置在编译时已经确定了,程序从main起点执行后,只要访问这个相对位置,取出其中的值,就可以找到指针包含的内容。反映到汇编上,就是有无 [ ] 的区别了。
第四、32位cpu,这是说它一次访问内存取回数据的能力。现在的cpu虽然有很多是标注32位的,实际上总线已经扩大到40位以上了,只是操作系统不支持,所以也只能一次访问32位。
--------------------------

总结一下,在32位编程环境下,你不妨把指针看成32位的。它的值加在基址上,就是这个指针的管辖范围了。因为这个基址是可变的,理论上可以管辖大于4g的空间,但要硬件支持,也就是地址总线必须超过32位。同时指针也要受到权限的限制,就像你伸手进银行的窗口,人却未尽进得去一样,操作系统会提示一般保护性错误。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-28
虽然数据地址只占一个字节,但给指针分配的内存空间是4个字节。因此整型的单位就是4个字节。
第2个回答  2011-08-28
int *p=NULL
sizeof(*p) 查看*p的大小 是4个字节

搞错 不是sizeof(*p) 这个是int 的类型

应该是sizeof(p)
抱歉~
第3个回答  2011-08-28
某些情况下,指向成员函数的指针长达16字节。
说四字节,主要是一些指针寄存器是四字节的,但寻址可以同时用两个指针寄存器。
CPU地址线的数目也不一定与寄存器位数相等的。
所以16位8086按理说只能用64K内存但别人却可以直接寻址1MB内存。
同理32位系统使用8G内存也是可能的。
底层的细节与硬件设计与操作系统是有关的。
所以讨论指针是多少字节是没有意义的,你问编译器就知道了:sizeof(Pointer)。

不过呢,你想作优化就不得不考虑指针大小。但这个和硬件是无关的,一般只和编译器有关。有篇论文好像叫《C++实现的最快委托》就讨论这个问题,你可以去烟酒一下。
第4个回答  2011-08-28
在32为机器上的确是占用四个字节
第5个回答  2011-08-28
一个指针大小确实只有4个字节(某些机器上也不是),但是指针可寻址范围是0-(2^32-1)
相似回答