我有二维数组
char arr[2][3]={"sam","ali"}
和指向此数组的指针
char(*ptr)[3]=arr;
如何使用此指针打印arr[2][2]
,在这种情况下为i
。
我尝试* (*(ptr+1)+2)
的方式与处理数组的方式相同,但是没有用,所以任何人都可以帮忙告诉我如何处理指向数组的指针,在这种情况下打印元素[2][2]
。
答案 0 :(得分:7)
您不应该打印arr[2][2]
,因为您正在访问数组越界。另请注意,在给定数组中没有'\0'
个字符存储的空间。
char arr[2][4] = {"sam","ali"}
char(*ptr)[4] = arr;
使用ptr
,您可以arr
访问ptr[1][2]
的元素。
答案 1 :(得分:3)
此:
char(*ptr)[3]=arr;
不是指向多维数组的指针,它是指向大小为3
的一维数组的指针。但这很好,因为指针总是也可以指向它指向的类型的数组。因此,您ptr
指向大小为3
的一维数组的数组。到目前为止只是为了澄清条款。
你的直接问题只是错误的指数。指数基于0
,而不是1
,因此
char arr[2][3]={"sam","ali"}
arr
第一维的有效索引仅为0
和1
。您正在寻找的元素位于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了解相关信息(字符串必须以'\0'
结束,你的字符串文字可以,但你的数组需要有空间来容纳它。)
答案 2 :(得分: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]
未定义,因为您没有初始化它。
但是,如果你想选择那个意味着arr [1] [2]的元素i
,它被置于*(*(arr+1)+2)
之内。这可以表示为((ptr + 1)+2),因为sizeof(*ptr)
与sizeof(*arr)
相同。