[英]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.