指针和数组
程序员文章站
2022-06-03 18:24:25
...
转载http://kan.weibo.com/con/3512394345711963
C程序:考考你(04) 一、取材于某著名公司的软件人员面试题,请问下面程序的输出结果是什么: #include <stdio.h> int main(void) { int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a+1); printf("%d, %d", *(a+1), *(ptr-1)); return 0; } 答案:2, 5 二、理由解释: (1) a是数组首地址,也就是a[0]的地址,(a+1)是数组下一元素的地址,即a[1]的地址,因此*(a+1)就是a[1]的值。 (2) &a是对象首地址,该对象是5个int长度的类型,(&a+1)是对象地址加一,即对象首地址加了5个int的长度,因此(&a+1)是a[5]的地址。 注:换个写法是否能有助理解。 #include <stdio.h> int main(void) { int a[5] = {1,2,3,4,5}; int (*ptr)[5] = &a; ptr++; printf("%d, %d", *(a+1), *((int *)ptr-1)); return 0; } 三、我的提示: 不同类型的指针加一之后其地址增加的值是不同的,char型指针加一地址增加1,int型指针加一地址增加4,int (*)[5]型指针加一地址增加5个int长度,即20。由此可知对指针进行代数运算是有风险的,因此即将颁布的国军标《军用软件C/C++语言安全子集》中有建议准则“5.3.2.3 谨慎对指针进行代数运算”。
推荐阅读
-
开源作品-PHP写的JS和CSS文件压缩利器-SuMinify_PHP_1_5,
-
详细解读PHP $_FILES数组的内容_PHP教程
-
PHP数组性能
-
python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现
-
最简单的nginx+ftp搭建图片服务器(Windows Server服务器环境下和本机都可以用)
-
【Canvas】用canvas画出二次贝塞尔和三次贝塞尔图
-
opencv仿射变换和透视变换门牌号实践总结
-
asp.net汉字转拼音和获取汉字首字母的代码
-
关于WCF数据契约和序列化的疑惑
-
在Docker上用Nacos1.3容器连接MySQL5.6和8.0.18容器进入持久化的具体操作(Nacos单机版)