[英]why the address of dynamic array is different from the first element address?
#include<iostream>
using namespace std;
int main()
{
int* q = new int[3];
cout << &q[0] << endl;
cout << q << endl;
cout << &q << endl; // why here is different?
int p[3];
cout << &p[0] << endl;
cout << p << endl;
cout << &p << endl;
return 0;
}
這是我的代碼,我使用new創建動態arrays,但是數組地址真的讓我很困惑,為什么&q不一樣?
表達式&q
是指向變量q
的指針,這確實與q
指向的位置不同。
你可以這樣看:
+----+ +---+ +------+------+------+ | &q | --> | q | --> | q[0] | q[1] | q[2] | +----+ +---+ +------+------+------+
另一方面p
是一個數組,其中&p
是指向數組本身的指針:
+----+ +------+------+------+ | &p | --> | p[0] | p[1] | p[2] | +----+ +------+------+------+
&q
和&p
之間也有很大的語義差異:它們的類型。
&q
的類型是int**
,而&p
的類型是int (*)[3]
。
這也解釋了為什么&p
和&p[0]
看起來是一樣的,它們都指向同一個位置。 但是這里也存在語義差異, &p[0]
的類型是int*
。
最后, arrays 可以衰減為指向其第一個元素的指針,這意味着p
與&p[0]
相同,甚至具有相同的類型。
因為 q 是一個指針,它不會像數組那樣衰減為指針。 在這種情況下,&q 表示指向指針 q 的指針,而 &q[0] 表示指向 q 的指針被取消引用,換句話說就是 q 本身。
p
是一個數組。 q
是一個指針。 數組包含實際數據。 因此,指向數組p
的指針&p
直接指向數據。
指針q
是一個包含動態數組地址的變量。 指針的地址與數據的地址不同。
此代碼片段描述了發生的情況:
#include<iostream>
using namespace std;
int main()
{
// new int[3] creates an array
// int *q creates a pointer pointing to the array
int* q = new int[3];
cout << &q[0] << endl;
cout << q << endl;
cout << &q << endl; // why here is different?
// int p[3] creates an array
int p[3];
// int *pp creates a pointer pointing to the array
int *pp = p;
cout << &pp[0] << endl;
cout << pp << endl;
cout << &pp << endl;
return 0;
}
不同之處在於您無法在第一種情況下訪問動態數組。 它沒有名字。 它只能通過指針p
訪問。
在第二種情況下,數組有一個名稱p
,您可以直接或通過指針pp
訪問它。
動態數組的地址是q
。 &q
是動態數組的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.