簡體   English   中英

當我將指針地址加起來時,它指向我的數組嗎? 為什么? 引用和取消引用混淆C ++

[英]When I add up in my pointer address it points to my array? Why? Reference and Dereference confusion C++

在這個例子中,我有四個元素的數組。 我已經聲明了一個指向整數的指針,該指針包含數組的地址。 然后,我以3種不同的方式顯示了第0個索引的地址。 同樣,第一種索引的地址以三種不同的方式顯示。 當我輸出(&pNumbers)+0時,可以理解將顯示一個唯一且不同的地址。 在下一行中,*(&pNumbers + 0)顯示第0個索引地址(由指針包含)。 現在問題來了。 在輸出此(&pNumbers)+1行時,它將再次顯示數組第0個索引。 為什么呢

第一個問題:當我檢索指針地址(&pNumbers)時,它將顯示新的唯一地址。 但是當我把那個地址加起來時。 如何訪問數組的元素地址? 例如

enter code here

cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl // new address + 1 but showing address of 0 element.

cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl // showing address of of 1st index

第二個問題:如果說它確實以某種方式指向相應的數組元素。 在我取消引用時,為什么它沒有顯示與數組元素相對應的正確數據值。 例如

enter code here
cout<<" *(&pNumbers+1) "<< *(&pNumbers+1) // assumption was 31 (but displaying some 0x1f)

cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl // assumption was 28 (but displpaying 0x1c)

下面是源代碼:

#include <iostream>
#include <string>
#include <conio.h>

using namespace std;

int main()
{int number[] = { 31, 28, 31, 30};
    int *pNumbers = number;

    cout<<" Address of number[0] "<<number<<endl;
    cout<<" Address of number[1] "<<number+1<<endl;
    cout<<" Address of number[2] "<<number+2<<endl;
    cout<<" Address of number[3] "<<number+3<<endl<<endl;

    cout<<" Address of &pNumbers "<< &pNumbers<<endl<<endl; // address of pNumbers

    cout<<" Address of number "<< number<<endl; // address of array's first element
    cout<<" pNumber Address "<< pNumbers<<endl;
    cout<<" &(pNumbers[0]) "<< &(pNumbers[0])<<endl<<endl;

    cout << " pNumbers+1:  " << pNumbers+1<<endl; //address of array's second element
    cout<<" (&pNumbers[1]) "<<(&pNumbers[1])<<endl; //
    cout<<" (pNumbers+1) "<< (pNumbers+1) <<endl<<endl;

    cout<<" (&pNumbers)+0 "<< (&pNumbers)+0<<endl;
    cout<<" *(&pNumbers+0) "<< *(&pNumbers+0)<<endl<<endl;

    cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl<<endl; // new address + 1 expected but displaying array's 0th index address why ?
    cout<<" *(&pNumbers+1) "<<*(&pNumbers+1)<<endl<<endl;

    cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl<<endl;
    cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl<<endl;

    cout<<" (&pNumbers + 3) "<<(&pNumbers+3)<<endl<<endl;
    cout<<" *(&pNumbers + 3) "<<*(&pNumbers+3)<<endl<<endl;

    cout<<" (&pNumbers + 4) "<<(&pNumbers+4)<<endl<<endl;
    cout<<" *(&pNumbers + 4) "<<*(&pNumbers+4)<<endl<<endl;

    return 0;
}

這是大多數平台上堆棧的內存布局。 你的堆棧

在輸出此(&pNumbers)+1行時,它將再次顯示數組第0個索引。 為什么呢

您的代碼獲取pNumbers內存單元的地址( &pNumbers類型為int ** ),然后向其添加一個語義,其&pNumbers是根據指針的大小對其進行遞增,因此,表達式&pNumbers + 1是原始數組的地址,因為pNumbers變量為指針本身。

第二個問題是什么表情*(&pNumbers+1)做基本上是試圖解釋的內存位置哪些商店int為指針為int(類型為*(&pNumbers+1)int * )。 這就是為什么您以十六進制而不是dec格式看到int的原因。 換句話說,您將number[0]當作int *並打印出來。

在所有這些東西中可能令人困惑的是,數組被視為指向其第一個元素的指針,這導致該number&number本質上是相同的地址(但是兩個表達式具有不同的類型)

希望能有所幫助。

暫無
暫無

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

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