[英]pointer pointing to an entire array
struct grid {
int width, height;
void *cells[];
};
typedef struct grid grid;
int main(){
enum { width = 2, height = 10 };
grid *g = malloc(sizeof(grid) + width * height * sizeof(void *));
void *(*cells)[10] = &g->cells;
}
我的教授告訴我們這種分配靈活數組的好方法,然后分配指向整個指針數組的指針
void *(*cells)[10] = &g->cells;
< - 這一行
所以我嘗試了這種方法
char *array[10];
char *(*pointer)[2] = &array;
它只是給了我一個編譯器錯誤
warning: incompatible pointer types initializing
'char *(*)[2]' with an expression of type 'char *(*)[10]'
[-Wincompatible-pointer-types]
char *(*pointer)[2] = &array;
如果有人能向我解釋一個有用的“指向整個數組的指針”的功能。 謝謝
讓我們先做正確的聲明:
void *(*cells)[10] = &g->cells;
要理解這一點,首先要認識到cells
是被聲明的標識符,並從那里遵循優先規則:
(*cells)
表示cells
是一個指針,聲明的其余部分描述了指向的東西。 括號只是強制執行優先級,就像在算術表達式中一樣。 [10]
適用,因為括號比一元*
具有更高的優先級。 這就是說, (*cells)
是一個包含10個元素的數組。 void *
,它給出了每個元素的類型。 如果我們查看&g->cells
,它是一個指向未指定數量的void *
的數組的指針。
現在考慮你的代碼:
char *array[10]; char *(*pointer)[2] = &array;
按照類似的過程,我們得到pointer
被聲明為指向2 char *
數組的指針。 到現在為止還挺好。 現在,您要分配給它的是什么? 為什么,它是一個指向10個 char *
的數組的指針。 這是指向不同的,不兼容的類型的指針。
在第一種情況下,初始化程序的類型是指向“不完整類型”的指針,該指針與指針指向的類型兼容。 (它是不完整的,因為數組長度是未指定的;它是兼容的,因為在所有其他方面它與另一種類型匹配。)指向的東西可以是賦值隱式聲明的長度數組,C將處理指針好像是的。
在第二種情況下,C可以看到兩個指針肯定指向不同大小的對象,因此賦值肯定是不正確的。 您需要對pointer
類型進行pointer
轉換或更改以使其接受初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.