在C/C++中,字符数组和字符指针,理论上和整型、浮点型的数组和指针很相似,但是由于字符串的存在,使字符数组和字符指针变得复杂,往往使初学者感到困惑。
在C/C++程序中,存储一个字符串有两种方法,一是用字符数组实现,二是用字符指针变量实现。
char s1[] = "Hello world";
char *s2 = "Hello world";
s1是数组名,代表数组存储的首地址,是指针常量。s2是一个字符型指针变量,其指向字符串的首地址。
在C/C++中,字符串常量是按字符数组处理的,是在内存中开辟了一个字符数组来存放字符串常量,并将该字符串的首地址(即存放字符串的字符数组的首地址)赋给字符指针变量。
数组初始化
无论是静态,局部还是全局数组只有在定义时才能初始化,否则必须通过其它方法,比如用循环操作对数组的元素逐个赋值。
char s1[10] = {'a', 'b', 'c'}; //正确
char s2[10];
//s2[10] = {'d', 'e', 'f'}; //错误,此处的s2[10]是s2数组的第10个元素的下一个内存地址中的值。
int i;
for(i = 0; i < 10; i++)
{
s2[i] = 'a' + i; //通过for循环对s2数组逐一赋值,结果为 "abcdefghij".
}
另外,数组之间不能相互赋值,即不能使用赋值表达式将一个字符数组或一个字符串常量赋给另一个字符数组。
char s1[10] = {'a', 'b', 'c'};
char s2[10];
s2 = s1; // 错误
s2 = "abc";//错误
使用字符串赋值
数组名是一个地址常量,不允许改变,但是数组中的元素是变量,可以改变赋值。
char a[] = "hello"; //正确,"hello", 并非一个字符串常量,而是相当于一个初始化列表{'h','e','l','l','o','\0'}
char b[10]; b = "hello";//错误,数组名b虽然是指针,但也是常量(不允许更改),
// 已经指向在堆栈中分配的10个字符空间,再次让b指向数据区中的hello这个字符串常量,显然是不行的
char *sp;
sp = "abcd";
sp = "12345";// 正确,sp是指针变量,可以指向不同的字符串常量。
sp[2] = 'p'; // 错误,sp指向的是字符串常量,不能对其进行更改。