C语言指针易错点—字符数组与字符指针
- 字符数组与字符指针的区别
- 字符数组与字符指针的区别举例
- 字符指针必须先赋值,后引用
字符数组与字符指针的区别
因为字符数组与字符指针都可以表示字符串,但他们不是等价的。下面就来讲讲他们的区别。
char sa[ ] = "This is a string";
char *sp = "This is a string";
二者都是用字符串"This is a string"来初始化,第一个定义创建字符数组sa,它的元素依次是:‘T’ ‘h’ ‘i’ …
第二个定义创建一个指针变量sp指向 常量区字符串 “This is a string”
对于字符数组sa,系统首先为数组分配足够的内存空间,然后将"This is a string"里面的字符逐个存入数组
,并加字符串结束符号’\0’
这就相当于 char sa[]= {'T','h',........,'\0'}
这样
如果要改变数组sa所代表的字符串,只能改变数组元素的内容,如sa[0]=‘t’;
不能修改数组名以及赋值,它是常量
对于字符指针sp来说,这就相当于一个指针变量指向一个字符串常量 “This is a string” 的 首地址
。
如果要改变指针sp所代表的字符串,只能改变指针的值,让它指向新的字符串,不能改变其元素,如sp[0]=‘t’;非法内存访问。字符串常量”This is a string"不允许修改。
就是说字符串是常量,不能修改里面元素,可以改变指针的指向改变内容,或者使用字符串函数strcpy等
字符数组与字符指针的区别举例
char sa[ ] = “This is a string”;
char *sp = “This is a string”;
-
问题1:把sa和sp中的‘T’变为’t’
sa[0]=‘t’; //合法
sp[0] = ‘t’; //非法内存访问。字符串常量不允许被修改
应该用:char *sp=“this is a string”; -
问题2: 把字符串sa和sp的内容改为: “Hello”
sp=“Hello”;
sa=“Hello” //非法,数组名是常量,不能对它赋值
应该用:strcpy(sa,“Hello”);
字符指针必须先赋值,后引用
定义字符指针后,如果没有赋值,指针的值不确定,会很危险,会造成非法内存访问,形成 野指针
例如:
char *s;
scanf("%s",s); //非法内存使用
所以字符指针变量常用的方法是
- 指向已经存在的字符数组首地址。
- 指向一个动态分配的内存块
扩展练习: 判断实数相同