对数组名取地址得到的是什么?看一个例子:
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是不合法的了。
这只是编译器的处理规则,如果以后面试遇到这种变态题,相信您也可以自如应对了。