指针引用int类型的问题
C语言中,一个int型占用四个内存单元,而每个内存单元对应一个内存地址,一个内存地址对应一个指针;那为什么只用一个指针指向一个占用四个内存单元的int,而不是用四个指针?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
C语言中,一个int型占用四个内存单元,而每个内存单元对应一个内存地址,一个内存地址对应一个指针;那为什么只用一个指针指向一个占用四个内存单元的int,而不是用四个指针?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(16)
一个指针变量,就可以访问整个内存地址空间了
因为指针的概念是给程序员用的,但是类型主要是写给编译器看的,编译器会帮你正确处理。
另外指针是变量,你可以改变指向内存地址,所以不用4个指针
不知道楼主所说的内存单元大小是一个字节,不过一个int型占用的内存大小不一定是4个字节,应该是由编译器决定
“一个内存地址对应一个指针” 这里好像也理解的不对,不是说每个内存地址都对应一个指针
很高兴,这个问题有这么多人关注~~
第一个问题 iBoxDB 解释得非常好.. 其实就是 Double,Float,Int,Char 型指针在 C 底层是怎么实现的问题,就是想知道“知其然,更要知其所以然”的问题。第二个问题,你发散得非常好,其实归纳起来就是虚拟地址和物理地址的关系,C的逻辑地址就是虚拟地址,通过MMU转换成物理地址,这样一个1G的程序才能在512M的物理内存上运行。
楼主, 指针是一种数据, 指向的空间是另一种数据。。哈。 “那为什么只用一个指针指向一个占用四个内存单元的int,而不是用四个指针?” 因为你说了, 指向“一个” 占用四个内存单元的int。。。
另外补充说一句,有两个概念一个是逻辑寻址宽度,例如32位,64位,以前24位的也玩过。 不过区别于后面的一个概念,可以说是“逻辑”的地址总线宽度。还有一个是数据总线的宽度。 例如32位上,你的一个结构体数据,总是4字节宽度对齐的。这个和地址宽度无关。编译器这么做,是方便降低操作复杂度。。哈。
指针的大小(或长度)是由地址总线决定的,只决定寻址范围,与内存单元大小无关。
在32位系统中,一个指针占用4个字节,即32位。这个指针的值在内存中占用四个字节(就是你说的内存单元),这四个字节一起才表示指针
指针是有类型的,比如int型指针,double型指针,不同类型的指针分别指向不同类型的数据,打个比方,你有两套房子,一套是80平的,一套是120平的,分别各有一把钥匙,那么虽然它们在本质上都是钥匙,但是它们的实质是不一样的。
是对应关系,不是只能表示 ~ 请看清描述问题后,再做回答,谢谢。
回复
什么对应啊,真逗,指针只是编译器翻译过程的一个符号表示,还对应,逗呢。翻译成汇编了,还哪来的指针?都是寄存器了。汇编再翻译成机器码,全是 0 1 了。
拜托,指针是符号。地址是内存空间位置。指针为什么只能表示一个单元位置呢。
thx,解答了我的疑惑
你可以使用4个指针做相同的事情,首先你要懂如何把一个4-byte的int打散为4个byte。#iBoxDB#.NET的底层序列化就是这样做的,因为不能直接在托管代码上使用指针,为了不调用机器码权限。
ptr[0] = a >>.. ptr[1] = a >>.. ptr[2] = a >>.. ptr[3] = a >>..
a = ptr[0] .. ptr[1].. ptr[2] ..ptr[3]
注:ptr[1] = ptr + 1; int a;
看完上面这么复杂的代码,你要感谢C指针帮你做的事情。