From d80edbe5d116671c51a33ab9b621e455b50ec108 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 4 Oct 2021 20:01:20 +0800 Subject: [PATCH] docs(string): edit text --- docs/string.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/string.md b/docs/string.md index d8c2a9e..0378b59 100644 --- a/docs/string.md +++ b/docs/string.md @@ -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];