不值错在哪里 2

renyaoming 2009-03-09 11:41:32
"abc"返回的是一个const char*吧?
那为什么可以char *p="abc"

不是const对象只能被const对象指针指吗
...全文
109 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
breezehou 2009-03-10
  • 打赏
  • 举报
回复
char *p="abc";// "abc"在常量池里,所以*p = 'c';运行时就会crash(编译时是可以的)。
注意char *p = "abc";和char p[] = "abc";是有区别的,后面的abc存放在栈里。
brookmill 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 brookmill 的回复:]
而char *p=0x12345678; 显然是没有任何问题的
[/Quote]
这是从编译和语法的角度来说的
从运行的角度来说,显然是要出问题的 :)
brookmill 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lingyin55 的回复:]
那为什么可以char *p="abc"

不可以这样,使用指针肯定要先分配空间,然后再用指针指向分配的空间。
[/Quote]
对于"abc"这样的常量字符串,编译器会在常量区分配空间把abc存进去,并且记住它所在的地址
所以,一句简单的char *p="abc"; 包含了“先分配空间,然后再用指针指向分配的空间”的过程
pengzhixi 2009-03-10
  • 打赏
  • 举报
回复
"abc"是一个const char *,但是当把它的地址赋给char * p时,编译器不知道"abc"是const char *
但是如果编写代码试图改变"abc"时就会产生错误。
lingyin55 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 brookmill 的回复:]
我觉得,对编译器来说,
char *p="abc";

char *p=0x12345678;
没有任何区别

而char *p=0x12345678; 显然是没有任何问题的
[/Quote]

那为什么可以char *p="abc"

不可以这样,使用指针肯定要先分配空间,然后再用指针指向分配的空间。

嗯,我试了一下,可以通过运行,编译器直接把"abc"当成一个地址值赋给p了。

至于""abc"返回的是一个const char*吧? ",“abc”返回的是一个地址值,但如brookmill 所说,它是什么类型编译器应该不知道。
brookmill 2009-03-10
  • 打赏
  • 举报
回复
我觉得,对编译器来说,
char *p="abc";

char *p=0x12345678;
没有任何区别

而char *p=0x12345678; 显然是没有任何问题的
  • 打赏
  • 举报
回复
char *p="abc"
声明一个const char *指针p,接收常量区的字符串"abc"
pengzhixi 2009-03-10
  • 打赏
  • 举报
回复
那你试着去改变p所指向的字符串试下,看看会有什么后果。
char × p="123";
这样可以,但是你不能改变p所指的字符串的内容。
ForestDB 2009-03-10
  • 打赏
  • 举报
回复
"abc"返回的是一个const char*吧? // 是的。
那为什么可以char *p="abc"

不是const对象只能被const对象指针指吗 // 没有这个说法,只是非const指针可以读访问const对象,但不能写访问它。
jakqigle 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 renyaoming 的帖子:]
"abc"返回的是一个const char*吧?
那为什么可以char *p="abc"

不是const对象只能被const对象指针指吗
[/Quote]

#include <iostream>
using namespace std;

void main(){

char *pch1 = "abc";//内容是const的,指针内容不是,否则会提示错误const char*型转换为char*
char *const pch2 = "edf";//不允许改动指针地址,内容非const

cout << "*pch1 =" << long(pch1) << endl;
pch1 = pch2;//
//pch2 = pch1;报错

}
chin_chen 2009-03-09
  • 打赏
  • 举报
回复
这个你得这样理解
const char*是一个指针,但这个指针不是常量,只是这个指针指向的object是个常量。
char*也是个指针,这个指针不是常量。
所以我们可以把 const char*赋值给char *,但是如果是char *const 的话,就不能把它赋值给char *了。
brookmill 2009-03-09
  • 打赏
  • 举报
回复
虽然我们都知道"abc"是一个指向常量区的指针,
但是,当编译器看到char *p="abc",它未必知道这里的"abc"是const char*
这是我的理解,不知道对不对。

试试编译一下这段代码:
int main()
{
char *p = "abc";
const char *pc = "def";
char *p1 = pc; //这里,编译器知道pc是const char*,所以会有错误或警告
return 0;
}
lingyin55 2009-03-09
  • 打赏
  • 举报
回复
"abc"返回的是一个const char*吧?

返回的是一个地址值

这样说不对,应该是表示一个地址。

[Quote=引用 1 楼 lingyin55 的回复:]
"abc"返回的是一个const char*吧?

返回的是一个地址值

那为什么可以char *p="abc"

不可以这样,使用指针肯定要先分配空间,然后再用指针指向分配的空间。
[/Quote]
lingyin55 2009-03-09
  • 打赏
  • 举报
回复
"abc"返回的是一个const char*吧?

返回的是一个地址值

那为什么可以char *p="abc"

不可以这样,使用指针肯定要先分配空间,然后再用指针指向分配的空间。

65,211

社区成员

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

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