C语言基础:C语言指针(6) - 指针和字符串

时间:2020-11-27 01:44:14
上一节我们讲到了指针和数组, 这次我们来讲解一下指针和字符串, 这次的内容和上一节有相似的地方, 也有全新学习的地方, 让我们一起来看看吧~~


下面我们来看一个小例子:

#include <stdio.h>

int main()
{
char name[] = "abcde";

name[0] = 'A';

printf("%s\n", name);

char *name2 = "it";

name2[0] = 'I';

printf("%s\n", name2);

return 0;
}


输出的结果:

C语言基础:C语言指针(6) - 指针和字符串


第一个输出的结果为Abcde, 第二个输出不了, 程序直接崩溃了, 这是为什么呢? 按照我们上一节课所学的内容, char *name2指向的地址是"it", 这是没错的, 但为什么不能修改呢? 让我们来仔细研究一下:

这里涉及到内存的问题, 我们来看看内存有几种常用的方式:

1. 常量区: 存放一些字符串常量, 比如像char *name2;

2. 栈: 存放局部变量, 比如像char name[];

3. 堆: 存放对象, 暂时没有学到


存放在栈里的变量, 是可以随意赋值修改的, 而存放在常量区里的是不能随意修改, 并且是会缓存起来, 等待随时调用.

比如:

char *name = "ab";

char *name2 = "ab";

其实上面两个指针变量的地址是一样的, 因为是存在常量区里, 当有变量调用, 常量区就会返回给变量调用, 如果没有调用, 则一直存放在常量区, 好处在于不用再重新给该常量字符串重新分配内存.


我们必须掌握定义字符串的两种知识:

 1> 利用数组

 char name[] = "abcd";

  * 特点:字符串里面的字符是存储在栈上, 是可以修改的

  * 使用场合:字符串的内容需要经常修改

 

 2> 利用指针

  char *name = "ABCD";

  * 特点:字符串其实是一个常量字符串,是存储在常量区里面的, 所以是不能修改

  * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

 

这次我们讲到这里, 下次我们继续~~~