注意:这篇文章上次更新于1557天前,文章内容可能已经过时。
This article was last updated1557 days ago, the content may be outdated.
再分享一道笔试题
1 |
|
问此程序的输出是多少?
错误答案是 2,1
正确答案是 2,5
哎,发现学的多了前面的知识点就忘没了,每天多线程多进程的,却连数组指针都忘记了。
知识点
本题考查的知识点是数组指针,网上的教程和博客通常把数组指针和指针数组一起介绍。我这里也就一起介绍了。
什么是数组指针?
指向数组的指针
首先,它是一个指针,指向的对象是数组。我们知道对一个对象取地址,可以得到这种对象类型的指针,因此,题目种对数组 a 取地址(&a)所得到的结果类型就是数组指针。这个数组指针所指向的对象数组的大小是5个int,因此,当这个指针加一的时候指针的偏移量是所指对象的大小(5个int),再将其强制转换为(int*)整型指针并赋值给变量 p ,此时 p - 1指向的就是元素 5 的地址。

那什么是指针数组呢?
元素是指针的数组
两者定义方式不同
1 | // 数组指针 |
二者的用途
首先说指针数组,因为这个的用途非常非常常见,毫不夸张地说,我们的每一个程序都显式或隐式的使用了它。😏
那就是主函数参数。
1 | int main(int argc,char* argv[]){ |
由于数组在函数传参的过程中会被弱化成指针类型,指针数组也是数组,所以也适用于这条规则,因此主函数的第一个参数传入数组长度。
指针数组在函数传参时会被弱化成二级指针,因此也有下面这种主函数写法。二者是等价的。
1 | int main(int argc,char** argv){ |
接下来说一下数组指针的用途,(说实话我也没想到什么场景一定要用数组指针),函数传参时可以使用数组指针。
比如说传递一个二维数组,就可以用传递一个指针的形式。
1 |
|
自测题
分别计算下列程序的输出 ,答案在最后
第一题
1 |
|
第二题
1 | // 64 位 |
第三题
1 | // 64 位 |
答案:
第一题
1 | 6 |
第二题
1 | 8 |
第三题
1 | 24 |
PS:64 位编译器下一个指针 8 个字节,一个 int 4 个字节。
以上答案为 OnlineGDB 的运行结果,不同环境下运行结果可能不同,主要是指针大小的不同。
欢迎留言指出文中错误之处。


