簡體   English   中英

Type ** name和Type * name []有什么區別?

[英]What is the difference between Type** name, and Type* name[]?

Type ** name和Type * name []有什么區別?

為什么有人會使用一個而不是另一個?

謝謝

那取決於它是在變量聲明中還是在函數參數中? 如果在變量聲明中:

Type** name = &pointer_to_type;
Type* name[] = { &pointer_to_type, 0, &pointer_to_type };

第一個是指向類型指針的指針,而第二個是指向長度為3的類型的指針數組。

如果在函數參數中,它們是相同的。 數組衰減為指針, Type** nameType* name[]與函數參數完全相同。 但是,第二種形式清楚地表明name是一個未知長度的指針數組,而第一個不是。 我會使用Type**來指定一個元素,使用Type*[]來指定一個數組。

兩者之間的差異主要在聲明/定義任一類型的對象時得到證明。

符號Type *name[]創建一個未知大小的數組(可以從初始化程序推斷), Type** name創建一個指針。 這意味着:

char *array[]={"hello", "world", 0}; /* OK, array of size 3 */
char **ptr={"hello", "world", 0};    /* not possible */

它們在某些表達中表現不同。 特別是,無法分配數組,但指針變量可以:

ptr++, ptr=array; /* assignment and mutation of ptr possible */
// array=whatever /* impossible */

sizeof運算符在兩者上的工作方式不同。 sizeof(array)將取決於sizeof(array)的元素數量(在這種情況下可能為12),但sizeof(ptr)總是返回相同的大小(例如,在主32位體系結構上為4)

另外,在聲明全局變量時,不能混合使用兩者:

extern char* data[];

必須在.c文件中附帶

char* data[N];

反之亦然。 基本上,定義數組意味着分配幾個連續的對象,而定義指針意味着分配單個變量。 編譯器對待它們的方式不同,並且必須知道哪個是哪個。

但是,在向函數聲明或傳遞參數時,它們是相同的。 所以

int main(int argc, char** argv)
int main(int argc, char* argv[]) /* the same */

取決於上下文。

如果它定義了一個不是函數參數的變量,那么在Type** namename是一個指向Type變量指針的指針,在Type* name[SOME_POSITIVE_INTEGER_CONSTANT] ,它是一個指向類型變量的指針數組Type

如果它是一個函數參數,則兩者都是相同的, name是指向Type變量的指針。

基本上,Type **是指向指針的指針。 想象它(類型*)*。 所以它指向Type *,它可以是Type或Type []。

而另一個,Type *是一個指向Type的指針,或者在這種情況下,是一個數組Type []。 所以它們“幾乎”相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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