2009-02-01 35 views
13

Tôi đang sử dụng C++ để hiểu chính xác con trỏ hoạt động như thế nào. Tôi có đoạn mã này sử dụng mảng, mà tôi đang sử dụng chỉ để hiểu cách hoạt động tương đương với con trỏ.Tại sao cout in mảng char khác với các mảng khác?

int main() {  
    int arr[10] = {1,2,3};  
    char arr2[10] = {'c','i','a','o','\0'}; 
    cout << arr << endl; 
    cout << arr2 << endl; 
} 

Tuy nhiên khi tôi chạy này, arr kết quả đầu ra địa chỉ của phần tử đầu tiên của mảng ints (như dự kiến) nhưng arr2 không ra địa chỉ của phần tử đầu tiên của mảng ký tự; nó thực sự in "ciao".

Tôi đang thiếu gì hoặc chưa học được điều này?

Trả lời

28

Đó là toán tử < < bị quá tải cho const void* và cho const char*. Mảng char của bạn được chuyển đổi thành const char* và chuyển đến quá tải đó, vì nó phù hợp hơn với const void*. Tuy nhiên, mảng int được chuyển đổi thành const void* và chuyển sang phiên bản đó. Phiên bản của nhà điều hành < < lấy const void* chỉ xuất ra địa chỉ. Phiên bản lấy const char* thực sự xử lý nó giống như một chuỗi C và xuất mỗi ký tự cho đến khi ký tự null kết thúc. Nếu bạn không muốn điều đó, chuyển đổi mảng char của bạn để const void* một cách rõ ràng khi đi qua nó để điều hành < <:

cout << static_cast<const void*>(arr2) << endl; 
+1

Theo [this] (http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/), nó chỉ bị quá tải cho khoảng trống *. Điều đó có nghĩa là nó có thể xác định nếu con trỏ trỏ đến ký tự, và nếu như vậy nó sẽ tìm ký tự đầu cuối và in chuỗi? (vẫn còn một chút stumped) – rmp251

+3

@ rmp251: Missed [những] (http://www.cplusplus.com/reference/ostream/ostream/operator-free/)? –

0

Có quá tải tiêu chuẩn cho char * xuất ra chuỗi kết thúc NUL.

4

Vì cout operator << bị quá tải cho char* đối với chuỗi đầu ra và arr2 khớp với chuỗi đó.

Nếu bạn muốn địa chỉ, hãy thử truyền mảng ký tự dưới dạng con trỏ trống.

0

Trong khi đúc có lẽ là một cách tiếp cận có ý nghĩa hơn, bạn cũng có thể sử dụng toán tử AddressOf:

cout << &arr2 << endl; 
+0

Có thể muốn '& arr2 [0]' thay vì '& arr2' ở đây –

+0

Đó là những địa chỉ giống nhau, Shawley. –

+0

Một mảng trong C/C++ chỉ là một loạt các vị trí bộ nhớ. Vì vậy, địa chỉ của mảng là địa chỉ của phần tử đầu tiên. Tự hỏi tại sao điều này đã được bình chọn xuống – Mystic

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