2011-12-07 42 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

đầu ra:Địa chỉ của mảng

0045FB88 0045FB88 
0045FB88 0045FB7C 

Kết quả cho u có ý nghĩa.

Tôi hiểu rằng t&t[0] phải có cùng giá trị, nhưng cách thức đến &t cũng giống nhau? & t thực sự có nghĩa là gì?

+4

¤ Sự khác biệt duy nhất giữa 't' được chuyển thành con trỏ và' & t', là loại con trỏ. Tham chiếu của sau này là chính thức của kiểu mảng, do đó, thêm 1 để nó di chuyển nó khá một chút (đến mảng tiếp theo trong bộ nhớ).Trong khi tham chiếu của cựu là loại phần tử. Thuật ngữ: trong nhóm [comp.lang.C++] Usenet có một số tranh cãi về việc liệu một con trỏ như 'u' của bạn có thể được gọi là" trỏ tới "mảng đó, vì tham chiếu của nó không thuộc loại mảng. Điều đó đã được giải quyết gấp mười lần bằng cách chỉ vào việc sử dụng từ ngữ của tiêu chuẩn đó. Chúc mừng & hth., –

+0

@alf không phải là nó mà anh chàng paul trolling xung quanh với câu hỏi đó? –

+0

@ JohannesSchaub-litb: yes –

Trả lời

18

Khi t được sử dụng riêng trong biểu thức, việc chuyển đổi mảng-thành-con trỏ diễn ra, điều này tạo ra một con trỏ tới phần tử đầu tiên của mảng.

Khi t được sử dụng làm đối số của toán tử &, không có chuyển đổi như vậy diễn ra. Các & sau đó rõ ràng mất địa chỉ của t (mảng). &t là một con trỏ trỏ đến mảng tổng thể.

Phần tử đầu tiên của mảng có cùng vị trí trong bộ nhớ là khởi đầu của toàn bộ mảng và do đó hai con trỏ này có cùng giá trị.

+0

Cảm ơn! Tôi cho rằng đó là sự chuyển đổi từ mảng thành con trỏ ngầm, điều đó đã cho tôi suy nghĩ sai về 'u' là một con trỏ. – quuxbazer

+0

@quuxbazer: 'u' _is_ một con trỏ. 't' _is_ một mảng. 'int * u = t' áp dụng một chuyển đổi mảng thành con trỏ tới' t', và khởi tạo 'u' với kết quả. – Mankarse

+0

-1 đây là mô tả không chính xác cho C++ –

0

t là địa chỉ của mảng, &t là một con trỏ trỏ tới mảng, do đó địa chỉ được hiển thị giống hệt nhau.

Một tài liệu tham khảo tốt mà tôi đã tìm thấy là cplusplus forum giải thích khái niệm này rất tốt.

Như đã trình bày có khoảng &array:

Nó là một trong những trường hợp ngoại lệ mà luật không áp dụng. Nó lấy nó như một con trỏ đến mảng. Nó sẽ lại trỏ đến phần tử đầu tiên của mảng, nhưng nếu bạn thêm một phần tử vào con trỏ này, nó sẽ trỏ đến địa chỉ của địa điểm ngay sau phần tử cuối cùng của mảng (giống như bạn đã bỏ qua mảng).

+1

-1 "& t là tham chiếu đến địa chỉ đầu tiên của mảng" không chính xác –

+0

@ AlfP.Steinbach Làm thế nào? & t là một tham chiếu đến sự bắt đầu của khối bộ nhớ được sử dụng bởi mảng, do đó, một tham chiếu đến địa chỉ đầu tiên của mảng, trừ khi tôi trộn ý nghĩa của tôi bằng cách thay đổi từ ngữ? – Serdalis

+0

'& t' không phải là tham chiếu. nó là một giá trị con trỏ. lưu ý rằng bạn * có thể * có tham chiếu đến một mảng, nhưng '& t' không phải là. –

-2

Không có biến nào được gọi là t vì bạn không thể thay đổi. Tên t chỉ đề cập đến địa chỉ của phần tử đầu tiên (và cũng có kích thước được liên kết với nó). Do đó, lấy địa chỉ của địa chỉ không thực sự hợp lý, và C "sụp đổ" nó thành địa chỉ.

được cùng một loại điều xảy ra đối với trường hợp các chức năng:

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

này nên in những điều tương tự, vì không có biến giữ địa chỉ của foo, có địa chỉ lần lượt có thể được thực hiện.

+1

Đó là C++, và có biến được gọi là 't'. Bạn có thể chuyển nó tới hàm có chấp nhận đối số với kiểu 'int (&) [10]'. – Abyx

+3

-1 "Không có biến nào được gọi là t, vì bạn không thể thay đổi nó." không đúng. Một đối tượng được đặt tên trong một khai báo được gọi là một biến. Đi tra cứu tiêu chuẩn. –

3

Loại thực tế tint[10], vì vậy &t là địa chỉ của mảng.
Ngoài ra, int[] ngầm chuyển thành int*, vì vậy tchuyển đổi để giải quyết các mảng phần tử đầu tiên của mảng.

+2

Không, nó chuyển đổi thành địa chỉ của phần tử đầu tiên. Các vị trí bộ nhớ tuyệt đối giống nhau, nhưng các loại khác nhau. –

+0

@BenVoigt, vâng, cảm ơn. – Abyx

Các vấn đề liên quan