【问题标题】:How to use pointer to multi dimentional array in C language?如何在 C 语言中使用指向多维数组的指针?
【发布时间】:2017-08-16 06:57:08
【问题描述】:

我有二维数组

char arr[2][3]={"sam","ali"}

和指向这个数组的指针

char(*ptr)[3]=arr;

如何使用此指针打印arr[2][2],在本例中为i。 我已经尝试过* (*(ptr+1)+2),就像我处理数组的方式一样,但没有奏效,所以任何人都可以帮助并告诉我在这种情况下如何处理指向数组的指针以打印元素[2][2]

【问题讨论】:

  • 避免在 C 中使用多维数组。考虑使用flexible array members 来实现自己的矩阵抽象数据类型,例如here
  • 在使用字符串和固定大小的数组时要小心,您必须记住,三个字符的字符串确实需要 四个 字符的空间,以包含终止空字符 @ 987654329@.
  • 请注意,"sam" 实际上需要 4 个字节,因为它包含字符串终止字符

标签: c multidimensional-array pointer-to-array


【解决方案1】:

您不应该打印arr[2][2],因为您访问的数组越界。另请注意,'\0' 字符没有空间存储在给定数组中。

char arr[2][4] = {"sam","ali"}  
char(*ptr)[4] = arr;

使用ptr,您可以将arr 的元素作为ptr[1][2] 访问。

【讨论】:

    【解决方案2】:

    这个:

    char(*ptr)[3]=arr;
    

    不是指向多维数组的指针,它是指向大小为3的一维数组的指针。但这很好,因为指针也总是可以指向它所指向的类型的 array。所以你有ptr 指向一个大小为3 的一维数组的数组。到目前为止,只是为了澄清条款。

    您的直接问题只是错误的索引。索引基于0,而不是1,因此使用

    char arr[2][3]={"sam","ali"}
    

    arr 的第一个维度的有效索引只是 01。您要查找的元素位于 ptr[1][2]


    在您的问题中使用 指针算术表示法,您实际上拥有正确的索引,因此在 这种 情况下我看不出您的问题出在哪里。以下将按预期打印i

    #include <stdio.h>
    
    int main(void)
    {
        char arr[2][3]={"sam","ali"};
        char(*ptr)[3]=arr;
        printf("%c\n", *(*(ptr+1)+2));
    }
    

    请注意,这完全等同于更易读的ptr[1][2]


    旁注:如果您希望您的元素是 字符串——它们不是,请参阅 haccks' answer 以获取解释(字符串必须以 @ 结尾987654336@,您的字符串文字可以,但您的数组需要空间来容纳它)。

    【讨论】:

      【解决方案3】:
      char arr[2][3]={"sam","ali"}
      

      脱糖成

      char arr[2][3]={{'s','a','m'},
                      {'a','l','i'}}
      

      接下来,

      char(*ptr)[3]=arr;
      

      表示a pointer to an array of 3 elements of type char

      arr[2][2] 未定义,因为您没有对其进行初始化。

      但是,如果您想选择元素 i,则表示 arr[1][2],它被脱糖为 *(*(arr+1)+2)。这可以表示为 ((ptr+1)+2),因为 sizeof(*ptr)sizeof(*arr) 相同。

      【讨论】:

      • 你没有初始化它。”它甚至没有被定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2018-01-04
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多