簡體   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