簡體   English   中英

(int (*)[30]) 中的 (*) 是什么意思?

[英]What does the (*) in (int (*)[30]) mean?

C中的(int (*)[30])是什么意思? 例如,在:

int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));

粗略地說,它的意思是“是一個指針”。

int (*b)[30]

這意味着“ b是指向 30 個整數的數組的指針”。

(int (*) [30])

這意味着“轉換為指向 30 個整數數組的指針”。

int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));

打破它:

      b        -- b
    (*b)       -- is a pointer
    (*b)[30]   -- to a 30-element array
int (*b)[30]   -- of int.

在聲明和表達式中,像[]這樣的后綴運算符比像*這樣的一元運算符具有更高的優先級,因此T *a[]被解釋為T *(a[]) IOW, a是指向T的指針數組。 要將a指定為指向數組的指針,我們必須強制分組T (*a)[]

同樣,強制轉換表達式(int (*) [30])表示“將malloc返回的指針值視為指向 30 元素int數組的指針”。 請注意,從技術上講,cast 表達式是多余的,應該刪除。

malloc調用本身似乎非常錯誤。 您正在為int的 20 元素數組分配 30 個實例,但將結果分配給指向int的 30 元素數組的指針; 那會引起問題。 假設您正在嘗試分配一個 N x 30 矩陣int ,以下內容會更安全:

int (*b)[30] = malloc(N * sizeof *b); 

表達式*b的類型是int [30] ,因此sizeof *bsizeof (int [30])相同。

如何解析 C 聲明和類型:從外向內展開它們。

  • int (*b)[30]
  • (*b)[30]是一個int
  • (*b)是一個長度為30int數組。
  • b是指向長度為30int數組的指針。

無名版本int (*) [30]完全相同,只是省略了名稱。

如果您有一份 C 編程語言,其中有一個名為cdecl的程序可以將此類聲明轉換為英語。 隨着時間的推移對其進行了各種修改,例如 Debian 中的cutils支持無名形式,並且cdecl.org在線。

您可以使用cdecl來解決這些問題:

cdecl> explain (int (*) [30]) 
cast unknown_name into pointer to array 30 of int

(*) 在變量名前表示它是一個指針。

我們剛剛看到,存儲對另一個變量的引用的變量稱為指針。 指針被稱為“指向”它們存儲其引用的變量。

使用指針,我們可以直接訪問存儲在它指向的變量中的值。 為此,我們只需要在指針的標識符之前加上一個星號 (*),它充當解引用運算符,可以直譯為“指向的值”。

(*)真的沒有什么特別的。 由於您只是在類型轉換中引用一個類型(而不是具有該類型名稱的變量),因此您只需省略名稱即可。 這里仍然需要括號來區分指針數組和指向數組的指針。

暫無
暫無

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

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