繁体   English   中英

指向2d指针数组的指针

[英]pointer to 2d array of pointers

我将如何声明一个指向2D字符指针数组的指针。 喜欢

char *ar[10][10]; 

在我的理解中,该数组存储为数组数组,因此ar指向一个指针数组,每个指针都指向该数组中的一列。 因此它具有三个级别的指针。 所以应该声明为

char ***p; 

因此, arp属于同一类型。 但是,如果我将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM