下面我们来看一个小例子:
#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;
}
输出的结果:
第一个输出的结果为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";
* 特点:字符串其实是一个常量字符串,是存储在常量区里面的, 所以是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
这次我们讲到这里, 下次我们继续~~~