簡體   English   中英

指針指向整個數組

[英]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是被聲明的標識符,並從那里遵循優先規則:

  1. (*cells)表示cells是一個指針,聲明的其余部分描述了指向的東西。 括號只是強制執行優先級,就像在算術表達式中一樣。
  2. 接下來[10]適用,因為括號比一元*具有更高的優先級。 這就是說, (*cells)是一個包含10個元素的數組。
  3. 這留下了前面的void * ,它給出了每個元素的類型。

如果我們查看&g->cells ,它是一個指向未指定數量的void *的數組的指針。

現在考慮你的代碼:

 char *array[10]; char *(*pointer)[2] = &array; 

按照類似的過程,我們得到pointer被聲明為指向2 char *數組的指針。 到現在為止還挺好。 現在,您要分配給它的是什么? 為什么,它是一個指向10個 char *的數組的指針。 這是指向不同的,不兼容的類型的指針。

在第一種情況下,初始化程序的類型是指向“不完整類型”的指針,該指針與指針指向的類型兼容。 (它是不完整的,因為數組長度是未指定的;它是兼容的,因為在所有其他方面它與另一種類型匹配。)指向的東西可以是賦值隱式聲明的長度數組,C將處理指針好像是的。

在第二種情況下,C可以看到兩個指針肯定指向不同大小的對象,因此賦值肯定是不正確的。 您需要對pointer類型進行pointer轉換或更改以使其接受初始化。

&array是包含10個指向char的指針的數組的地址

pointer是一個指向包含2個指向char的指針的數組的指針

2 != 10 ,因此警告。

有一個方便的網站 ,有助於理解困難的c減速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM