char* 修改问题

不能修改!
关键问题是:
char *p="hello“; 
以这种方法初始化的字符串是常量字符串,所以不能修改。

char p[]="hello“;
这是变量,可以修改!
char *p=new char[6];
p="hello“; 
这也是变量,可以修改!
 
 
================================、
 

char *p = “hello”;

上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了

解释:

字符串常量”hello”出现在一个表达式中时,表达式使用的值就是这些字符所存储的地址,而不是这些字符本身

     所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。

 

char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的

如果写成char a[10]

然后 a = “hello” 这样就错误了。 

 

同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理

但是换成char a [10]

然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值不是地址。

 

代码测试

#include <stdio.h>

 

int main()

{

       char *p = "hello";

       printf("%s",p);

       char a[10];

       a = "hello";

       return 0;

}

error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'

        There is no context in which this conversion is possible

 

看到这样的错误提示,你是否会想到把char a[10]改成char a[6]呢

试一下,

error C2106: '=' : left operand must be l-value

这就和上边的分析同样的道理了,右边的是一个地址,而左边的是一个值

 

继续扩展问题:

在使用指针的时候,指针可以自增,而数组不能自增

是因为a是个常量,也就是说在声明一个指针时,编译器只给指针本身保留内存空间,而没有为指针分配内存空间。而数组就不同了,编译器给数组分配了空间,数组a的地址就是一个常量了,让常量自增这肯定是不行的

 

继续扩展:

      在指针自增的时候,编译器会自动识别类型,比如指针是指向int型的,想获取下一个的地址时,指针直接p++就行了,不要多此一举的p+4了

      特别需要注意的是,在void指针使用的时候,不能使用指针运算,应为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值