2

我有二维数组

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

和指向这个数组的指针

char(*ptr)[3]=arr;

如何使用此指针打印arr[2][2]在这种情况下是i. 我尝试* (*(ptr+1)+2)了与处理数组相同的方式,但没有奏效,所以任何人都可以帮助并告诉我在这种情况下如何处理指向数组的指针以打印元素[2][2]

4

3 回答 3

7

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

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

使用您可以访问asptr的元素。arrptr[1][2]

于 2017-08-16T06:59:04.570 回答
3

这个:

char(*ptr)[3]=arr;

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

您的直接问题只是错误的索引。指数是基于0, not 1, 所以

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

的第一维的有效索引arr01。您要查找的元素位于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]


旁注:如果您希望您的元素是字符串- 它们不是,请参阅hacks 的解释以获得解释(字符串必须以 a 结尾'\0',您的字符串文字可以,但您的数组需要空间来容纳它)。

于 2017-08-16T07:03:19.020 回答
0
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)

于 2017-08-16T08:47:23.757 回答