char* 修改问题
来源:互联网 发布:wifi破解软件电脑版 编辑:程序博客网 时间:2024/05/21 08:59
不能修改!关键问题是: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++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型
- char* 修改问题
- char* 指向内容不能修改的问题
- char*指向内容不能修改的问题
- char* 指向内容不能修改的问题(整理)
- char* 指向内容不能修改的问题(整理)
- char* 指向内容不能修改的问题(整理)
- char修改成varchar2
- char* 指向内容不能修改
- char *遇到的问题
- const char* const 问题
- const char*的问题
- CString 转char[] 问题
- printf char*问题
- char data[0]问题
- char* 和 char[]初始化的问题
- C++ char[] 和 char* 引发的问题
- char *p和char p[]的问题
- char[] char数组 char*返回值的问题
- android xmlReader解析RSS(中文乱码解决)
- 记住!房子千万不要这样装
- YII中在CDetailView中结合CHtml::image()实现图片的查看
- vijos1101题解
- 在kernel的中重启kernel
- char* 修改问题
- 蓝桥杯基础练习--十六进制转八进制
- codeforces div2 round#231 A
- Delphi的format使用总结
- 空间更宽阔港口股份控股
- 多研究些问题,少谈些主义
- jQuery技术内幕:深入解析jQuery架构设计与实现原理
- 影响站点排名的53个因素
- [OpenGL ES 06]使用VBO:顶点缓存