2012-04-21 65 views
5
char arr[3]; 
arr="hi";// ERROR 
cin>>arr;// and at runtime I type hi, which works fine. 

1) ai đó có thể giải thích cho tôi tại sao không?gán một mảng char vào chuỗi ký tự - C++

2) và chính xác là loại "hi", tôi biết nó được gọi là chuỗi chữ. nhưng nó chỉ là một mảng các ký tự?

3) không phải là cin >> arr; sẽ giống như gán arr cho những gì bạn gõ vào thời gian chạy?

Trả lời

6

Mảng trong C++ không phải là loại thực, chỉ là biểu diễn có cấu trúc của một chuỗi giá trị và không phải con trỏ nếu bạn thấy bất kỳ nơi nào (chúng phân rã thành con trỏ). Bạn không thể sử dụng chúng như bạn sẽ sử dụng các loại khác, bao gồm cả chuyển nhượng. Sự lựa chọn là thêm nhiều hỗ trợ cho mảng hoặc để giữ chúng đơn giản và nhanh nhất có thể. Sau này đã được chọn, đó là một trong những phân biệt C++ có từ một số ngôn ngữ khác.

Để sao chép một mảng, hãy sao chép từng phần tử một tại một thời điểm.

Trong C++ 11, có vùng chứa STL std::array. Nó được thiết kế để vừa với một mảng đồng bằng với quá tải của toán tử, cũng như liên quan đến phần còn lại của STL.

Một giải pháp thay thế tốt hơn là std::string. Nó kết hợp các hành vi mà bạn muốn và nhiều hơn nữa, và được thiết kế đặc biệt để giữ mảng ký tự.

"hi" là, như Konrad Rudolph chỉ ra, một const char [3].

Đối với cin nhập một mảng thô, không thể thực hiện theo phương tiện chuẩn vì không có quá tải được cung cấp cho cin với mảng. Nó có thể tạo ra quá tải của riêng bạn mặc dù. Tuy nhiên, tôi không chắc chắn làm thế nào bạn sẽ tài khoản cho các kích cỡ khác nhau của mảng mà có được thông qua, trừ khi bạn xác định nó cho một container biết kích thước của nó thay vì một mảng thô.

+0

Một lựa chọn tốt hơn nữa là 'std :: string'. – Cornstalks

+0

Rất tiếc, vâng quên nó là một mảng các ký tự^_^ – chris

+0

well thanks.but Im thực sự không tìm kiếm best.im chỉ cố gắng hiểu khái niệm này. Tôi biết trong thực sự lập trình tôi sẽ "nt sử dụng chuỗi kiểu C này. –

6

Nếu bạn muốn, bạn có thể tuyên bố:

char array[] = "hi!"; 

Tạo một mảng và 'khởi' lâu đến 4 byte, "hi!"

char const *array2 = "hey!"; 

Tạo một con trỏ tới bộ nhớ chỉ đọc, một chuỗi chữ

array2 = array; 

Bây giờ bạn có thể sử dụng con trỏ array2 để truy cập mảng một. Điều này được gọi là phân rã con trỏ; mảng và mảng2 không thuộc cùng một loại, mặc dù chúng có thể hợp tác ở đây. An mảng loại char "phân rã" thành con trỏ đến loại char.

array = array2; // ERROR 

Mảng không phải là con trỏ. Bạn đang nghĩ như một mảng là một con trỏ, khi thực sự, nó được phân bổ trước. Bạn đang cố gắng gán một địa chỉ, nhưng mảng [] đã có một "mã hóa cứng" khi nó được tạo ra và nó không thể thay đổi được.

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