字符串是以空字符(\0)结尾的char类型数组。如下程序,给出了字符串的声明定义方式。
void test(void) {
char words[MAXLENGTH] = "I am a string in an array.";
const char* pt1 = "something is pointing me.";
puts("Here are some strings.");
puts(MSG);
puts(words);
puts(pt1);
words[8] = 'p';
puts(words);
}
字符串定义都是使用双引号来进行定义的,单引号定义的是字符,双引号中的字符和编译器自动加入末尾的\0字符。
字符串常量属于静态存储类别,这说明,如果在函数中使用字符串常量,该字符串只会存储一次。
字符串存储在静态存储区,程序载入内存时,也载入了程序中的字符串,但是,程序在开始运行时,才会为其分配内存。此时,才会将字符串拷贝到数组中。此时字符串有两个副本,一个时静态内存区中的字符串字面量,另一个是存储在数组中的字符串。而指针形式,则会将字符串在静态区的地址拷贝给指针。
在静态存储区的字符串字面量被视为const数据。
void test1(void) {
char ar[] = MSG;
const char* pr = MSG;
printf("address of \"I am a symbolic string constant.\": %p \n", "I am a symbolic string constant.");
printf("address of ar: %p \n", ar);
printf("address of pr: %p \n", pr);
printf("address of MSG: %p \n", MSG);
}
输出:
address of "I am a symbolic string constant.": 00007FF77A209C88
address of ar: 000000FD6DD0F9E8
address of pr: 00007FF77A209C88
address of MSG: 00007FF77A209C88
可以使用指针形式来指向字符串进行使用,但是不要对指针形式字符串进行更改,这可能会引起错误(具体取决于编译器)。
void test2(void) {
const char* pr = MSG;
while (pr) {
printf("%c", *pr);
pr++;
}
printf("\nDone!");
}
可以使用字符串指针形式,在指针方式下,指针可以进行移动,但是,需要把循环条件写好,该方式下的循环条件并是一个合适方式,原因在于指针会一直移动下去(应该也是取决于编译器?)。
void test2(void) {
const char* pr = MSG;
while (*pr != '\0') {
printf("%c", *pr);
pr++;
}
printf("\nDone!");
}
该形式更好。