1.字符串的特点
字符串的本质就是一个特殊的数组
数组中保存的都是字符,并且数组必须以\0结尾
2.如何定义字符串?
char str1[]={'l','z','f','\0'};
3.数组的特点
数组名保存的就是数组的地址,所以我们可以直接将数组名赋值给一个指针变量
4.正是因为如此,所以定义字符串有了第三种方式
char *str3="lzf";
5.通过指针变量接收字符串和通过数组变量接收字符串有什么区别?
通过数组变量接收字符串,这个字符串存储在栈中
通过指针变量接收字符串,这个字符串存储在常量区中
存储的区域不同
6.存储的区域不同带来的影响
6.1存储在栈中的数据,是可以修改的
6.2通过数组变量接收字符串,那怕字符串中的数据相同,每次定义也会重新分配存储空间
通过指针变量接收字符串,只要字符串中的数据相同,就只有第一次定义分配存储空间
通过指针变量接收字符串,只要字符串中的数据相同,就只有第一次定义分配存储空间
存储在常量区中的数据,是不能修改的
char *str3="lzf";
str3[2]='X';
printf("str3 = %s\n",str3);
上面不行,会报错,因为不能修改
总结:定义字符串的三种方式:
char str1[]={'l','z','f','\0'};
char str2[]="lzf";
char *str3="lzf";
字符串与指针的注意点
1.通过{}定义的字符串,不能直接赋值给指针变量
例如以下:
char *p1={'l','z','f','\0'};
只有通过“”定义的字符串,才能直接赋值给指针变量
2.如果在一个函数中通过数组保存了一个字符串,那么这个字符串不能作为函数的返回值,因为外界获取不到
如果在一个函数中通过指针保存了一个字符串,那么这个字符串可以作为函数的返回值,因为外界可以获取
通过数组保存的字符串存储在栈中
通过指针变量保存的字符串存储在常量区中
存储在栈中的数据有一个特点:离开作用域就会自动释放
存储在常量区中的数据有一个特点:只有程序结束才会释放
3.如果数组作为函数的参数,那么函数的形参最好写指针而不要写数组
结论:以后想在函数中返回一个字符串那么这个字符串就是以指针类型定义的。