char str[] = {"Hello World!"}; //字符数组
//或者
char *str = "Hello World!"; //字符串常量 / 字符串指针
- 字符数组存储在全局数据区或栈区;
- 字符串常量存储在常量区。
- 字符数组有读写的权限,在定义后可读取和修改每个字符;
- 字符串常量只有读的权限,在定义后只能读取字符串中的字符,但不能修改。
- 字符数组只有在定义的时候可以一次性赋值,一旦定义完就只能一个个赋值;
- 字符串常量定义后虽然不能修改字符串中的字符,但是可以更改指针的指向(指向另一个字符串的首地址),可以对字符串常量整体重新赋值。
char str[] = {"Hello World!"};
str = "nihao!"; //错误
str[3] = 'a'; //正确
char *str = "Hello World!"; //定义char类型的指针变量str
str = "nihao!"; //正确,给字符串指针变量重新赋值"nihao!"首地址
str[3] = 'a'; //错误,不能修改字符串中的字符
- 获取用户输入的字符串是一个典型的写入操作,只能使用字符数组,不能使用字符串常量。
- 字符数组和字符串常量在输出字符的时候,都可以用:*(pstr+i) 、pstr [ i ] 、*(str+i) 、str [ i ] 进行输出。
printf("%s\n", str); // 直接输出字符串
for(i=0; i<len; i++)
{
printf("%c", *(pstr+i)); // 使用 *(pstr+i)
}
printf("\n");
for(i=0; i<len; i++)
{
printf("%c", pstr[i]); // 使用 pstr[i]
}
printf("\n");
for(i=0; i<len; i++)
{
printf("%c", *(str+i)); // 使用 *(str+i)
}
printf("\n");
for(i=0; i<len; i++)
{
printf("%c", str[i]); // 使用 str[i]
}
printf("\n");
for(i=0; i<len; i++)
{
printf("%c", (pstr-5)[i+5]); // 使用 (pstr-5)[i+5]
}
printf("\n");
for(i=0; i<len; i++)
{
printf("%c", (str-5)[i+5]); // 使用 (str-5)[i+5]
}
printf("\n");