C Primer Plus:(第十一章)字符串和字符串函数


字符串的定义

  1. 字符串常量(string constant)(或说 字符串字面量(string literal))是静态存储类别(static storage class),如果函数中使用字符串常量,该字符串常量只会被存储一次,且在整个程序的生命周期内存在

  2. 把字符串看作指针:双引号括起来的内容视为指向该字符串存储位置的指针
    printf("%s %p %c", "str1", "str2", *"str3");%s直接打印出字符串str1%p打印出字符串str2的首地址, %c打印出 * "str3"指向的内容,字符 ‘s’
    char * s = "str";

  3. 字符串的声明:
    char str1[40] = "This is a string";char str1[10] = " 's' , 't' , 'r' , '\0' ";注意第二种必须加’\0’否则就是普通的字符数组,而不是一个字符串,也可以char s[] = "This is a string";自动确定长度(只能在初始化时,否则必须用常量定义长度)

  4. 字符串的数组形式与指针形式的区别: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);
	return
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值