神奇的C语言二:数组名是什么

来源:互联网 发布:天猫交易实时数据 编辑:程序博客网 时间:2024/04/30 04:34
对数组名取地址得到的是什么?看一个例子:

int a[10];printf( "%d-%d", a, & a);


在VC++中测试结果是,输出的两个数相同,都是数组在内存中的首地址,即 & a[0]。

猜测:这里的&会被编译器忽略。a在内存中是不存在的,内存中的是a[0] a[1]....a[9],上述printf打印的a在编译的时候就被替换成了a在内存中的地址。因为a是概念上的,而非内存中的,所以自然不存在地址,也就无法对它使用取址符。但是编译器很聪明,会忽略&。

这个猜测对吗?

看下面的程序:

int main(){//queuef();int a[5] = { 1, 2, 3, 4, 5 };printf("%d,%d,%d\n", *(a + 1), *(&a + 1), a + 1);return 0;}
输出是什么呢? 求大神解答。

 


类似的问题:函数名是什么?

函数名是什么这个真的不重要,它只是一个编译时刻的概念,我们只需要按照正常的方式来编写程序即可!


如果您感兴趣,请继续阅读:

关于函数名会有很多奇葩的程序,例如:

void f(){printf("hello");}int main(){(***************f)();return 0;}

这是一个可以编译却”不正常“的程序 :)

记住编译规则就行:

一、编译器在处理 * funcName 时返回的还是 funcName;

二、编译器在处理 & funcName 时返回的是函数地址,一个unsigned int类型的符号常量值;

三、编译器在处理函数指针的取值和取址时的方式和一、二相同,即 * funcPointer 仍旧返回 funcPointer,& funcPointer 返回无符号符号常量。

有了上述规则,我们就容易理解为什么**********f是合法的,而&&&&&&&&&&f是不合法的了。

这只是编译器的处理规则,如果以后面试遇到这种变态题,相信您也可以自如应对了。


0 0
原创粉丝点击