字符串的两种定义方式
char数组
char sa[] = “hello world”;
char指针
char *sp = “hello world”;
这两种方式都产生了一个”hello world”的字符串常量,字符串常量存储在静态存储区中,静态存储区中的内容在程序运行的整个过程中都存在,而且只存储一份。
数组与指针的关系
在第一种定义中,字符串常量在编译时就已经分配好了空间,但直到运行时才会为数组分配存储空间,这时,存储在静态存储区中的字符串常量会被拷贝一份到数组中,此后,数组名sa与&sa[0]等价。重要的是,sa是一个常量,你不能修改sa的值,你可以通过sa+1来标识数组里的下一个元素,也可以修改数组里的元素。然而,sa++是不允许的,因为自增运算符只能作用于变量而不是常量。
第二种定义中,程序运行时只为指针变量sp分配了存储空间,用来字符串常量”hello world”的地址,这时,字符串常量没有被拷贝。sp的值是可以改变的,如++sp将指向字符e。
总之,数组初始化是从静态存储区中把一个字符串拷贝给数组,而指针初始化只是复制这个字符串的地址。
示例
#include <stdio.h>
int main(int args, char **argv) {
char sa[] = "hello world";
char *sp = "hello world";
// sa++; 错误,sa是常量
sp++;
sa[1] = 'M';
*(sa+2) = 'X';
// sp[1] = 'M'; // 错误,不能修改常量值
printf("%s\n", sa);
}