字符串
如果字符串文字中间没有间隔或者间隔的是空格符,ANSI C会将其串联起来。
char greeting[50] = "Hello, add" "how are" "you" "today!";
和
char greeting[50] = "Hello, and how are you today!";
是相等的。
字符串常量属于静态存储类(static storage)。静态存储是指如果在一个函数中使用字符串常量,即使多次调用了这个函数,该字符串在程序的整个运行过程中只存储一份。整个引号中的内容作为指向该字符串存储位置的指针。这一点与把数组名作为指向数组存储位置的指针类似。
字符串的初始化: 字符数组初始化;字符串指针初始化(指向字符串其实就是指向字符串的第一个字符)
数组形式 char string[6] = "hello" 通常,被引用的字符串存储在可执行文件的数据段部分:当程序被加载到内存中时,字符串也被加载到内存中。被引用的字符串被称为位于静态存储区。但是在程序开始运行后才为数组分配存储空间。这时候,把被引用的字符串复制到数组中。此后,编译器会把数组名string看作是数组首元素的地址&string[0]的同义词。在数组形式中string是个地址常量。您不能更改string,因为这意味着更改数组存储的位置(地址)。可以使用运算符string + 1来标识数组里的下一个元素,但是不允许使用++string。
指针形式 char * string = "hello" 也在静态存储区为字符串预留6个元素的空间。此外,一旦程序开始执行,还要为指针变量string另外预留一个存储位置,以在该指针变量中存储字符串的地址。这个变量初始时指向字符串的第一个字符,但是它的值是可以改变的。因此可以对它使用增量运算符,例如++string指向'e'
总之,数组初始化是从静态存储区把一个字符串复制到数组,而指针初始化只是复制字符串的地址。
char * msg = "hello";
msg[0] = "X"; //若允许
printf("%s\n", "hello"); //则打印 "Xello",导致所有使用了"hello"字符串常量的地方出现混乱
有些编译器确实允许这种用法,所以推荐
const char * msg = "hello" 这种用法