指针指针指针.....

Yanger_xy 2009-02-25 11:48:33
#include <iostream>
using namespace std;

int main ()
{
char * const p = "asdf";
*(p+0)= 'I';
cout << *(p+0) << endl;
return 0;
}

结果为何不输出 I ?

是因为没有分配空间吗?
下面是我的理解:
如:
int a = 10;
int *p = &a;
*p = 20; //我认为:此处是将系统为a分配的空间中存放的值10改变为20(并没有使用p自身的空间)
char * const p = "asdf";
*(p+0)= 'I';//此处是将asdf这块内存中的a改变为I ,并不需要使用指针p自身的空间!
...全文
239 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmjnglx 2009-02-26
  • 打赏
  • 举报
回复
同意11楼,根本不是const本身的问题,而且很多楼说的都不对,有人说指针本身是常量而无法修改,可是lz根本没有修改过指针,只是试图修改指针指向的值,如果不相信的人可以这样写
char * const p = "asdf";
p = NULL; //试图修改指针的操作;
看看会不会编译报错.
另外就像20楼说的一样,语法层上来看本没有错,所以编译会成功.
jeasomkate 2009-02-26
  • 打赏
  • 举报
回复
非常同意此种说法,可能是比较权威的呢[Quote=引用 20 楼 kiffa 的回复:]
1, 如果编译时不报错,一般来说就说明你的代码是编译器认可的,也就是说你的代码是符合语法规范的。因此:


C/C++ codechar * const p = "asdf";
*(p+0)= 'I';



这两句代码从语法角度来讲没有任何问题。 p 是char * const,又不是const char *p 限定不能修改 *p,所以从语法角度来看,*(p + 0) = 'I' 没问题,因此编译器不会报错。

2,那么为什么运行时会出错呢?事实上,如果你在tc下面编译,这段代码运行时…
[/Quote]
Yanger_xy 2009-02-26
  • 打赏
  • 举报
回复
结贴去,同意20楼的....
如若有看此贴的,一定要小心,其中有不少people 说的都是错的。。。。。
注意取舍。。。
千万别弄糊涂了....
kiffa 2009-02-26
  • 打赏
  • 举报
回复
1, 如果编译时不报错,一般来说就说明你的代码是编译器认可的,也就是说你的代码是符合语法规范的。因此:

char * const p = "asdf"; 
*(p+0)= 'I';


这两句代码从语法角度来讲没有任何问题。 p 是char * const,又不是const char *p 限定不能修改 *p,所以从语法角度来看,*(p + 0) = 'I' 没问题,因此编译器不会报错。

2,那么为什么运行时会出错呢?事实上,如果你在tc下面编译,这段代码运行时也不会出错(似乎是TC,记不太清楚了,总之有这么一个编译器的行为是如此)。
如果要抠细节,那么首先“asdf”的类型是const char *,而p的类型是char * const,对于c++而言,这两种类型本来是不同的,比如:
const char *p1 = "asdf";
char *const p2 = p1;

对上面的代码,C++编译器就会报“类型不匹配”的错误。所以,楼主的代码中,从语法的角度来讲,有错误的是char *const p = "asdf";这一句,而不是*(p+0) = ‘I'这一句。编译器应该对 char * const p = "asdf" 报错。
编译器之所以没有报错,是因为C语言的历史遗留原因,C语言一开始是没有const修饰符的,同样也没有规定不能修改字符串常量,在后来的ANSI标准中才规定了“修改字符串常量的行为是未定义的”,C++为了兼容C,在这一点上就采取了这种妥协的处理方法,即:对于char *p = "hahah"这种语句认为符合语法。
对于C++中的const变量,标准从语义上要求它是“只读”的,是“不可修改”的,标准只要求编译器能够发现“试图修改const变量的行为”,但是标准并没有规定它的实现方法,也就是说标准并没有硬性要求必须把const变量放到“只读内存区”(也就是常说的常量区),这种把字符串常量放入“常量区”的做法不过是编译器的一种实现,编译器完全可以不这么实现,比如上面提到的TC(不过不排除TC的时候C标准还没有出台此条规定)。
因此,对于楼主代码中的*(p+0) = ‘I',其行为是未定义的,只是有些编译器表现为运行时出错而已。因为楼主的代码没有任何语法问题,所以编译时当然不会报错。
TM_LiuYan 2009-02-26
  • 打赏
  • 举报
回复
const 只读@
feng4206yu 2009-02-25
  • 打赏
  • 举报
回复
char* p[]="abcd";这样就可以修改了
不明白不要紧,慢慢来...
Yanger_xy 2009-02-25
  • 打赏
  • 举报
回复
不明白啊!!!?????????

yemingwy 2009-02-25
  • 打赏
  • 举报
回复
呵呵,楼上说的相当重要啊。。这也能错
feng4206yu 2009-02-25
  • 打赏
  • 举报
回复

char * const p = "asdf";//字符串常量被放在全局变量区,不允许修改
Yanger_xy 2009-02-25
  • 打赏
  • 举报
回复
这个程序在编译的时候并没有报错!只是在运行的时候出错了!!!指针既然不能对字符常量 进行操作,那为何编译器不报错?
?????????????????
这怎么解释?
rabbitlzx 2009-02-25
  • 打赏
  • 举报
回复
正确的解释在8楼、10楼、以及11楼
有些人说的根本就不对
Yanger_xy 2009-02-25
  • 打赏
  • 举报
回复
如果"asdf"不可以被修改的话,编译的时候应该报错啊???????!!
这个程序在编译的时候并没有报错!只是在运行的时候出错了!!!
?????????????????
这又怎么解释?
Yanger_xy 2009-02-25
  • 打赏
  • 举报
回复
我发现这里我还不是最糊涂的呢!@!!!
有很多通知都不清楚const!下面我还是解释一下吧!
为了大家能够清楚的认识const,我用人格担保,下面的绝对正确!
int char *const p;//表示指针p本身的地址是不可以修改的,但是指针所指向的内容是可以改变的!
例如:*p = 10;//这样的操作是正确的,可以修改指针所指向的值
如果原先是指向a的地址,现在又对其进行下面的操作:
p = &b// 改变指针本身的地址,error!!!!

const char * p;//表示指针所指向的内容是不可以修改的,但是指针本身的地址是可以修改的!
.....
....
....
大家最好自己上机试验一下,这样记忆会更加深刻一些....
tanshaojun 2009-02-25
  • 打赏
  • 举报
回复
char * const p = "asdf"; //表明指针本身是一个常量,修改不了的。
你可以改为这样:char *p = "asdf";这样就可以通过 *(p+0) = 'I'
learningl 2009-02-25
  • 打赏
  • 举报
回复
都知道用const啦,加油啊,剩下的就是继续学习啊,有时候就是这样,时间长了,就清楚啦
passionboy03 2009-02-25
  • 打赏
  • 举报
回复
p指向的地址已经被定义成const,不允许修改了!
[Quote=引用楼主 cpp_yangzuoshi 的帖子:]
#include <iostream>
using namespace std;

int main ()
{
char * const p = "asdf";
*(p+0)= 'I';
cout < < *(p+0) < < endl;
return 0;
}

结果为何不输出 I ?

是因为没有分配空间吗?
下面是我的理解:
如:
int a = 10;
int *p = &a;
*p = 20; //我认为:此处是将系统为a分配的空间中存放的值10改变为20(并没有使用p自身的空间)
char * const p = "asdf";
*(p+0)= 'I';//此处是将…
[/Quote]
ssff1 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 feng4206yu 的回复:]
C/C++ code
char * const p = "asdf";//字符串常量被放在全局变量区,不允许修改
[/Quote]

我认为
应该是
char * const p = "asdf";
is a const pointer to char//指针指向的地址处内容能被修改,指针指向的地址不能被改变

const char * cp;
is a pointer to const char;//同上相反
feng4206yu 2009-02-25
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int main ()
{
char p[6] = "asdf\0";
*(p+0)= 'I';
cout << *(p+0) << endl;
return 0;
}

楼主的程序与const无关...
char* const p=;表示p不能变...
char const *p=;才表示p所指向的值不能变...都瞎起什么哄...
char* const p = "abcd";abcd在这里是字符串常量,系统一般都把该字符串放在全局区,然后p的值实际上是abcd在全局区的地址,但是这里的abcd是不可修改的...换成上面的程序,在里面开辟的空间,abcd就可以修改了...
rabbitlzx 2009-02-25
  • 打赏
  • 举报
回复
这个问题的关键是这条语句:
char * const p = "asdf";

即时去掉const关键字,程序也是不可以执行的,因为
char* p = "ssss"; 指针p指向的是全局const内存区,因此不允许进行修改

这样就可以进行修改了
int main ()
{
char sz[] = "abc";
char * const p = sz;
*(p)= 'I';
cout << *(p) << endl;
return 0;
}
lixinzdx 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 cpp_yangzuoshi 的帖子:]
#include <iostream>
using namespace std;

int main ()
{
char * const p = "asdf";
*(p+0)= 'I';
cout < < *(p+0) < < endl;
return 0;
}

结果为何不输出 I ?

是因为没有分配空间吗?
下面是我的理解:
如:
int a = 10;
int *p = &a;
*p = 20; //我认为:此处是将系统为a分配的空间中存放的值10改变为20(并没有使用p自身的空间)
char * const p = "asdf";
*(p+0)= 'I';//此处是将…
[/Quote]
指针定义成const 类型的了 就不能修改了啊 LZ不先开辟空间才行啊
加载更多回复(4)

65,211

社区成员

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

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