簡體   English   中英

(void *)和&之間的區別

[英]difference between (void*) and &

嗨,我一直在練習new的放置並使用它來創建對象。 考慮以下:

class PNewTesting
{
private:
    string words;

public:
    PNewTesting(const string & w = "Placement new testing");
};

PNewTesting::PNewTesting(const string & w)
{
    words = w;
    cout << words << " constructed" << endl;
}


int main()
{
    char * buffer = new char[BUF];

    PNewTesting *p1,*p2;

    p1 = new (buffer)PNewTesting;

    p2 = new PNewTesting("Placing object in heap");

    cout << "Memory addresses: " << endl;
    cout << "buffer: " << (void *)buffer << endl;
    cout << "object placed in buffer: " << p1 << endl;
    cout << "object in heap: " << p2 << endl;
}

部分讓我感到困惑,是當我寫cout << "buffer: " << &buffer << endl; ,這會給我一個與編寫cout << "buffer: " << (void *)buffer << endl;時不同的地址cout << "buffer: " << (void *)buffer << endl;

問題是&buffer(void*)buffer有什么區別,為什么它們每個都給我一個不同的地址。

您的問題基本上可以簡化為

#include<iostream>

int main()
{
    int i = 10;
    int *ptr = &i;

    std::cout<<(void*)ptr<<"\n";
    std::cout<<(void*)&i<<"\n";
    std::cout<< &ptr<<"\n";
}

輸出:

0xbfa080b8
0xbfa080b8
0xbfa080bc

ptr為您提供指針指向的對象地址,即與&i相同。
&ptr給出指針本身存儲位置的地址。

表達式&buffer將為您提供buffer的地址,該地址位於堆棧中的某個位置。

expresson (void *)buffer將為您提供緩沖區中包含的地址,作為一個空指針(在這種情況下,這意味着cout會將值打印為代表該指針的十六進制數,而不是嘗試進行打印)該值作為字符串,這將是代碼通常使用char *

其中一個顯示變量的地址,另一個顯示變量的值。 考慮這些:

int i = 7;
std::cout << &i << "\n";
std::cout << i << "\n";

前者顯示名為i的變量的地址(可能是較大的偶數)。 另一個顯示其值(7)。

類似地:

char *buffer;
std::cout << &buffer << "\n";
std::cout << (void*)buffer << "\n";

前者顯示buffer的地址。 后者顯示其轉換值。

區別很簡單。 buffer是一個指向字符的指針,因此(void*)buffer是分配的字符數組在內存中的位置(作為void指針)。 另一方面, &bufferbuffer 本身在內存中的位置。

圖表可能會有所幫助; 這象征着正在發生的事情,並不代表實際的內存布局將是什么樣子!

Memory
AB AB AB AB 00 00 00 08  <-- buffer = 00 00 00 08; the characters are stored starting at 0x08
             ^
             |---------     &buffer is the memory location of buffer, and is 0x04
30 31 32 32 AB AB AB AB
^
|-------- char array starts at 0x08, and contains the string "1234"

暫無
暫無

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

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