#include<iostream>
using namespace std;
int main(){
char *s= "name";
cout<<s<<endl; //name
cout<<*s<<endl; //n
*s="you"; //错误
*s='y';
s="you";
cout<<s<<endl; //you
cout<<*s<<endl; //y
}
上述代码段执行结果已在其后注释中给中。
从这段代码中,可以看出:
1.字符指针在初始化时可以以串常量来赋值,但在其后编译器执行到 *s=“name” 时,显示报错。
错误显示
error: invalid conversion from 'const char*' to 'char' [-fpermissive]
语句*s='y'; 未出现报错,但运行时,若输出*s,编译器长时间无响应,无法输出预期结果。测试代码和结果为:
上述情况为直接对指针指向内容赋值。若改变指针地址,则结果为:
由此可见,当改变指针地址时,程序可正常执行。若对字符指针指向内容赋值,程序则无法正常运行。因此,字符指针可以且仅可在初始化时被赋值为串常量,此后该情况不成立。甚至指针指向内容被赋值为字符,程序也无法正常编译。
2.s作为指向字符数组首地址的字符指针,若输出s,则默认输出s指向地址的对应内存及其后内存块内容,即为字符数组全部内容。因此输出s的结果为 name。该情况在其他地方不成立,以整形指针为例:
输出p值时,仅代表该指针指向内存地址。与内容无关。而字符指针的情况正相反,输出s不会输出该地址,反而是指针指向的字符数组内容。此时,字符指针的含义与串变量名相近。
3.若输出*s,则为数组首地址内容,即为n。由此推理,若输出*(s+1),即为a。
4.由2得出,字符指针的作用与串变量名相近,因此可直接对s赋串常量,此时c++会自动创建动态字符数组。若为s赋值为另一指针地址,则s指向改地址。但该操作会使s原来指向的地址悬挂起来。