Sự khác biệt giữa char s [] và char * s là gì?

Đưa ra các tuyên bố

char

*

s0

=

"hello world"

;

char

s1

[]

=

"hello world"

;

giả sử bản đồ bộ nhớ giả thuyết sau:

                    0x01 0x02 0x03 0x04
        0x00008000: 'h' 'e' 'l' 'l'
        0x00008004: 'o' '' 'w' 'o'
        0x00008008: 'r' 'l' 'd' 0x00
        ...
Sđd: 0x00010000: 0x00 0x00 0x80 0x00
s1: 0x00010004: 'h' 'e' 'l' 'l'
        0x00010008: 'o' '' 'w' 'o'
        0x0001000C: 'r' 'l' 'd' 0x00

Chuỗi ký tự "hello world"là một mảng gồm 12 phần tử char( const chartrong C ++) với thời lượng lưu trữ tĩnh, nghĩa là bộ nhớ cho nó được cấp phát khi chương trình khởi động và duy trì cho đến khi chương trình kết thúc. Cố gắng sửa đổi nội dung của một chuỗi ký tự gọi các hành vi không xác định.

Dòng

char

*

s0

=

"hello world"

;

định nghĩa s0là một con trỏ charvới thời lượng lưu trữ tự động (có nghĩa là biến s0chỉ tồn tại cho phạm vi được khai báo) và sao chép địa chỉ của chuỗi ký tự ( 0x00008000trong ví dụ này) vào nó. Lưu ý rằng kể từ khi s0trỏ đến một chuỗi chữ, nó không nên được sử dụng như một cuộc tranh cãi với bất kỳ chức năng mà sẽ cố gắng sửa đổi nó (ví dụ, strtok(), strcat(), strcpy(), vv).

Dòng

char

s1

[]

=

"hello world"

;

định nghĩa s1là một mảng gồm 12 phần tử char(độ dài được lấy từ chuỗi ký tự) với thời lượng lưu trữ tự động và sao chép nội dung của chữ sang mảng. Như bạn có thể thấy từ bản đồ bộ nhớ, chúng tôi có hai bản sao của chuỗi "hello world"; sự khác biệt là bạn có thể sửa đổi chuỗi chứa trong s1.

s0s1có thể hoán đổi cho nhau trong hầu hết các bối cảnh; đây là trường hợp ngoại lệ:

sizeof

s0

==

sizeof

(

char

*)

sizeof

s1

==

12

type of

&

s0

==

char

**

type of

&

s1

==

char

(*)[

12

]

// pointer to a 12-element array of char

Bạn có thể gán lại biến s0để trỏ đến một chuỗi ký tự khác hoặc đến một biến khác. Bạn không thể gán lại biến s1để trỏ đến một mảng khác.