[英]pointer to 2d array of pointers
我将如何声明一个指向2D字符指针数组的指针。 喜欢
char *ar[10][10];
在我的理解中,该数组存储为数组数组,因此ar
指向一个指针数组,每个指针都指向该数组中的一列。 因此它具有三个级别的指针。 所以应该声明为
char ***p;
因此, ar
和p
属于同一类型。 但是,如果我将p
像2d数组那样用于p[0][0]
,则会出现分段错误。 为什么会发生这种情况?声明p
的正确方法是什么?
声明看起来像
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] );
您的误解是每个级别都是一个指针。 这不是真的。
char ***p
表示您有一个指向指向char的指针的指针。 但这不是你所拥有的。
您的char[10][10]
以contigouos的方式存储为100个字符,每10个组成一个char[10]
。 因此,您确实可以使用char *ar[10][10]
或切换到使用char *ar
并将其用于以一维方式寻址数组。 这可能有优势,但是通常仅在阵列形状即将变化的情况下才建议使用。
数组不是指针,指针也不是数组。 同样,数组的数组与指针的指针绝对无关。 如果有人对您的说法有所不同,他们会感到困惑。
char* ar[10][10]
是char指针的2D数组。 它也可以看作是char指针数组的数组。
如果要使用指向此类数组的指针,则可以使用数组指针 :
char* (*ptr)[10][10]
这是作为
(*ptr)
指向...的数组指针 [10][10]
... 10x10阵列... char*
... char*
项目。 声明正确,
p[0][0]
只是一个指向char *的指针,可能是您在分配存储空间之前对其进行了访问,从而导致段错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.