2014-11-07 18 views
10
#include <iostream> 

int main() 
{ 
    int a[3][3] = {{22, 33, 44}, {55, 66, 77}, {88, 99, 100}}; 
    std::cout << a[1] << '\n' << a + 1 << '\n' << *(a + 1); 
} 
0x0013FF68 
0x0013FF68 
0x0013FF68 

Tại sao a+1 == *(a+1)?Tại sao một +1 == * (a + 1) trong ví dụ này?

+0

này có thể giúp: http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html –

+4

@AndyG, '* (a + 1)' là 'a [1]', không phải 'a [1] [0]'. –

Trả lời

15

a + 1 là địa chỉ của phần tử thứ hai trong a và cũng có thể được viết là &a[1] (tương đương với &*(a + 1) theo định nghĩa).

*(a + 1) là một giá trị tham chiếu đến mảng thứ hai. Nó tương đương với a[1] theo định nghĩa.
Cũng giống như với bất kỳ mảng nào khác để phân rã con trỏ, giá trị này phân rã thành con trỏ đến phần tử đầu tiên của mảng mà nó đề cập đến, tức là nó phân rã thành &a[1][0]. Nhưng điều đó tương đương với địa chỉ của chính đối tượng mảng đó. Vì vậy, giá trị giống như giá trị của &a[1] ... đó chính là cách chúng tôi xác định giá trị của biểu thức a + 1 ở trên.

Lưu ý rằng mảng bị phân rã thành con trỏ vì đối sánh tốt nhất cho lần chèn thứ hai là operator<<(void const*). Cân nhắc

int (*p1)[3] = a + 1; 

int (&p2)[3] = *(a + 1); // We could also have written *p1 

int* p3 = p2; // The array-to-pointer decay 

assert(static_cast<void*>(p1) == static_cast<void*>(p3)); 
Các vấn đề liên quan