20、指针与字符串

1、指针与字符串

在之前字符串的章节中,提到字符串是由至少一个字符所组成的一维数组。而数组和指针之间又有密不可分的联系。从这个角度进行逻辑推断,字符串和指针应该也存在某些关系。

2、源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int main()
{
char s[] = "hello";
char* ss = "hello";
for (int i = 0; i < 6; ++i)
{
if( s[i] == '\0' ){
printf("已结束\n");
}else{
printf("%c\n",s[i]);
}
}
printf("====================================\n");
for (int i = 0; i < 6; ++i)
{
if( ss[i] == '\0' ){
printf("已结束\n");
}else{
printf("%c\n",ss[i]);
}
}
return 0;
}
3、运行结果

运行结果

4、字符串定义方式差异
4.1、源码
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>

int main()
{
char s[] = "hello";
char* ss = "hello";
s[0] = 'u';
ss[0] = 'x';
return 0;
}
4.2、运行结果

运行结果

4.3、这里用gdb查看运行过程

运行结果
也就是说,在修改变量ss中的首地址的内容时报错。

5、内存区域划分
名称 作用
常量区 存放一些常量字符串
存放对象
存放局部变量

当我了解了 常量区这个概念。反过来就能够理解,char* ss = “hello”;其实就是把字符串”hello”,放在常量区。这样如果,有其它变量也需要时,则无需重新开辟,直接使用即可。因此它无法被修改.

6、总结
  • 定义字符串的几种方式
    利用数组
    char s[] = “hello”;
    特点: 字符串里面的字符是可以被修改的

利用指针
char *ss = “hello”;
特点: 字符串其实是一个常量字符串,里面的字符是不能被修改

7、指针字符串数组
7.1、代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int main()
{
// 普通的字符串数组
char s[2][10] = {"hello","world"};

// 字符串指针数组
char* ss[2] = {"hello","world"};

for (int i = 0; i < 2; ++i)
{
printf("s[%d]=%s\n",i,s[i]);
printf("ss[%d]=%s\n",i,ss[i]);
}
return 0;
}
7.2、运行结果

运行结果