博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组的输出
阅读量:4705 次
发布时间:2019-06-10

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

题目是:

int a[2][2][3]= { {
{1,2,3},{4,5,6}},{
{7,8,9},{10,11,12}}};int *ptr=(int *)(&a+1);printf(“%d %d”, *(int*)(a+1), *(ptr-1));

  输出结果为: 7 12

解析 先看两个公式&a+i=a+i*sizeof(a); a+i=a+i*sizeof(a[0]);

int *ptr=(int*)(&a+1);首先是指向数组a的最后一个元素的下一位,接着是用(int*)进行类型转换,把三维数组转换为一维数组,这是后ptr指针指向的就是一个一维数组

那么在接下来输出*(ptr-1)的时候指针往前移动一个元素,

*(int*)(a+1); (a+1)相等于a+sizeof(a[0])=a+6,此时a+6指向的是元素7,接着是(int*)把(a+1)从三维数组转换为一维数组,最后是地址解析输出结果,如果不用(int*)也可以直接用***即*(int*)(a+1)等价于***(a+1)

 

在上面题的基础上增加两条输出语句:

cout<<**(*a+1)<
<<***a<

  输出:4 1

int a[2][2][3] = { { { 1,2,3 },{ 4,5,6 } },{ { 7,8,9 },{ 10,11,12 } } };	cout << ***a << endl;//输出1	cout << *(**a + 1) << endl;//输出2	cout << *(**a + 2) << endl;//输出3	cout << *(**a + 3) << endl;//这个是会输出4的,原因是此时我们每加1指针就会向后移动四个字节的地址大小,而数组又是顺序存储的所以每增加四个字节就会移向下一个元素	cout << *(*(*a + 1)) << endl;//输出4	cout << *(*(*a + 1)+1) << endl;//输出5	cout << *(*(*a + 1) + 2) << endl;//输出6	cout << *(*(*a + 1) + 3) << endl;//此时是会输出7的,原因同上面讲的一样,此时也是指针每次只移动四个字节的地址大小...	cout << *(*(*(a + 1))) << endl;//输出7	cout << *(*(*(a + 1)) + 1) << endl; //输出8	cout << *(*(*(a + 1)) + 2) << endl;//输出9	cout << *(*(*(a + 1)) + 3) << endl;//输出10道理同上	cout << *(*(*(a + 1) + 1)) << endl;//输出10	cout << *(*(*(a + 1) + 1) + 1) << endl;//输出11	cout << *(*(*(a + 1) + 1) + 2) << endl;//输出12	cout << *(*(*(a + 1) + 1) + 3) << endl;//越界输出垃圾值

  

转载于:https://www.cnblogs.com/wuyepeng/p/9860336.html

你可能感兴趣的文章
ASP.NET Web API路由规则(二)
查看>>
怎么用mingw运行c程序?
查看>>
040 Android TCP协议的Socket通信
查看>>
KMP模板(HDU1711)
查看>>
企业级电商一般包括哪些模块总结
查看>>
研究下
查看>>
配置react+webpack+es6中的一些教训
查看>>
python中的内容编码
查看>>
Codefoeces 734F. Anton and School 数学
查看>>
斐波那契查找法
查看>>
java 22 - 23 多线程之定时器的概述和使用例子
查看>>
我们都爱大长腿
查看>>
实验10:Problem G: STL——多重集的插入和删除
查看>>
相邻最大差值
查看>>
WebBrowser 加载网页
查看>>
xcode 8 重新支持插件
查看>>
6-12 SVM小结
查看>>
ABOUTCG发布Maya 刚体特效完全教程
查看>>
单例模式
查看>>
Codeforces Round #485 (Div. 2)
查看>>