![](/img/trans.png)
[英]What's the difference between type name() and type name = type()?
[英]What's the type difference between a, &a, and &a[0]?
#include <iostream>
void arrayFunctionA(int* p)
{
}
int main()
{
int a[3] = {7, 7, 7};
arrayFunctionA(a);
arrayFunctionA(&a[0]);
arrayFunctionA(&a);
return 0;
}
這將無法編譯,並且在arrayFunctionA(&a);
上arrayFunctionA(&a);
錯誤arrayFunctionA(&a);
。
因此, a
和&a[0]
計算結果為int*
,而&a
則不。
這3個有什么區別?
a
是3個int
類型的數組( int [3]
)。
固定數組會衰減為其第一個元素的指針,因此在arrayFunctionA(a)
, a
將衰減為指向其第一個元素的int*
指針。
&a[0]
是數組第一個元素的地址,類型為int *
。
&a
是數組本身的地址,類型為int (*)[3]
(指向3 int
數組的指針)。
因此,對於具有簽名的功能
void arrayFunctionA(int* p);
傳遞a
或&a[0]
會達到相同的目的,而傳遞&a
會導致傳遞的參數值和函數參數之間不兼容。
前兩個示例相同。
a
衰變到一個指針和結合於int*
采取的功能。 &a[0]
等於&*(p + 0)
,它產生一個int*
。 第三個示例未編譯,因為將地址運算符( &
)應用於數組會產生指向數組的指針。 在您的示例中,結果是無法綁定到int*
的int(*arr)[3]
,因此會出現編譯錯誤。
arrayFunctionA(a);
第一次調用arrayFunctionA(a);
實際地址a
被傳遞。
arrayFunctionA(&a[0]);
第二個調用arrayFunctionA(&a[0]);
索引0的實際地址正在傳遞。
第一次和第二次通話是相同的。 你們都得到索引0的地址(記住數組也是指針)。
在第三個電話你得到的指針a
它已經是一個指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.