[英]What's the difference between type name() and type name = type()?
[英]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** name
和Type* 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** name
, name
是一個指向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.