如何声明一个指向二维字符指针数组的指针。像
char *ar[10][10];
据我所知,这个数组存储为数组数组,因此ar
指向一个指针数组,每个指针都指向此数组中的一列。所以它有三个级别的指针。所以应该声明为
char ***p;
因此,ar
和p
属于同一类型。
但是,如果我像{2}数组一样使用p
p[0][0]
,它会产生细分错误。为什么会发生这种情况以及宣布p
的正确方法是什么?
答案 0 :(得分:1)
声明看起来像
char * ar[10][10];
char * ( *p_ar )[10][10] = &ar;
例如在sizeof
运算符中取消引用指针,您将获得数组的大小,因为表达式将具有类型char[10][10]
printf( "%zu\n", sizeof( *p_ar ) );
输出将等于100
使用您可以编写的指针
输出原始数组第一行的第一个字符串printf( "%s\n", ( *p_ar )[0][0] );
使用您可以编写的指针输出原始数组第一行第一个字符串的第一个字符
printf( "%c\n", ( *p_ar )[0][0][0] );
或
printf( "%c\n", *( *p_ar )[0][0] );
您还可以声明指向数组第一个元素的指针
char * ar[10][10];
char * ( *p_ar )[10] = ar;
在这种情况下,使用您可以编写的指针
输出原始数组第一行的第一个字符串printf( "%s\n", p_ar[0][0] );
使用您可以编写的指针输出原始数组第一行第一个字符串的第一个字符
printf( "%c\n", p_ar[0][0][0] );
或
printf( "%c\n", *p_ar[0][0] );
答案 1 :(得分:0)
你的误解是每个级别都是一个指针。事实并非如此。
char ***p
表示你有一个指向指针的指针,指针指向一个指向char的指针。但那不是你拥有的。
您的char[10][10]
以contigouos方式存储为100个字符,每10个字符组成char[10]
。因此,要么确实使用char *ar[10][10]
,要么切换到使用char *ar
并使用它以1D方式寻址数组。这可能有优势,但通常只在数组的形状即将变化的情况下才推荐使用。
答案 2 :(得分:0)
数组不是指针,指针不是数组。类似地,数组数组与指针指针完全无关。如果有人告诉你不同,他们会感到困惑。
char* ar[10][10]
是一个char指针的2D数组。它也可以被视为char指针数组的数组。
如果你想要一个指向这样一个数组的指针,你可以使用数组指针:
char* (*ptr)[10][10]
读作
(*ptr)
指向...的数组指针[10][10]
...一个10x10阵列...... char*
... char*
项目。答案 3 :(得分:0)
声明是正确的,
p[0][0]
只是一个指向char *的指针,可能是你在分配存储之前访问它,所以你得到一个段错误