代码之家  ›  专栏  ›  技术社区  ›  user1122069

多维数组是否通过临时指针访问?

c
  •  0
  • user1122069  · 技术社区  · 7 年前

    我读到数组下标访问与指针下标访问相同(找不到正确的链接,但是 http://c-faq.com/aryptr/joke.html 间接提到这一点)。

    那么多维访问呢?显然,多维数组中没有指向c[0]的指针。

    #include <stdio.h>
    
    int main(){
        char c[5][2][4];
        c[1][1][2] = 'n';
        printf("\n%c", c[1][1][2]);
        char* ptr = c;
        printf("\n%c\n", ptr[1*8+4*1+2]);
    }
    

    但是它引用的任何东西(在三维数组[d1][d2][d3]中)的大小都是d2*d3,因为这是虚指针偏移的地方。

    是否有文件说明这是如何实现的,或者如何解释?在2D的情况下,它只是一个指针是有意义的,但对于3+的情况,不清楚指针是否/如何工作。

    3 回复  |  直到 7 年前
        1
  •  2
  •   StoryTeller - Unslander Monica    7 年前

    似乎你不需要听到“数组是伪装的指针”谎言的揭穿。所以我不再重复了。但我只想说,是的,所有的索引都是通过指针进行的。当你写作时 c[0] , c 衰减为指针以建立索引 *(c + 0)

    但你问的是什么?当然是指向数组的指针。你可以形成这些。例如:

    char d[2][4];
    char (*ptr)[2][4] = &d;
    

    在这里 ptr 大堆 类型 char[2][4] C 衰变为。这就是为什么C语言中的多维数组学派不太精确的原因。我们没有这些,我们只有阵列 属于 数组。

        2
  •  2
  •   GermanNerd sneha maganahalli    7 年前

    全数组表达式 指针。若使用了所有的下标,那个么生成的指针将被取消引用;任何其他求值表达式将只生成一个指针值。

    所以,是的,你可以 原因 就好像数组访问产生一个临时指针一样。

        3
  •  0
  •   Lundin    7 年前

    With arrays, why is it the case that a[5] == 5[a]? . 这是一种“偶然”允许的替代语法,以保持语言的一致性,而不是其他。

    它与容器类型无关,您可以对指针对指针执行与多维数组相同的隐晦技巧。例子:

    #include <stdio.h>
    
    int main (void)
    {
      char str[2][2][6] =
      {
        {"hello", "world"},
        {"foo",   "bar"}
      };
    
      printf("%c\n", str[0][0][0]); // print h
      printf("%c\n", 0[0[0[str]]]); // print h  (bad code, don't do this)
    }
    

    ptr[1*8+4*1+2] 另一种情况是,多维数组保证连续分配。这在C17 6.2.5/20中有规定:

    数组类型 描述一组连续分配的非空对象,其中包含 特定的成员对象类型,称为 元素类型

    至于“假想指针”,如何在机器代码中访问数组取决于编译器。有时使用直接地址更有效,有时使用基址+偏移量。这是一种程序员不必担心的自动优化。