你C++ 的IQ 有多少?

 
Okay, 在论坛上我看到过这样一道C++的面试题:
如何将int* (*p)[10] 初始化?
a) int* (*p)[10] = new int(*)[10] [10]
b) int* (*p)[10] = new int*[10][10][10]
c) int* (*p)[10] = new int*[10][10]
哈哈,很好的一道题,考察很多的知识点,最重要的考察你C++ 的IQ。
其实这道题一点都不难。
这究竟是几维数组?1,2还是3?答案是2.为什么?我们先把 () 去掉得到如下表达式int* * p[10]。因为[]操作符的优先级比*高,所以我们现在看到的是一个一维数组p[10],它的Type是int **.所以()的作用很明显了提高 * 的优先级别使p与它结合。那么还记得如何define一个数组么?
Int *p = new int [10];
现在我们的结果比较清楚了,那么看起来(*p)是一个一维数组的定义 + [10]很明显就是一个2维数组了。
Put it all together:
Int* (*p)[10]的意思是定义一个2维数组,这个数组的Type是int *. C是答案
So, the key is:
理解如何声明一个数组,以及运算符的优先级。
那么既然理解了理论,就一起应用一下。比如说,我现在要声明一个指向一个返回整数的函数的指针:
Int *pFun(string a, string b);
这样对么?答案是不对,一定要注意* 的优先级。*是左结合的,现在的定义是一个叫做pFun的函数返回一个Int *
正确的方式:
Int (*pFun)(string a, string b);
那么我如何声明一个叫做char* 的数组,答案如下:
char* *p = new char* [10];
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值