C++中的指针问题

pingju020 2008-11-10 04:15:22
问题是这样的:
大家都知道在C++中,可以这样定义指针:char *P="world";
这样的话,实际上是定义了一个指针常量。
但是绝对不可以这样定义:int *p; *p=4;
这两者的差别到底是什么机制导致的??
...全文
185 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
kdy88120 2008-11-11
  • 打赏
  • 举报
回复
你的这个问题,去看一下new语句的说明就知道是在回事了
int *p=new int;
*p=4;
...
...
delete p;
这样就可以了
shizhusz110 2008-11-11
  • 打赏
  • 举报
回复
int *p;*p=4;
没给分配空间,不能直接赋值
pingju020 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yayafu 的回复:]
是编译器机制导致的啊,char *P="world"会分配一块存储区,但int *p; *p=4不会为4分配存储区;
[/Quote]

这个好象不是编译器的机制导致的吧。
好像是C++标准的问题吧。
我目前真是想搞明白的是C++的标准到底是怎么规定一些常量的处理方式的,
比如上面的常量字符串,实际上编译器是将该字符串先存储到常量区,然后再让指针p指向这个区。那如常量4等又是怎么处理的?
overbai 2008-11-11
  • 打赏
  • 举报
回复
前面是常量区间,一开始就分配了内存单元,后面的只是一个指针,一开始没说明指向哪个单元,后面有怎么可以给这个单元里赋值呢
dzc8866 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dlyluck2008 的回复:]
char *p这里的p是一个指针,如果要对它赋值的话,等式的右边一定要是一个地址值才行。
char *p="world",要记得在C/C++中是没有字符串的,只有字符数组,而"world"字符串实质上它是一个字符数组,它返回的是该字符数组的首地址,所以可以用来为指针P赋值。
而int *p,*p=4这样的定义则是错误的,int *p,在p没有被初始化的时,它默认指向的是0xcccccccc,这个地址里面可是什么内容也没有的哦,*p则是取指针p所指向的地址里面的值…
[/Quote]

学习了UP
shuaiwang_01 2008-11-10
  • 打赏
  • 举报
回复
"world"在内存中为其分配了存放的空间,因而可以用指针指向它。
而4在内存没为它分配空间,因而指针p不知指向何方,所以错误!
三翔馆主 2008-11-10
  • 打赏
  • 举报
回复
前面是常量区间,一开始就分配了内存单元,后面的只是一个指针,一开始没说明指向哪个单元,后面有怎么可以给这个单元里赋值呢
冻结 2008-11-10
  • 打赏
  • 举报
回复
int *p,a;
a=4;
p=&a;
这个时候*p的结果就是4.(*p=4)
wangqr1984 2008-11-10
  • 打赏
  • 举报
回复
看反汇编代码!看反汇编代码!
dlyluck2008 2008-11-10
  • 打赏
  • 举报
回复
char *p这里的p是一个指针,如果要对它赋值的话,等式的右边一定要是一个地址值才行。
char *p="world",要记得在C/C++中是没有字符串的,只有字符数组,而"world"字符串实质上它是一个字符数组,它返回的是该字符数组的首地址,所以可以用来为指针P赋值。
而int *p,*p=4这样的定义则是错误的,int *p,在p没有被初始化的时,它默认指向的是0xcccccccc,这个地址里面可是什么内容也没有的哦,*p则是取指针p所指向的地址里面的值,就算里面有内容,那你又怎么会知道它一定是4呢?
不过可以这样定义:
int *p,a;
a=4;
p=&a;
这个时候*p的结果就是4.(*p=4)
yndfcd 2008-11-10
  • 打赏
  • 举报
回复
这两个没有可比性.

要知道 C/C++是没有字符串的,只有字符数组.所以前面一个是一个数组,而后面是一个常量,两个是有区别的.
tsoslience 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jeaaa 的回复:]
char *P="world";
这个是把指针地址指向字符串的第一个字符。
int *p; *p=4;
这个只是定义了个指针,并没有初始化指针的地址。不知道4存到哪去了。
[/Quote]

o
P_ghost 2008-11-10
  • 打赏
  • 举报
回复
接分接分
ylx1982 2008-11-10
  • 打赏
  • 举报
回复
很明显,大家还是很清楚这个问题的哦!
jeaaa 2008-11-10
  • 打赏
  • 举报
回复
char *P="world";
这个是把指针地址指向字符串的第一个字符。
int *p; *p=4;
这个只是定义了个指针,并没有初始化指针的地址。不知道4存到哪去了。
  • 打赏
  • 举报
回复
"world", 在C++的返回的是该串的首地址.该串的内存空间已由编译器分配.
huang_dy 2008-11-10
  • 打赏
  • 举报
回复
不管怎样指针必须要指向确定的内存地址才安全。
wudeshou82666 2008-11-10
  • 打赏
  • 举报
回复
指针P没有分配内存!你往它赋值得到运行是错误!
而常量字符串存储在程序的内存的常量区
已经存在的合法的地址!所以定义的指针可以指向它
yayafu 2008-11-10
  • 打赏
  • 举报
回复
是编译器机制导致的啊,char *P="world"会分配一块存储区,但int *p; *p=4不会为4分配存储区;
帅得不敢出门 2008-11-10
  • 打赏
  • 举报
回复
char *P="world"; 指向常量字符串 注意是常量字符串.
加载更多回复(2)

65,210

社区成员

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

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