簡體   English   中英

a,&a和&a [0]之間的類型區別是什么?

[英]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.

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