C语言程序设计 学习笔记 字符串(I)

字符数组:

char word = ['h','e','l','l','o','w','o','r','l','d','!'];

这是一个字符数组,它的单元是word[0] = h,word[1] = e,word[2] = l……
但是这不是C语言的字符串,因此不能用字符串(接下来会讲)的方式计算。

字符串应该是这样:

char word = ['h','e','l','l','o','w','o','r','l','d','!','\0'];

在最后单元word[11] = ‘\0’;有这个才是C语言的字符串(这个word[11]不计数)

字符串
·以0(整数0)结尾的一串字符
·0或’\0’是一样的,但是和’0’不同
·0表示字符串的结束,但它不是字符串的一部分
·计算字符串长度的时候不包含这个0
·字符串以数组的形式存在,以数组或指针的形式访问
·更多的是以指针的形式
·string.h里有很多处理字符串的函数

·C语言的字符串是以字符数组的形态存在的
·不能用运算符对字符串做运算
·通过数组的方式可以遍历字符串
·唯一特殊的地方是字符串字面量可以用来初始化字符数组

字符串变量

char *str = “Hello”;
char word[] = “Hello”;
char line[10] = “Hello”;

上述均是字符串变量的表达形式
对于第三条,这个字符串在数组中占6个位置(hello+\0)
只要声明字符串变量,系统都会在其后面生成一个\0

10.1-2 字符串变量专题
在上节课说明了,

char *str = “Hello”;

是一个代表字符串的指针,也就是数组,那么我们做如下操作会发生什么事情呢?

#include<stdio.h>
int main(){
	char *s = "Hello,World";
	s[0] = 'B';
	
	printf("Here!s[0] = %c\n",s[0]);
	
	return 0;
} 

乍看之下没什么问题,但是实际上并未运行成功,系统报错:

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char *s = “Hello,World”;

可见对于s,不能用数组的操作强行给他赋值,那此时再看看它的地址,并且我们再来一个*s2,也看看它的地址如何:

#include<stdio.h>
int main(){
	char *s = "Hello,World";
	//s[0] = 'B';
	char *s2 = "Hello,World";
	
	printf("s = %p\n",s);
	printf("s2= %p\n",s2);
	
	printf("Here!s[0] = %c\n",s[0]);
	
	return 0;
} 

结果是:

s = 0000000000404000
s2= 0000000000404000

s和s2被赋予了相同的地址。

extra:这时候我们再声明一个int i = 0,查看它的地址,此时i的地址是:

i = 000000000062FE3C

i的地址与s和s2距离非常远,并不是堆栈放置了,以后会再提。

回到之前的问题,对于i,s,s2,它们的地址存放是这样的:
在这里插入图片描述
(此处s和s2位置应该调换,翁恺写错了)
s是“Hello,world\0”,这指向了一个较远的地方的地址,叫做代码区
s2由于内容和s相同,所以它们指向了一个相同的地址
对于代码区,这块地方是只读的(只能进行读入操作,不能进行写入),所以当我们想执行s[0] = 'B’的时候,计算机会报错。

综上,对于s,再进行一次总结:

char *s = "Hello,World";

s是一个指针,初始化为指向一个字符串常量
由于这个常量所在的地方(代码区),所以实际上s是const char *s,由于历史原因,编译器接受不带const的写法
试图对s所指的字符串做写入会导致严重的后果

如果要修改字符串,应该用数组:

char s[] = "Hello,World";

看到弹幕上的一句评论,非常有道理:
数组是常量形式的指针,是不能被重新赋值的指针
既然如此,我们再在代码中添加一句数组定义的字符串,并且查看地址,此时是:

i = 62fe3c
s = 404000
s2= 404000
s3= 62fe30

此时s3和i就是在堆栈里面的变量了,其保存形式就和普通数组一样,一个一个存
那么,在使用过程中应该如何判断使用指针还是数组呢?:
数组:这个字符串就在堆栈里
作为本地变量,空间会自动被回收
指针:这个字符串不知道在哪里
常用于处理参数、动态分配空间(如果你的字符串是通过malloc得到的,那么当然是应该要用指针)
构造一个字符串–>数组
处理一个字符串–>指针

char是字符串吗?
·字符串可以表达为char
的形式,但是char不一定是字符串
其本意是指向字符的指针,可能指向的是字符的数组(如int
),只有它所指的字符数组有结尾的\0,才能说它所指的是字符串

字符串常量
“Hello”
·它会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
·两个相邻的字符串常量会被自动连接起来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值