字符串和字符串函数
字符串的定义
-
字符串常量(string constant)(或说 字符串字面量(string literal))是静态存储类别(static storage class),如果函数中使用字符串常量,该字符串常量只会被存储一次,且在整个程序的生命周期内存在
-
把字符串看作指针:双引号括起来的内容视为指向该字符串存储位置的指针
printf("%s %p %c", "str1", "str2", *"str3");
:%s
直接打印出字符串str1
,%p
打印出字符串str2
的首地址,%c
打印出* "str3"
指向的内容,字符 ‘s’
char * s = "str";
-
字符串的声明:
char str1[40] = "This is a string";
或char str1[10] = " 's' , 't' , 'r' , '\0' ";
注意第二种必须加’\0’否则就是普通的字符数组,而不是一个字符串,也可以char s[] = "This is a string";
自动确定长度(只能在初始化时,否则必须用常量定义长度) -
字符串的数组形式与指针形式的区别:
char s[];
&char * s;
- 区别1:数组形式数组名不可以++,指针形式可以
数组形式中: s数组名,是地址常量,不能更改,否则就改变了数组的存储位置,可以用s + 1
这样的操作,但不允许++s
,递增运算符只能用于变量名前(可修改的左值),不能用于常量,见上一章练习题3
char s1[] = "Hello World";
++s1;
[Error] lvalue required as increment operand
而指针形式:会额外为指针变量留出一个存储位置,可以对指针++
总之:数组名是常量(右值),指针是变量(左值),数组名可以赋值给指针,反之不行
- 区别2:数组可以修改字符串内容,而指针形式不可
字符串字面量:如"Hello World"
被视为const数据
指针形式:初始化时只是将其地址赋给指针,相等于指针指向的是const型字符串,不可对齐修改(是一种未定义行为:编译器可能会将所以一样字面量的字符串存在同一位置(母体),指针可以修改的化,一下把所有的都改了)
char * s2 = "Byebye World";
s2[2] = '3';
[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
建议使用:
const char * s = "str";
来用指针初始化
而数组形式:初始化时将整个字符串从静态存储区拷贝到数组中(首地址改变),可以对其修改
静态数据使用的内存 (str) 与 动态内存(数组s) 区域不同
#include <stdio.h>
#define str "Hello World"
int main(){
char s[] = str;
const char * ptr = str;
printf("add_str = %p;\nadd_ptr = %p;\nadd_s = %p;", str, ptr, s);