mirror of
https://github.com/wangdoc/clang-tutorial.git
synced 2026-02-11 14:45:43 +08:00
docs(string): edit text
This commit is contained in:
@@ -95,7 +95,7 @@ char* s = "Hello, world!";
|
||||
char s[] = "Hello, world!";
|
||||
```
|
||||
|
||||
上面示例中,编译器会将数组`s`指定为14,正好容纳后面的字符串。
|
||||
上面示例中,编译器会将数组`s`的长度指定为14,正好容纳后面的字符串。
|
||||
|
||||
字符数组的长度,可以大于字符串的实际长度。
|
||||
|
||||
@@ -131,7 +131,7 @@ char s[] = "Hello, world!";
|
||||
s[0] = 'z';
|
||||
```
|
||||
|
||||
为什么字符串声明为指针时不能修改,声明为数组时就可以修改?原因是声明为指针时,字符串是一个保存在内存“栈区”(stack)的常量,“栈区”的值由系统管理,一般都不允许修改;声明为数组时,字符串的副本会被拷贝到内存“堆区”(heap),“堆区”的值由用户管理,是可以修改的。
|
||||
为什么字符串声明为指针时不能修改,声明为数组时就可以修改?原因是系统会将字符串的字面量保存在内存的常量区,这个区是不允许用户修改的。声明为指针时,指针变量存储的只是一个指向常量区的内存地址,因此用户不能通过这个地址去修改常量区。但是,声明为数组时,编译器会给数组单独分配一段内存,字符串字面量会被编译器解释成字符数组,逐个字符写入这段新分配的内存之中,而这段新内存是允许修改的。
|
||||
|
||||
为了提醒用户,字符串声明为指针后不得修改,可以在声明时使用`const`说明符,保证该字符串是只读的。
|
||||
|
||||
@@ -168,7 +168,9 @@ s = "abc"; // 错误
|
||||
|
||||
上面示例中,不能直接把字符串赋值给字符数组变量,会报错。原因是字符数组的变量名,跟所指向的数组是绑定的,不能指向另一个地址。
|
||||
|
||||
解决方法就是使用 C 语言原生提供的`strcpy()`函数,通过字符串拷贝完成赋值。
|
||||
为什么数组变量不能赋值为另一个数组?原因是数组变量所在的地址无法改变,或者说,编译器一旦为数组变量分配地址后,这个地址就绑定这个数组变量了,这种绑定关系是不变的。C 语言也因此规定,数组变量是一个不可修改的左值,即不能用赋值运算符为它重新赋值。
|
||||
|
||||
想要重新赋值,必须使用 C 语言原生提供的`strcpy()`函数,通过字符串拷贝完成赋值。这样做以后,数组变量的地址还是不变的,即`strcpy()`只是在原地址写入新的字符串,而不是让数组变量指向新的地址。
|
||||
|
||||
```c
|
||||
char s[10];
|
||||
|
||||
Reference in New Issue
Block a user