指针引用int类型的问题

伤神 发布于 2016/09/02 10:46
阅读 398
收藏 2

C语言中,一个int型占用四个内存单元,而每个内存单元对应一个内存地址,一个内存地址对应一个指针;那为什么只用一个指针指向一个占用四个内存单元的int,而不是用四个指针?

加载中
1
iBoxDB
iBoxDB

你可以使用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指针帮你做的事情。

伤神
伤神
thx,解答了我的疑惑
0
jQer
jQer
拜托,指针是符号。地址是内存空间位置。指针为什么只能表示一个单元位置呢。
jQer
jQer
回复 @comedsh : 什么对应啊,真逗,指针只是编译器翻译过程的一个符号表示,还对应,逗呢。翻译成汇编了,还哪来的指针?都是寄存器了。汇编再翻译成机器码,全是 0 1 了。
伤神
伤神
是对应关系,不是只能表示 ~ 请看清描述问题后,再做回答,谢谢。
0
SVD
SVD
指针是有类型的,比如int型指针,double型指针,不同类型的指针分别指向不同类型的数据,打个比方,你有两套房子,一套是80平的,一套是120平的,分别各有一把钥匙,那么虽然它们在本质上都是钥匙,但是它们的实质是不一样的。
0
ked
ked
在32位系统中,一个指针占用4个字节,即32位。这个指针的值在内存中占用四个字节(就是你说的内存单元),这四个字节一起才表示指针
伤神
伤神
指针的大小(或长度)是由地址总线决定的,只决定寻址范围,与内存单元大小无关。
0
中山野鬼
中山野鬼

楼主, 指针是一种数据, 指向的空间是另一种数据。。哈。 “那为什么只用一个指针指向一个占用四个内存单元的int,而不是用四个指针?”  因为你说了, 指向“一个” 占用四个内存单元的int。。。

另外补充说一句,有两个概念一个是逻辑寻址宽度,例如32位,64位,以前24位的也玩过。 不过区别于后面的一个概念,可以说是“逻辑”的地址总线宽度。还有一个是数据总线的宽度。 例如32位上,你的一个结构体数据,总是4字节宽度对齐的。这个和地址宽度无关。编译器这么做,是方便降低操作复杂度。。哈。

伤神
伤神
第一个问题 iBoxDB 解释得非常好.. 其实就是 Double,Float,Int,Char 型指针在 C 底层是怎么实现的问题,就是想知道“知其然,更要知其所以然”的问题。第二个问题,你发散得非常好,其实归纳起来就是虚拟地址和物理地址的关系,C的逻辑地址就是虚拟地址,通过MMU转换成物理地址,这样一个1G的程序才能在512M的物理内存上运行。
0
伤神
伤神
很高兴,这个问题有这么多人关注~~
0
郑闯
不知道楼主所说的内存单元大小是一个字节,不过一个int型占用的内存大小不一定是4个字节,应该是由编译器决定
0
郑闯
“一个内存地址对应一个指针” 这里好像也理解的不对,不是说每个内存地址都对应一个指针
0
郑闯
另外指针是变量,你可以改变指向内存地址,所以不用4个指针
郑闯
一个指针变量,就可以访问整个内存地址空间了
0
xesam
xesam
因为指针的概念是给程序员用的,但是类型主要是写给编译器看的,编译器会帮你正确处理。
返回顶部
顶部