zoukankan      html  css  js  c++  java
  • c语言--二维数组的首地址问题

    对于一个二组数组int a[3][4],以下几个地址值是相等的,但是地址类型不尽相同:

    1)a

    2)a[0]

    3)*(a+0)

    4)*a

    5)&a[0][0]

    int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    printf("%x,%x,%x,%x,%x ", a, (int *)a, *a, a[0], &a[0][0]);

    结果如下:

    把上面的地址各+1:

    printf("%x,%x,%x,%x,%x
    ", a + 1, (int *)a + 1, *a + 1, a[0] + 1, &a[0][0] + 1);

    再看结果:

    只有a对应的地址增加了16个字节(4个int),其余的都增加4字节(1个int)。

    为什么a+1的值会跟其它的不同?

    这是因为a的指向的是二组数组a第一行的地址,每行有4个元素。用指针来定义应该是:int (*p)[4] = a;

    看其内存结构:

    再来看遍历数组的写法:

    // 不能用int *p = a (在cpp中)
    //取首地址正确用法:    1)int (*p)[4];p = a;
    //                    2)p = (int *)a;
    //                    3)p = *a;
    //                    4)p = a[0];
    //                    5)p = &a[0][0];
    for (int *p = (int *)a; p < &a[0][0] + 12; p++)
    {
        printf("%d ", *p);
    }        

    结果:

  • 相关阅读:
    Uva455
    PAT乙级1059
    PAT乙级1092
    PAT乙级1076
    PAT乙级1065
    PAT乙级1049
    Uva1586
    《肇造区夏》读后感 读书笔记
    《老鼠虱子和历史》读后感 读书笔记
    《胡适口述自传》读后感 读书笔记
  • 原文地址:https://www.cnblogs.com/wobuchouyan/p/4809717.html
Copyright © 2011-2022 走看看