簡體   English   中英

數組的地址與第一個元素的地址不同?

[英]Address of an array different with the address of the first element?

據我所知,數組a的地址是該數組的第一個元素的地址。

void func(int a[])
{
    cout << "address in func: " << &a << endl;;
    cout << "GT: " << &a[0] << endl;
}

int main ()
{
    int a[] = {0,1,2,3};
    cout << "address in main: " << &a << endl;
    cout << "address in main a[0]: " << &a[0] << endl;

    func(a);
}

輸出:

address in main: 0x7ffef67d6790
address in main a[0]: 0x7ffef67d6790
address in func: 0x7ffef67d6778
GT: 0x7ffef67d6790

為什么 func() 中數組a的地址與a[0]的地址不同?

為什么 func() 中數組 a 的地址與 a[0] 的地址不同?

因為您正在調用函數func()傳遞a by value 這意味着函數func()中的a實際上是您從main()傳遞給func()的原始衰減指針的副本。 而且由於它們是不同的變量,因此它們具有不同的地址 因此通過編寫cout << &a; 您正在打印名為a的單獨局部變量的地址。

如果你想打印原始地址,你應該在func()里面寫:

void func(int a[])
{
//---------------------------------v---------->removed the &
    cout << "address in func: " << a << endl;;
    cout << "GT: " << &a[0] << endl;
}

演示

address in main: 0x7ffcfb0a4320
address in main a[0]: 0x7ffcfb0a4320
address in func: 0x7ffcfb0a4320
GT: 0x7ffcfb0a4320

正如評論中所解釋的那樣,您沒有將“相同”變量傳遞給您的函數。 當你調用你的函數時,它會在你的 int 數組中創建一個本地副本。

為了不浪費內存,假設你升級了你的程序,現在,你沒有向你的函數傳遞一個 int 數組,而是一個相當大的 std::vector,我們在 C++ 中通過引用傳遞參數(myType &myVar)。

這與在 C 中通過指針傳遞參數相同。通過引用傳遞某些內容實際上會為傳遞的變量創建一個別名。 所以你現在有兩種方法來處理變量:主程序中的變量本身,以及函數中的別名。

顯然,如果您不想在函數中修改它,您可以通過 const 引用 (const myType & myVar) 傳遞它,這與在 C 中使用 const * 相同。

這是一個從 C 繼承來的謬誤

void func(int a[])

將數組傳遞給函數。

雖然int a[]看起來像一個數組,但您實際上不能將數組傳遞給函數。 數組總是衰減為指針,而指針實際上就是您傳遞給函數的內容。 所以上面相當於寫

void func(int *a)

也許現在您可以看到為什么&a ,本地指針的地址和&a[0]數組的第一個元素的地址不同。

暫無
暫無

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

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