Đư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 char
trong 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 s0
là một con trỏ char
với thời lượng lưu trữ tự động (có nghĩa là biến s0
chỉ tồn tại cho phạm vi được khai báo) và sao chép địa chỉ của chuỗi ký tự ( 0x00008000
trong ví dụ này) vào nó. Lưu ý rằng kể từ khi s0
trỏ đế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 s1
là 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
.
s0
và s1
có 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.