一个C语言的指针问题 望大神详细解答下~谢谢

#include <stdio.h>

int main(int argc, char *argv[])
{

    int a[4]={1,2,3,4};
    int * ptr1 = (int *)(&a+1);
    int * ptr2 = (int *)((int)a+1);
    printf("%x %x \n",ptr1[-1],*ptr2);  
    return 0;
}

如上一段代码~ 就是对于 这个 *ptr2为何在小端模式等于0x20000000 大端等于0x100

如图请输入图片描述
这个内存模式我能画出来 就是 怎么得来最后的数字的 不明白 -。- 是不是有点太二啊 咳咳 求大神讲讲

还附加一个小问题

int a[3][2]={(0,1),(2,3),(4,5)};
int *p;
p=a[0];
p[0]=1; //这个怎么得来的 这个二维数组是怎么看的 只看小括号里面的右边的数字吗?
阅读 3.7k
1 个回答

小端错了,应该是0x02000000

如果是小端的话,数组在内存中是这样分布的:
低地址----------------------------------------------------->高地址
01 00 00 00|02 00 00 00|03 00 00 00|04 00 00 00

*ptr2在内存中就是这样的:
低地址------>高地址
00 00 00 02

因为是小端,所以低位存低地址,高位存高地址
高位 低位
02 00 00 00
所以得出来的值就是:0x02000000

如果是大端的话,就很直观了:
低地址----------------------------------------------------->高地址
00 00 00 01|00 00 00 02|00 00 00 03|00 00 00 04

*ptr2在内存中就是这样的:
低地址------>高地址
00 00 01 00

因为是大端,所以高位存低地址,低位存高地址
高位 低位
00 00 01 00
所以得出来的值就是:0x00000100

小问题:其实就是考逗号运算符,数组实际上是:int a[3][2] = {1,3,5};

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题