- Sự khác nhau giữa những mảng sử dụng mảng [0] và * là gì?
- Tại sao nên được ưu tiên?
- Chúng khác nhau trong C++?
(1) Không có sự khác biệt trong C. Không có sự khác biệt cho một mảng thực tế trong C++.
(2) Không có cơ sở kỹ thuật để thích cái này hay cái kia, nhưng người mới có thể bị nhầm lẫn bởi sự dereference của con trỏ.
(3) Trong C++, bạn thường không sử dụng macro vì nó rất không an toàn. Nếu bạn vượt qua trong một con trỏ thay vì một mảng thô thực tế, mã sẽ biên dịch nhưng mang lại kết quả không chính xác. Vì vậy, trong C++ bạn nên/thay vào đó nên sử dụng một mẫu chức năng, như & hellip;
#include <stddef.h>
typedef ptrdiff_t Size;
template< class Type, Size n >
Size countOf(Type (&)[n]) { return n; }
Chỉ chấp nhận mảng thô thực tế làm đối số.
Đó là một phần của bộ ba chức năng startOf
, endOf
và countOf
rằng rất thuận tiện để xác định để chúng có thể áp dụng cho cả mảng thô và vùng chứa thư viện chuẩn. Theo như tôi biết bộ ba này lần đầu tiên được xác định bởi Dietmar Kuehl. Trong C++ 0x startOf
và endOf
hầu hết sẽ có sẵn dưới dạng std::begin
và std::end
.
Chúc mừng & hth.,
Nguồn
2010-12-11 06:36:04
Điều đó cực kỳ khó hiểu chỉ để bảo vệ chống lại việc sử dụng sai trong C++, xem xét rằng cái gì khác nên được sử dụng trong C++ anyway. –
Bạn nói đúng rằng điều này không nên được sử dụng trong C++, nhưng bit cung cấp một số sự an toàn đặc biệt cho C++ không thực sự quá khó hiểu (nó chỉ là việc lập chỉ mục bất thường). Các phần bảo vệ thực sự khó hiểu chống lại một số loại lạm dụng trong C mà thực sự là khá khó khăn để bảo vệ chống lại (và vĩ mô thậm chí không hoàn hảo bảo vệ chống lại lạm dụng này). Việc lạm dụng nó bảo vệ chống lại (đi qua một con trỏ thay vì một đối số mảng) xảy ra thường xuyên mà nó trả tiền để có sự phức tạp. Được bao bọc trong một macro, sự phức tạp không phải là quá nhiều của một vấn đề (và macro này ít khó hiểu hơn nhiều so với tôi gặp phải). –
Loại địa ngục nào là '0 [x]'? Bạn có thể làm điều đó? –