C++字符指针的特殊性

#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原来指向的地址悬挂起来。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值