为什么可以将字符串字面值赋给char *指针

HisinWang 2011-06-28 11:08:14
C++Primer中指出字符串字面值的类型是字符常量的数组即const char类型的数组
那么不是只能将字符串字面值赋予const char *的指针吗?
为什么还可以将字符串字面值赋予char *指针?
即为什么可以 char *p = "Hello World";(我在VC6,VC08,以及DEV-C++上都实验过了)
既然可以,那么为什么*p = ‘C’又报运行时错误!但编译却能通过》
百思不得其解!望指点一二。
THKS..........................



...全文
535 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
CN_zt 2011-06-30
  • 打赏
  • 举报
回复
char* pChar=new char;
*pChar ='h';
*pChar ='x';

cout<<*pChar<<endl;

delete []pChar;
CN_zt 2011-06-30
  • 打赏
  • 举报
回复
如果他是在动态内存在开辟的一片地址
这样没什么问题,可以修改

但是如果是程序自动分配的地址,那么字符串存放在字符常量区,对其进行修改就可能导致程序出错
辰岡墨竹 2011-06-30
  • 打赏
  • 举报
回复
其实就是一个隐式转换,const char *指针转换为char *指针。不过这种写法是不安全的。
因为字符串常量是不应该被修改的,用const char *才是正确的。
lcyw 2011-06-30
  • 打赏
  • 举报
回复
楼上都抢着说了,,,

我就不说了
ljq550000 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 wangyao1052 的回复:]
C++Primer中指出字符串字面值的类型是字符常量的数组即const char类型的数组
那么不是只能将字符串字面值赋予const char *的指针吗?
为什么还可以将字符串字面值赋予char *指针?
即为什么可以 char *p = "Hello World";(我在VC6,VC08,以及DEV-C++上都实验过了)
既然可以,那么为什么*p = ‘C’又报运行时错误!但编译却能……
[/Quote]

3q right answer
HisinWang 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gaomingok 的回复:]
http://topic.csdn.net/u/20090701/19/541c38b9-a7bb-4a56-98ac-d1457f0c0a86.html
[/Quote]
C++有沉重的历史包袱,为了兼容C(C中没有const)而不得已的无奈之举!
不然的话所有C的程序要想在C++环境下运行都得重写!
UP!
2401_863541072 2011-06-29
  • 打赏
  • 举报
回复
char *a ="abc"; //"abc"在常量区,a只是一个指针指向此常量区,并未分配内存
char a[]="abc"; //为a分配了4个char的内存

使用时常犯错
要注意,如果程序中用到a的内存时,一定要用后者,比如strcpy(a,b)这样的操作。
赵4老师 2011-06-29
  • 打赏
  • 举报
回复
赋值和初始化不是一回事!
HisinWang 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 supermegaboy 的回复:]
http://blog.csdn.net/supermegaboy/archive/2009/11/23/4854987.aspx
[/Quote]
好文!C++确实很BT!为了兼容C搞得很不严谨!
  • 打赏
  • 举报
回复
char *p = "Hello World"; *p在堆栈上面,hello World分配在字符常量区。Hello World 是一个字符数组,即*p就是保存了其地址。
*p = ‘C’ p没有分配空间,古报错。
不知道说清楚了没有 呵呵。。
就想叫yoko 2011-06-29
  • 打赏
  • 举报
回复
char *p = "Hello World";

其实你理解的对
本来应该是要const的
所以我们不能通过对p指针解引用来修改Hello world
pathuang68 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnwyllmm 的回复:]

char *p = "Hello world";
这个时候p指向的内存是只读的,不能修改
你用*p = ‘C’;
就是要修改p指向的内存
当然是不行的
[/Quote]

++
一个是初始化,一个是赋值。
RLib 2011-06-29
  • 打赏
  • 举报
回复
p的类型是char *,是指针,其类型与const char *的区别仅在于后者不能修改p。但是,能否修改p指向的字符串,取决于p指的是常量还是变量(内存属性是否可写)。
jinhoudexiong 2011-06-29
  • 打赏
  • 举报
回复
双引号和单引号括起来的东东,含义是不同的!
单引号括起来的实际上是一个整数,如'a',其实是十进制数97
而双引号括起来的却是一个指向无名数组的起始字符的“指针”,注意哦,是指针哦,该无名数组由双引号之间的内容和一个'\0'组成!

如果char *p = 'c', 这条语句的错误之处在于'c'不是指针!

如果这样
char *p = "Hello World";
因为"Hello World"代表的是一个指针,所以是可以的哦!

char ch = 'c';
char *p = &c;
这样也是可以的啊!
gaomingok 2011-06-29
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090701/19/541c38b9-a7bb-4a56-98ac-d1457f0c0a86.html
Tiger-3D 2011-06-29
  • 打赏
  • 举报
回复
学习了!
jinhoudexiong 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 h553690677 的回复:]

char *p = "Hello World"; *p在堆栈上面,hello World分配在字符常量区。Hello World 是一个字符数组,即*p就是保存了其地址。
*p = ‘C’ p没有分配空间,古报错。
不知道说清楚了没有 呵呵。。
[/Quote]

用c的内存分配函数分配空间之后就可以赋值了!
char *p = (char *)malloc(sizeof(char));
*p = 'c';
这样是可以行得通的!
legionalways 2011-06-29
  • 打赏
  • 举报
回复
"Hello World"是字符常量 ( string literal)
被编译器保存一块只读内存中,

修改它很多时候 程序会崩溃,,提示 access violation
lghhao123456 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rrrfff 的回复:]

p的类型是char *,是指针,其类型与const char *的区别仅在于后者不能修改p。但是,能否修改p指向的字符串,取决于p指的是常量还是变量(内存属性是否可写)。
[/Quote]

这个老兄说的很好。
羽飞 2011-06-29
  • 打赏
  • 举报
回复
char *p = "Hello world";
这个时候p指向的内存是只读的,不能修改
你用*p = ‘C’;
就是要修改p指向的内存
当然是不行的
加载更多回复(1)

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧