簡體   English   中英

為什么動態數組的地址與第一個元素的地址不同?

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

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