2016-04-11 14 views
6

Tôi vừa thử mã này:Trong C + +, làm dereferencing và nhận được chỉ số không làm cùng một tihng?

int i = 33; 
int * pi = &i; 
cout << "i: " << *pi << endl; 
cout << "i: " << pi[0] << endl; 

Cả hai dòng đều trả về cùng một thứ.

Về cơ bản, nếu tôi lấy chỉ số bằng 0 của bất kỳ con trỏ nào, tôi sẽ nhận được giá trị của loại chính xác tại vị trí của con trỏ. Đó không phải là điều tương tự như dereferencing?

Mỗi lần con trỏ được tham chiếu trong C++, sẽ không nhận được chỉ mục 0 cũng hoạt động không? Tôi không đề nghị bất cứ ai thực sự nên làm điều đó, nhưng tôi nghĩ rằng nó sẽ làm việc. Phải không?

+0

Tôi nên nghĩ như vậy, nhưng tôi không chắc chắn. Giải phóng luật sư ngôn ngữ. – wally

+5

Điều đó đúng trong C. Điều đó đúng trong C++ nếu bạn không khai thác quá tải. – zneak

+0

Khi ** pi = & i ** để tôi sử dụng lại __ * pi__. Bạn có * pi = & i, đó là hai hướng. –

Trả lời

11

Bỏ qua các nhà khai thác quá tải, có một trường hợp có sự khác biệt, và đó là rvalues ​​mảng hậu DR1213:

using arr = int[2]; 
arr&& f(); 
int&& b = *f(); // error, *f() is an lvalue, doesn't bind to int&& 
int&& c = f()[0]; // OK, subscript applied to array rvalue results in an xvalue 

Tôi không biết về bất kỳ trình biên dịch mà thực hiện Nghị quyết rằng, mặc dù. Nhưng nó nên được thực hiện cuối cùng.

+0

+1. Tôi chỉ nhận ra rằng tôi đã không trích dẫn hoàn toàn '5.2.1'. Đã sửa. – AlexD

7

Giả sử không có quá tải toán tử, chúng gần như giống nhau.

[C] 6.5.2.1 Mảng subscripting:

E1[E2] giống hệt (*((E1)+(E2)))

[C++] 5.2.1 Subscripting:

Khái niệm E1[E2] giống hệt nhau (theo định nghĩa) đến *((E1)+(E2)) ..., ngoại trừ trường hợp của toán hạng mảng, kết quả là giá trị nếu toán hạng đó là một lvalue và xvalue nếu không.

Xem số lớn answer của @ T.C về phần cuối cùng.

+0

Tại sao lại là downvote? – AlexD

+0

Rất vui được xem tham khảo thực tế về tiêu chuẩn. Điều đó có nghĩa là 'E1 [E2]' giống với 'E2 [E1]' không? – wally

+0

@ T.C. Oh, quả thật vậy! Đã sửa. BTW, downvote đến _before_ Tôi đã chỉnh sửa và thêm câu đầu tiên). – AlexD

4

Đối với con trỏ, chúng sẽ cho kết quả tương tự.

Thời gian duy nhất mà chúng có thể khác nhau là nếu bạn áp dụng chúng theo loại do người dùng xác định, quá tải operator*()operator[](int) khác nhau (hoặc không phải loại kia, trong trường hợp này bạn sẽ gặp phải lỗi biên dịch).

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