博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++经典面试题
阅读量:6466 次
发布时间:2019-06-23

本文共 750 字,大约阅读时间需要 2 分钟。

 

1、指向数组的指针 和 指向数组首元素的指针

2018-03-07

昨天在牛客上看到这么一道C语言面试题,挺经典的,特来分享给大家。

程序如下,问输出结果

#include 
int main (){ int a[5] = {
1,2,3,4,5}; int *p = (int*)(&a + 1); printf("%d %d" , *(a + 1), *(p - 1));}

*(a+1)其实很简单,指的就是a[1],输出2,没问题。关键就在于这个第二个输出*(p-1)是多少?

学过C语言的都知道,数组名就是指向数组首元素的指针,那么对数组名进行取地址操作得到的是什么呢?对数组名 a 取地址得到的是指向数组的指针!!!(注意:不是指向数组首元素的指针)。也就是说 &a 是数组指针,类型为 (int*)[5],而指针加一要根据指针的类型进行偏移,&a 是长度为5的 int 数组指针,所以需要偏移 5 * sizeof(int),所以也就是 a[5] 的位置,另外需要注意 p(&a + 1)类型是不一样的,这点非常重要,所以p - 1只会减去 sizeof(int*)a&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]

ps:a是 int 型指针,&a 是 int[] 型指针

到这里,答案也就不言而喻了,输出结果分别为 2和 5。
持续更新
 

作者:耑新新,发布于  

转载请注明出处,欢迎邮件交流:

转载于:https://www.cnblogs.com/Amedeo/p/8525422.html

你可能感兴趣的文章
PHP实现微信退款的分析与源码实现
查看>>
nrf2401 - 最廉价的2.4G无线通信方案
查看>>
easyui传入map的数据前台展示出tree格式数据
查看>>
悲观的思考,乐观的生活.我们既需要思考的深度,也需要生活的温度!
查看>>
java.math.BigDecimal
查看>>
解决linux下/etc/rc.local开机器不执行的原因。
查看>>
Vitamio中文API文档(4)—— VitamioInstaller
查看>>
河内之塔
查看>>
图像处理之基础---内窥镜医学图像增强
查看>>
yii框架常用url地址
查看>>
python3.4学习笔记(十六) windows下面安装easy_install和pip教程
查看>>
MyGUI 解析
查看>>
Linux中的ls命令详细使用
查看>>
graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
查看>>
graph-tool 练习
查看>>
easyui treegrid逐步加载
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
<转>Python: __init__.py 用法
查看>>
Linux Curl命令
查看>>
046 SparlSQL中的函数
查看>>