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、运行结果
