[英]C++ asterisk and bracket operators used together
抱歉這個糟糕的標題,但我不知道如何更好地描述這個問題。
的意義是什么:
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 ,您可以輕松確定類型:
將x聲明為int數組的指針
所以你可以用數組的地址初始化x
:
int a[]; // conceptual: error if compiled
x = &a;
請注意,數組的大小是其類型的一部分,因此您不能將大小為N
的數組的地址分配給大小為M
數組的指針,其中N!=M
(這是上述錯誤的原因:您需要知道數組的大小來聲明它)
int b[5];
int c[6];
int (*y)[6];
y = &b; // error
y = &c; // OK
int (*x)[]
用於指向空int數組的指針。 但是初始化一個在c ++中不可能的空數組。 只有你可以定義它。 你應該使用非空數組:
int a[2] = {1, 2};
int (*x)[2] = &a;
int (*x)[]
表示x
是指向int數組的指針。 你可以這樣做:
int a[] = {1, 2};
int (* b)[2] = &a;
當解釋數組類型變量時,我們應該從右到左。 例如
int *x[]
表示x
是一個數組,數組中的元素類型為int *
即指向int的指針。 因此, x
表示一個數組,其元素是int指針。 但是,括號會更改運算符的優先級。 現在*
首先被解釋為x
是一個指針,其類型為int []
。 因此, x
在int (*x)[]
是指向int數組和應該相應地進行初始化。
我曾經也遇到過C類型的問題,直到我了解它是如何創建的。
在C中,類型以您使用該類型變量的方式描述。
因此,當你看到:
int *x;
這意味着表達式*x
的類型為int
,因此x
是指向int類型的變量。
如果你看到:
int x[5];
這意味着表達式x[3]
的類型為int
,因此x
是array-of-int類型的變量。
所以,要得到你的表達:
int (*x)[];
這意味着表達式*x
的類型為int[]
(即,未知大小的int
數組)。 因此, x
是指向數組指針的類型的變量。
int(* x)[]這意味着x是一個指向int數組的指針Initialize as:int(* x)[]; int a [10]; x =&a;
int * x []這意味着x是一個指向int int * x [10]的指針數組; int a [10]; x [0] = a;
在我看來,總是使用初始化的數組變量或使用int ** x而不是* x []然后在運行時分配內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.