一、字符指针可以指向一个字符串。
我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:
char *str = "This is a string.";
是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。
这里要注意字符指针与字符数组之间的区别。例如,有说明语句:
char string[ ]="This is a string.";
此时,string是字符数组,它存放了一个字符串。
字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,每个元素的值都可以改变。
例如下面的代码在运行期间将会出错:
1 #include <iostream> 2 using namespace std; 3 int main(void) 4 { 5 char str1[] = "C Language"; 6 char *str2 = "C Language"; 7 cout << "str1=" << str1 << endl; 8 cout << "str2=" << str2 << endl; 9 str1[1] = '-'; 10 str2[1] = '+';//出错!不能改变str所指的字符串常量 11 cout << "str1=" << str1 << endl; 12 cout << "str2=" << str2 << endl; 13 return 0; 14 }
如果改成如下的代码,将能正确运行:
1 #include <iostream> 2 using namespace std; 3 int main(void) 4 { 5 char str1[] = "C Language"; 6 char *str2 = "C Language"; 7 cout << "str1=" << str1 << endl; 8 cout << "str2=" << str2 << endl; 9 str1[1] = '-'; 10 str2 = "C++ Language";//可以改变str使它指向不同的字符串 11 cout<<"str1="<< str1 << endl; 12 cout<<"str2="<< str2 << endl; 13 return 0; 14 }
运行结果:
二、其它说明
1)以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:"abc",那么编译器帮你存储的是"abc "
2)"abc"是常量吗?答案是有时是,有时不是。
不是常量的情况:"abc"作为字符数组初始值的时候就不是,如:
char str[] = "abc";
因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为
char str[3] = {'a','b','c'};
又根据上面的总结1),所以
char str[] = "abc";
的最终结果是
char str[4] = {'a','b','c','