2012-04-27 73 views
18

對不起,這個蹩腳的標題,但我不知道如何更好地描述這個問題。C++星號和括號一起使用的操作符

是什麼意思:

int (*x)[]; 

以及如何初始化呢?

我知道這是不是因爲int *x[]

int a,b; 
int (*x)[] = {&a, &b}; 

將無法​​編譯。

預先感謝您。

回答

25

類型聲明有一個表達式的語法,所以你解析他們的 你將一個表達式:

 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. 
+1

+1 ....太棒了! – Nawaz 2012-04-28 05:11:33

13

使用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 
+0

提醒'cdecl' - 我忘記它存在 - 儘管嚴格地說,它只支持C語法。 – 2012-04-27 12:43:00

+0

感謝您的鏈接,它很有用! – Chlind 2012-04-27 13:53:50

3

int (*x)[]。但在C++中初始化一個空數組是不可能的。只有你可以定義它。你應該用一個非空數組:

int a[2] = {1, 2}; 
int (*x)[2] = &a; 
+1

GCC抱怨它無法將int(*)[2]'轉換爲int(*)[]'。編輯:現在它偏離的問題;) – chris 2012-04-27 12:25:32

+0

你是對的,我糾正它。 – 2012-04-27 12:27:44

2

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數組的指針,你應該相應地初始化它。

+0

無法編譯:錯誤:無法在作業 – Attila 2012-04-27 12:31:08

+0

@Attila中將'int(*)[2]'轉換爲'int(*)[]'你的編譯器是什麼,在gcc 4.1.2'上正常工作。:) – 2012-04-27 12:32:08

+0

http :// ideone。com/- 我認爲它在後面使用gcc,但我不知道什麼版本/選項 – Attila 2012-04-27 12:33:54

1

我曾經有C打字問題,直到我學會了如何創建。

在C中,類型以您使用該類型變量的方式描述。

因此,當看到:

int *x; 

這意味着表達*xint類型,因此x是類型指針到整型變量。

如果你看到:

int x[5]; 

這意味着表達x[3]int類型,因此x是類型陣列的-INT的變量。

所以,去你的表達:

int (*x)[]; 

這意味着表達*xint[]型的(即,未知大小的int數組)。因此x是一個類型爲pointer-to-an-array-of-int的變量。

+1

你基本上是正確的,但你可能會更清楚。當你看到'int * x'這意味着'* x'是一個int類型的變量*。你說的這種方式,目前還不清楚你的意思是'* x'是int型的*值*還是int型的*變量*。 – 2012-04-27 17:14:53

+0

@EricLippert:'* x'不是一個變量,它是一個表達式。我在整個地方引入了「表達」和「變量」來標記區別,並希望更清晰。 – 2012-04-28 10:27:08

+2

當然'* x'是*變量*;它代表一個*存儲位置*,您可以將值賦給*,所以它是*變量*;這就是變量*的含義*:您可以爲其指定值的存儲位置。 C程序員當然傾向於稱這種「左值」而不是「變量」,這是不幸的; 「左值」是混淆和不必要的混亂的方式來說「變量」。 – 2012-04-28 15:03:21

0

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 [],然後在運行時分配內存。

+0

第一個使用示例不會編譯:錯誤:無法在分配中將'int()[10]'轉換爲'int()[]' – Attila 2012-04-27 13:48:44