※ 引述《lalaboom (lalaboom)》之铭言:
: 标题: [问题] 对阵列名称取址
: 时间: Tue May 12 19:54:31 2015
:
: 之前我的认知阵列名称是一个常数指标,非指标常数喔,
:
: 1. 请问这个叙述对吗?
:
: 现在有阵列 int b[2]; int a[2][3];
:
: 2. 请问为什么 b 跟 &b 两个address会一样呢?
: 我可以理解 a, a[0], &a[0][0] 这3个一样,
: 但是type不同,还是说这个认知也是错的XD
:
: 3. 阵列在内存里面除了宣告出来的连续空间,
: 阵列名称是否会有另外像宣告指标一样有一个变量空间吗?
:
: 关于2之前好像有看到说&b = b 是定义好的 (compiler ? )
这些问题好像有许多的初学者都很困惑,
虽然明天我要考可怕的偏微分段考已经自顾不暇了,不过还是想回答一下。(笑
站在C语言本身的角度,阵列本身不是一个指标,它就是一个单单纯纯的阵列。
站在机器的角度,阵列占据了内存一段连续的空闲,并且有个变量记录了它的位置。
但是这个变量不是程式设计师可以直接获得的,它需要进行转换才能获得。
先说说第二个好了:
b 跟 &b 的地址不一样,简单地说, &b 的地址并不存在,而且对编译器来说是非法的。
因为当你在写单独一个 b 的时候, b 已经被隐式转换成指标型态,而且这是被强制的。
在且 b 是一个右值(r-value),意思是你不能对此作取址的动作。
根据 ISO 文件 §4.2.1 Standard Conversions: Array-to-pointer conversion
An lvalue or rvalue of type "array of N T" or "array of unknown bound of T"
can be converted to an rvalue of type "pointer to T." The result is a pointer
to the first element of the array.
接下来的第三个也是一样,
阵列名称有占空间吗?结果呼之欲出,当然不占。因为阵列名称(b)是右值,并不占空间。
可是你一定会很好奇不占空间的话你的程式要如何知道阵列在哪?
这件事很妙,站在C语言的角度并不占空间,但是实作上办不到,所以当然要占空间。
只是这个变量不是你的程式可以 access 的,它被编译器巧妙地包装了。
这样很矛盾吗?
其实,不。
因为程式语言本身定义的是语法结构,并不是实作的内容。
因此一个程式语言可以有很多种编译器,像是 GCC C Compiler, MSVC etc.
如有错误欢迎指正。
( ̄▽ ̄#)=﹏﹏ 飘走=