LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1734|回复: 14

C++为什么不允许两个指针指向同一变量?

[复制链接]
发表于 2003-8-6 13:34:45 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int ival=1024;
  6.         int *pi=&ival;
  7.         int *pi2;
  8.         *pi2=ival;
  9.         cout<<"int *pi=&ival:"<<pi<<endl;
  10.         cout<<*pi<<endl;
  11.         cout<<"*pi+1:"<<*pi+1<<endl;
  12.         cout<<"*pi2=ival:"<<pi2<<endl;
  13.         cout<<*pi2<<endl;
  14. }
复制代码

测试代码如上。pi2和pi同时以不同的赋值方式指向ival,可以编译通过,但执行时会出现“段错误”。

如果pi2也是用int *pi2=&ival赋值,那么就没有错误了。

谁能具体说说这两种指针赋值方式的不同?为什么会产生上面的情况?
发表于 2003-8-6 14:59:34 | 显示全部楼层

回复: C++为什么不允许两个指针指向同一变量?

int *pi=&ival;/*把ival的地址赋值给pi*/
        *pi2=ival; /*把ival的值赋值给pi2*/

不知道我的理解是否正确?
发表于 2003-8-6 16:26:35 | 显示全部楼层
*pi2=ival;
这是在干什么?当然要出错。
 楼主| 发表于 2003-8-6 17:46:47 | 显示全部楼层

回复: 回复: C++为什么不允许两个指针指向同一变量?

最初由 seablue 发表
int *pi=&ival;/*把ival的地址赋值给pi*/
        *pi2=ival; /*把ival的值赋值给pi2*/

不知道我的理解是否正确?


同意。
不过,问题在于用两种方式建立的指针不能指向同一变量。真是很奇怪!
 楼主| 发表于 2003-8-6 17:47:58 | 显示全部楼层
最初由 Seraphim 发表
*pi2=ival;
这是在干什么?当然要出错。


这是在给pi2所指向的int型数据赋值。是允许的。
发表于 2003-8-6 18:05:13 | 显示全部楼层
pi2没有初始化,这时给*pi2赋值的行为是未定义的,最有可能是在运行时失败。
 楼主| 发表于 2003-8-6 18:35:55 | 显示全部楼层
最初由 crazythink 发表
pi2没有初始化,这时给*pi2赋值的行为是未定义的,最有可能是在运行时失败。


可以把代码改一下,去掉指针pi,只保留pi2,是可以正常运行的。
发表于 2003-8-6 19:09:32 | 显示全部楼层
*pi2=ival;
两边类型不一样,*pi2是int,ival的类型是int*,好的编译器不会编译通过。
发表于 2003-8-6 19:15:10 | 显示全部楼层
最初由 fingster 发表
可以把代码改一下,去掉指针pi,只保留pi2,是可以正常运行的。

服了你了。
指针是什么,我看老兄再翻翻书吧,这种程序不死就怪了。以后这种低级问题少来了。
代码至少是这样吧:
#include <iostream>

using namespace std;

int main()
{
        int ival=1024;
        int *pi=&ival;
        int *pi2=new int;
        *pi2=ival;
        cout<<"int *pi=&ival:"<<pi<<endl;
        cout<<*pi<<endl;
        cout<<"*pi+1:"<<*pi+1<<endl;
        cout<<"*pi2=ival:"<<pi2<<endl;
        cout<<*pi2<<endl;
         delete pi2;
}
发表于 2003-8-6 22:12:08 | 显示全部楼层
同意楼上的
搂主没有为指针pi2初始化
当然在赋值的时候会出错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表