数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;
所以说没有一个地方存放数组名,可以认为程序没有给其分配空间,数组名只是代表了那个数组空间;
与指针不一样,指针指向一块空间,同时指针本身也存储在某个空间;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定义对数组名取地址是非法还是合法,所以因编译器而异,VC是合法的;
C编译器把数组看成是一个指向数组第一个元素的指针。而C利用取址运算符(&)返回变量的地址。如果对数组应用取地址运算符,C将返回数组的首地址。那么对数组应用取地址运算符是多余的。例如下面的例子:
void test()
{
//ociTest();
int nSID[] = {4,1,1,2};
char cChar[] = {'s','d','f','f','g','s',};
int p = nSID;
int q = &nSID;
printf("%d\n",p==q);
p = cChar;
q = &cChar;
printf("%d\n",p==q);
printf("%d\n",&nSID);
printf("%d\n",nSID);
printf("%d\n",*nSID);
printf("%d\n",&cChar);
printf("%d\n",cChar);
printf("%c\n",*cChar);
getchar();
}
运行上面的例子,其输出结果是:
1
1
1767492
1767492
4
1767476
1767476
s