C,是一种信仰

关于普通变量和数组元素地址的讨论

当我们在画数组的时候,往往是把数组的元素画得一个挨一个,紧挨在一起的。

image

实际情况究竟是否如此呢?需要给出证明。

为了说明我们的证明,先要明确:

  1. 两个相关的概念:“变量的地址”和“变量的值”
  2. “求地址”的运算符

看下图,说明了“变量的地址”和“变量的值”之间的区别:

image

你可能会奇怪,为什么相邻的2个内存单元之间地址间隔4?原因如下:

  1. 地址的单位是字节(Byte)
  2. 我们假设每个内存单元存储的都是int类型的数据
  3. 每个int变量的需要4个字节的存储空间(可以用int i; printf(“%d”,sizeof(i));来证明)

再看一段相关的代码:


0001 # include "stdio.h"

000
2
int main() {
000
3
int i;
000
4
i=1;
000
5
printf("i=%d\n",i);
000
6
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的地址会不会变?

下面我们用一段代码来验证

image

这10个数组元素的地址之间是否是相邻的:

0001 # include "stdio.h"

0002 int main() {
0003 int a[10],i;
0004 printf("每个数组元素占%d个字节。\n",sizeof(a[0]));
000
5
printf("起始地址\t值\n");
0006 for (i=0; i<=9; i=i+1) {
000
7
printf("%d\t\t%d\n",&a[i],a[i]);
0008 }
000
9
return 0;
0010 }

运行的结果如下:

D:\temp>tcc -run code2.c
每个数组元素占4个字节。
起始地址       
2292484         4266160
2292488         2292512
2292492         4266201
2292496         4143320
2292500         4329261
2292504         207
2292508         4143320
2292512         2292552
2292516         4280461
2292520         4143320

注意,运行的结果证明了如下事实:

  1. 每个int元素占4个字节
  2. 相邻两个元素之间的内存起始地址相差4个字节。也就是说,相邻的两个元素在内存中确实是“紧紧靠在一起”的。
  3. 未初始化的数组,其元素的值是不确定的。
posted @ 2011-01-21 21:57  胖乎乎的王老师  Views(771)  Comments(0Edit  收藏  举报
Email 联系我:fzd19zx@qq.com