lomiss 发表于 2018-3-4 14:52:41

请教下C中地址的问题

本帖最后由 lomiss 于 2018-3-4 22:42 编辑

比如说定义一个数组int a={0,1,2};
那么编译器会给这个数组分配一个连续的内存空间。每一段内存空间占sizeof(int),假设是32位操作系统,也就是四字节。
我测试时,这个数组的首地址都是16进制的,假设为0xbe09ffec。那么问题就是。为什么a+1,下一个元素的地址是这个16进制数加上一个四字节等于0xbe09fff0?相当于这个四字节就是0x00000004,但两者所代表的意义不一样啊。
-------------------------------
感觉我自己是有点过于纠结了。其实我的意思是在数学上这两者根本上就没法相加。这个16进制的地址是这片连续内存的首地址,而每个内存单元占1Byte,想要访问这片内存中其他元素值,就要按sizeof(int)为步长进行偏移,这个偏移量的单位是字节,但是这个16进制的地址在32位操作系统下按单位应该是位(Bit)。这个类似于1000kg+1g=1001kg一样是行不通的呀。
可能我之前表述有问题,现在才开始学C语言,计算机很多底层的原理还搞不懂,还望大神具体解答什么原因?谢谢

angus 发表于 2018-3-4 15:32:12

没看明白问题,机制是编译器和机器内部设置好的,刚开始学习或者对计算机语言只是应用层面的话,建议不要去浪费时间深究这些。

风过无痕丶 发表于 2018-3-4 15:37:34

数据类型决定了指针的步长~
如你所说,数组分配的是一段连续的存储空间,
以你的 int a = {0,1,2} 为例他们在内存中申请了12字节的空间~换句话说~你把这个数组当做变量的批量管理。。你申请了三个int型的变量~ 这三个变量的名字分别为 a, a, a

BngThea 发表于 2018-3-4 16:50:54

没说代表同样的意思,一个是地址的差值,一个是数据本身

ba21 发表于 2018-3-4 19:21:51


a+1 地址加1并不是简单的 1+1这样数学上的加1。而是加1个数据类型的大小,相当于数学上的 a + sizeof(int)。
语法上是这么规定的。就好比你买东西要用钱一样。
那么问题就结了。
页: [1]
查看完整版本: 请教下C中地址的问题