先看下面的例子:
1 |
int a[ 5 ]; |
1.内存布局的示意图
所有人都明白这里定义了一个数组,其包含了5个int型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素,那么这些元素的名字就是a[0],a[1]…吗?看下面的示意图:
如上图所示,当我们定义一个数组a时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a一旦与这块内存匹配就不能被改变。a[0],a[1]等为a的元素,但并非元素的名字。数组的每一个元素都是没有名字的。
2.利用sizeof来研究数组的内存结构关系
那现在再来解决sizeof关键字时的几个问题(本文最下方的参考书): (我想起了王泽梁老师给我们上数据结构课时,介绍数据类型data type的概念:定义了一些数据data,以及基于这些数据的操作operation。)
1
2 |
sizeof(a)的值为sizeof( int )* 5 , 32 位系统下为 20 。 sizeof(a[ 0 ])的值为sizeof( int ), 32 位系统下为 4 。<br>sizeof(a[ 5 ])的值在 32 位系统下为 4 。 |
sizeof(a[5])的值在32位系统下为4。并没有出错,为什么呢?
因为这里肯定没有访问a[5]这个元素,sizeof只是获取a[5]类型,而对于a[5]的内容不感兴趣。
sizeof是关键字不是函数。函数求值是在运行的时候,而关键字sizeof求值是在编译的时候。虽然并不存在a[5]这个元素,但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其值。所以这里使用a[5]并不会出错。
1 |
sizeof(&a[ 0 ])的值在 32 位系下为 4 ,这很好理解。取元素a[ 0 ]的首地址。计算a[ 0 ]的首地址的长度。 |
1 |
sizeof(&a)的值在 32 位系统下也为 4 ,这也很好理解。计算数组a[]的首地址的长度。陈正冲老师VC++老师上做了测试,结果是 20 。 |
3. 省政府和市政的区别----&a[0]和&a的区别
数组首地址 VS 数组首元素的首地址
湖南的省政府所在地 VS 长沙的市政府所在地
这里&a[0]和&a到底有什么区别呢?a[0]是一个元素,a是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。前者是数组首元素的首地址,而后者是数组的首地址。举个例子:湖南的省政府在长沙,而长沙的市政府也在长沙。两个政府都在长沙,但其代表的意义完全不同。这里也是同一个意思。
这个经典例子来源陈正冲老师。
参考:陈正冲老师的《c语言深度剖析》。
原文:http://www.cnblogs.com/haore147/p/3647211.html