簡體   English   中英

C ++星號和括號運算符一起使用

[英]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 [] 因此, xint (*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.

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