关于普通变量和数组元素地址的讨论
当我们在画数组的时候,往往是把数组的元素画得一个挨一个,紧挨在一起的。
实际情况究竟是否如此呢?需要给出证明。
为了说明我们的证明,先要明确:
- 两个相关的概念:“变量的地址”和“变量的值”
- “求地址”的运算符
看下图,说明了“变量的地址”和“变量的值”之间的区别:
你可能会奇怪,为什么相邻的2个内存单元之间地址间隔4?原因如下:
- 地址的单位是字节(Byte)
- 我们假设每个内存单元存储的都是int类型的数据
- 每个int变量的需要4个字节的存储空间(可以用int i; printf(“%d”,sizeof(i));来证明)
再看一段相关的代码:
0001 # include "stdio.h"
0002 int main() {
0003 int i;
0004 i=1;
0005 printf("i=%d\n",i);
0006 printf("i的地址:%d",&i);
0007 return 0; 0008 }
会不会觉得这里的&i很熟悉?我们常用的scanf(“%d”,&i);就有这种用到这种&i的表达式。&i表示的是计算变量i所处的内存地址。
所以printf("i的地址:%d",&i); 打印的就是以十进制整数形式所表示的“i所处的内存地址”。
Tiny C Compiler的一次运行结果如下:
D:\temp>tcc -run code1.c
i=1
i的地址:2292520
这里所展示的变量i的地址,随着多次运行,是会发生变化的。不信?运行一次以后,重启电脑,再运行一次,看看i的地址会不会变?
下面我们用一段代码来验证
这10个数组元素的地址之间是否是相邻的:
0001 # include "stdio.h"
0002 int main() {
0003 int a[10],i;
0004 printf("每个数组元素占%d个字节。\n",sizeof(a[0]));
0005 printf("起始地址\t值\n");
0006 for (i=0; i<=9; i=i+1) {
0007 printf("%d\t\t%d\n",&a[i],a[i]);
0008 }
0009 return 0;
0010 }
运行的结果如下:
D:\temp>tcc -run code2.c
每个数组元素占4个字节。
起始地址值
22924844266160
22924882292512
22924924266201
22924964143320
22925004329261
2292504207
22925084143320
22925122292552
22925164280461
22925204143320
注意,运行的结果证明了如下事实:
- 每个int元素占4个字节
- 相邻两个元素之间的内存起始地址相差4个字节。也就是说,相邻的两个元素在内存中确实是“紧紧靠在一起”的。
- 未初始化的数组,其元素的值是不确定的。