Thắc mắc về con trỏ trong C++

Mình có đoạn code ngắn sau:

int* xuat() {
int* p;
p = new int();
int* q;
q = p;
p = NULL;
return q;// tai sao p va q cung tro toi mot dia chi, trong khi gan p = NULL tai sao q khong bang NULL luon
// va return q thi van  duoc nhu thuong.
}

Một phần liên quan tới java nhưng dù sao mình cx hỏi luôn: Sự khác biệt giữa lưu trữ bộ nhớ trên C++ và java là gì? Ví dụ như về lưu trữ đối tượng của chúng.

p = new int();

     p = 0x100100
     ↓
    [int] (địa chỉ: 0x100100)

q = p;

q = 0x100100

vì p là con trỏ nên giá trị của nó cũng là địa chỉ ô nhớ mà nó trỏ tới, suy ra

     p = 0x100100
     ↓
    [int] (địa chỉ: 0x100100)
       ↑
       q = 0x100100

p = NULL;

     p = 0x000000
   

    [int] (địa chỉ: 0x100100)
       ↑
       q = 0x100100

q vẫn trỏ tới [int] ban đầu, chả liên hệ gì tới p cả. q = p đơn giản là copy giá trị của p vào q chứ q ko phải là tên khác của p. Chừng nào viết int*& q = p; thì mới có vấn đề, lúc này q là “tên khác” của p, nên p thay đổi giá trị thì q cũng thay đổi giá trị theo

int*& q = p;

     p (hay còn gọi là q) = 0x100100
     ↓
    [int] (địa chỉ: 0x100100)

p = NULL;

     p (hay còn gọi là q) = 0x000000


    [int] (địa chỉ: 0x100100)
2 Likes

Rất rõ ràng, cảm ơn bạn và nếu có thể bạn trình bày giúp mình việc lưu trữ đối tượng của class trong C++ và java co gì khác nhau.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?