對不起,這個蹩腳的標題,但我不知道如何更好地描述這個問題。C++星號和括號一起使用的操作符
是什麼意思:
int (*x)[];
以及如何初始化呢?
我知道這是不是因爲int *x[]
:
int a,b;
int (*x)[] = {&a, &b};
將無法編譯。
預先感謝您。
對不起,這個蹩腳的標題,但我不知道如何更好地描述這個問題。C++星號和括號一起使用的操作符
是什麼意思:
int (*x)[];
以及如何初始化呢?
我知道這是不是因爲int *x[]
:
int a,b;
int (*x)[] = {&a, &b};
將無法編譯。
預先感謝您。
類型聲明有一個表達式的語法,所以你解析他們的 你將一個表達式:
x x is
*x a pointer
(*x)[] to an array of unknown dimensions
int (*x)[] of int
優先規則是運營商的權利綁定更緊比 那些向左,在每種情況下,操作者接近 結合更緊,最後,該括號可用於改變這些 綁定元件,這樣:
int *x[]; is an array of pointers,
int *(x[]); as is this.
int (*x)[]; whereas here, the parentheses change the bindings.
使用cdecl,你可以很容易地確定類型:
int a[]; // conceptual: error if compiled
x = &a;
請注意,數組的大小的一部分:
declare x as pointer to array of int
所以,你可以用數組的地址初始化x
它的類型,所以你不能將大小爲N
的數組的地址分配給指向大小爲M
的數組的指針,其中N!=M
(這是上述錯誤的原因:您需要知道數組的大小使用的指針空int數組聲明它)
int b[5];
int c[6];
int (*y)[6];
y = &b; // error
y = &c; // OK
提醒'cdecl' - 我忘記它存在 - 儘管嚴格地說,它只支持C語法。 – 2012-04-27 12:43:00
感謝您的鏈接,它很有用! – Chlind 2012-04-27 13:53:50
int (*x)[]
。但在C++中初始化一個空數組是不可能的。只有你可以定義它。你應該用一個非空數組:
int a[2] = {1, 2};
int (*x)[2] = &a;
GCC抱怨它無法將int(*)[2]'轉換爲int(*)[]'。編輯:現在它偏離的問題;) – chris 2012-04-27 12:25:32
你是對的,我糾正它。 – 2012-04-27 12:27:44
int (*x)[]
意味着x
是int數組的指針。你可以這樣做:
int a[] = {1, 2};
int (* b)[2] = &a;
當解釋數組類型的變量,我們應該從右到左走。例如
int *x[]
指示x
是一個數組,數組中的元素的類型爲int *
即指針爲int。 因此x
表示其元素是int指針的數組。但是,括號會改變運營商的優先級。現在*
首先被解釋爲表示x
是一個指針,其類型爲int []
。因此,在int (*x)[]
中的x
是一個指向int數組的指針,你應該相應地初始化它。
我曾經有C打字問題,直到我學會了如何創建。
在C中,類型以您使用該類型變量的方式描述。
因此,當看到:
int *x;
這意味着表達*x
是int
類型,因此x
是類型指針到整型變量。
如果你看到:
int x[5];
這意味着表達x[3]
是int
類型,因此x
是類型陣列的-INT的變量。
所以,去你的表達:
int (*x)[];
這意味着表達*x
是int[]
型的(即,未知大小的int
數組)。因此x
是一個類型爲pointer-to-an-array-of-int的變量。
你基本上是正確的,但你可能會更清楚。當你看到'int * x'這意味着'* x'是一個int類型的變量*。你說的這種方式,目前還不清楚你的意思是'* x'是int型的*值*還是int型的*變量*。 – 2012-04-27 17:14:53
@EricLippert:'* x'不是一個變量,它是一個表達式。我在整個地方引入了「表達」和「變量」來標記區別,並希望更清晰。 – 2012-04-28 10:27:08
當然'* x'是*變量*;它代表一個*存儲位置*,您可以將值賦給*,所以它是*變量*;這就是變量*的含義*:您可以爲其指定值的存儲位置。 C程序員當然傾向於稱這種「左值」而不是「變量」,這是不幸的; 「左值」是混淆和不必要的混亂的方式來說「變量」。 – 2012-04-28 15:03:21
INT(* X)[] 這意味着x是一個指針,指向一個int數組 初始化爲: INT(* X)[]; int a [10]; x =&a;
INT * X [] 這意味着x是一個指針數組爲int INT * X [10]; int a [10]; x [0] = a;
在我看來,總是使用初始化數組變量或使用int ** x而不是* x [],然後在運行時分配內存。
第一個使用示例不會編譯:錯誤:無法在分配中將'int()[10]'轉換爲'int()[]' – Attila 2012-04-27 13:48:44
+1 ....太棒了! – Nawaz 2012-04-28 05:11:33