[英]why the address of dynamic array is different from the first element address?
[英]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.