字符串

如果字符串文字中间没有间隔或者间隔的是空格符,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"  这种用法

 

posted @ 2014-09-02 11:15  挨踢淫才  阅读(187)  评论(0编辑  收藏  举报