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

对数组名取地址得到的是什么?看一个例子:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值