zoukankan      html  css  js  c++  java
  • 数组的输出

    题目是:

    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)<<endl;
    cout<<***a<<endl;
    

      输出: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;//越界输出垃圾值
    

      

  • 相关阅读:
    一段自己写的丑陋的表单验证代码
    简单的星级评价
    有个项目
    好久没写了,重装了系统重新配置的Live Writer,看看效果:
    XmlHttpRequest调用Webservice的一点心得
    局域网共享怎么设置?我想把其中一个电脑的F盘共享?
    TCP/IP协议详解
    input file实现多张图片上传
    .NET C#中如何备份SQL数据库
    CSS中cursor鼠标形状属性列表
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/9860336.html
Copyright © 2011-2022 走看看