翁恺老师C语言学习笔记(十一)字符串_字符串常量

字符串常量

char* s = "Hello,world!"

我们先看一段代码

#include<stdio.h>

int main(void) {
	char *s = "Hello World";
	s[0] = 'B';

	printf("Here!s[0]=%c\n", s[0]);
	return 0;
}

我在这里编译时会报错,老师这里竟然时通过的,网上查了下,有两种方案,有几种方案,我是用了const 改变为常量

[Warning] deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

#include<stdio.h>

int main(void) {
	const char *s ="Hello World";
	//s[0] = 'B';
	const 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=00404000
s2=00404000
Here!s[0]=H

从这里我们可以看出,他们在内存中的地址是一样的,我们再添加一个i

#include<stdio.h>

int main(void) {
	int i=0;
	const char *s ="Hello World";
	//s[0] = 'B';
	const char *s2 ="Hello World";
	
	printf("i=%p\n", &i);
	printf("s=%p\n", s);
	printf("s2=%p\n", s2);
	printf("Here!s[0]=%c\n", s[0]);
	return 0;
} 

i=0062FE94
s=00404000
s2=00404000
Here!s[0]=H

这里可以看出i的地址比s和s2的地址要大很多,i是本地变量,它比较大,而s和s2很小它们存放在内存中的代码段
并且是只读属性,所以刚才我们那里有报错,因为是只读的不可修改的

字符串常量

char s =“Hello World”;
· s是一个指针,初始化为指向一个字符串常量;
**· 由于这个常量所在的地方,实际上s是const char
s,但是由于历史原因,IDE接受不带const的写法**
· 但是视图对s所指的字符串写入,会导致严重后果
· 如果想要修改则需要这样的写法
char s[] =“Hello World”;

下面我们来试试

#include<stdio.h>

int main(void) {
	int i=0;
	const char *s ="Hello World";
	//s[0] = 'B';
	const char *s2 ="Hello World";
	char s3[] = "Hello World";
	
	
	printf("i=%p\n", &i);
	printf("s=%p\n", s);
	printf("s2=%p\n", s2);
	printf("s3=%p\n", s3);
	s3[0] = 'B';
	printf("Here!s3[0]=%c\n", s3[0]);
	return 0;
} 

输出结果:

i=0062FE94
s=00404000
s2=00404000
s3=0062FE88
Here!s3[0]=B

我们看到s3也在一个比较大的地方,同时也是可以修改的
那么,当我们需要一个字符串的时候,我们该如何写了?

指针还是数组
· char *str = “Hello”;
· char word[] = “Hello”;
· 数组:这个字符串在内存固定区域地址
· 作为本地变量空间会被自动回收的
· 指针:这个字符串不知道在内存那一块
· 处理参数
· 动态分配内存空间

从这里可以得出:
如果要构造一个字符串,需要用数组
如果要处理一个字符串,需要用指针

char 是不是字符串*

· 字符串可以表达char*的形式
· char*不一定是字符串
· 本意是指向字符的指针,可能指向的是字符
· 只有它所指的字符数组有结尾的\0,才能说明它所指的是字符串

猜你喜欢

转载自blog.csdn.net/sevensolo/article/details/97612532