一、字符数组
初始化
char str1[10]="Hello";
char str2[]="World";
char str3[]={'H','e','l','l','o'};
只能对字符数组元素的赋值,而不能用赋值语句对整个数组赋值,如:
char str4[10];
str4={'H','e','l','l','o'}; // 错误
str4="Hello"; // 错误
str4[0]='H';str4[1]='e';str4[2]='l';str4[3]='l';str4[4]='o'; // 正确
二、字符指针
char *p="nihaoya";
三、区别
char ss[]="C++";
ss[0]='c'; // 合法
char *p="C++";
p[0]='c'; // 合法但不正确
该段代码在VS2010下编译可以通过,但是运行时程序会停止工作,为什么呢?原因在于p[0]='c'这一语句。该语句试图修改p指向的字符串的首个字符,出现了错误。
原因在于两种方式对字符数组操作的机制不同。使用char *p="C++"语句后,编译器在内存的文字常量区分配一块内存,
保存”C++“这一字符串字面值,然后在栈上分配内存保存p,p的内容为"C++"的地址。p[0]='c'试图修改常量”C++“,
程序当然就会崩溃了。而char ss[]="C++"语句,定义了一个数组,编译器为其在栈上分配了内存空间,因而可以进行修改操作。
因此,可以总结如下:
(1)char ss[]定义了一个数组,ss可认为是一个常指针,ss不可改变,但ss指向的内容可以发生改变。
(2)char *p定义了一个可变指针,p可以指向其它对象。但对于char *p=”abc“这样的情况,p指向的是常量,故内容不能改变。