[英]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 *b
與sizeof (int [30])
相同。
您可以使用cdecl
來解決這些問題:
cdecl> explain (int (*) [30])
cast unknown_name into pointer to array 30 of int
(*) 在變量名前表示它是一個指針。
我們剛剛看到,存儲對另一個變量的引用的變量稱為指針。 指針被稱為“指向”它們存儲其引用的變量。
使用指針,我們可以直接訪問存儲在它指向的變量中的值。 為此,我們只需要在指針的標識符之前加上一個星號 (*),它充當解引用運算符,可以直譯為“指向的值”。
(*)
真的沒有什么特別的。 由於您只是在類型轉換中引用一個類型(而不是具有該類型名稱的變量),因此您只需省略名稱即可。 這里仍然需要括號來區分指針數組和指向數組的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.