C语言基础:C语言指针(6) - 指针和字符串
上一节我们讲到了指针和数组, 这次我们来讲解一下指针和字符串, 这次的内容和上一节有相似的地方, 也有全新学习的地方, 让我们一起来看看吧~~
其实上面两个指针变量的地址是一样的, 因为是存在常量区里, 当有变量调用, 常量区就会返回给变量调用, 如果没有调用, 则一直存放在常量区, 好处在于不用再重新给该常量字符串重新分配内存.
下面我们来看一个小例子:
#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";
* 特点:字符串其实是一个常量字符串,是存储在常量区里面的, 所以是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
这次我们讲到这里, 下次我们继续~~~