来自异界的飞猪 发表于 2019-9-21 21:10:28

《带你学C带你飞》的S1E29

#include <stdio.h>

void func(int b[]);

void func(int b[])
{
      printf("%d\n", b);
}

int main(void)
{
      int a = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12}
      };

      func(a);

      return 0;
}


怎么就输出了9???求大神详解

jackz007 发表于 2019-9-21 21:49:11

      二维数组

      int a = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12}
      };

    在内存中是连续存放的,与以下一维数组存储方式完全一样:
      int a[] = {
                {1, 2, 3, 4, \
                {5, 6, 7, 8, \
                {9, 10, 11, 12 \
      };

    同样的道理,在函数 func() 中,如果把 a 视为末维为 3 的二维数组 b,则 b[2][2] 应当对应于 a2 + 2] = a = 9

来自异界的飞猪 发表于 2019-9-22 08:04:35

jackz007 发表于 2019-9-21 21:49
二维数组




为什么对应末维属于是3就是3×2+2,能再给我解释下吗

jackz007 发表于 2019-9-22 10:53:54

本帖最后由 jackz007 于 2019-9-22 10:59 编辑

来自异界的飞猪 发表于 2019-9-22 08:04
为什么对应末维属于是3就是3×2+2,能再给我解释下吗

      末维为 4 的二维数组

      int a = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12}
      };

    可以视为一维数组:

      int a[] = {
                1, 2, 3, 4, \
                5, 6, 7, 8, \
                9, 10, 11, 12 \
      };

    同样可以视为另一个末维为 3 的二维数组:

      int a = {
                {1, 2, 3}, \
                {4, 5, 6}, \
                {7, 8, 9}, \
                {10, 11, 12}
      };

   因为这三种不同形式表达的数组,在内存中的存储映像是完全一样的。

   在新的二维数组中,a 的值是 9 是不是就顺理成章了, 3×2+2 的索引算法也不难理解了吧。

来自异界的飞猪 发表于 2019-9-22 11:38:58

jackz007 发表于 2019-9-22 10:53
末维为 4 的二维数组




太感谢了
页: [1]
查看完整版本: 《带你学C带你飞》的S1E29