免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1915 | 回复: 7
打印 上一主题 下一主题

[C++] 请教C++按指针传递的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-25 15:43 |只看该作者 |倒序浏览
#include<iostream>
using namespace std;

void g(int *);
void h(int *);

int main()
{
        int x = 100;
        int *p = &x;
        g(p);
        cout<<*p<<endl;//这里的输出为什么是100而不是200????
        h(p);
        cout<<x<<endl;
        return 0;
}

void g(int *q)
{
         int y = 200;
        q = &y;
        cout<<"in g():";
        cout<<*q<<endl;
}

void h(int *q)
{
        *q = 200;
}

[ 本帖最后由 穿靴子的猫 于 2007-5-25 15:45 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-05-25 15:51 |只看该作者
#include<iostream>
using namespace std;

void g(int );


int main()
{
        int p = 100;
        g(p);
        cout<<p<<endl;//这里的输出为什么是100而不是200????
        return 0;
}

void g(int q)
{
         int y = 200;
        q = y;
        cout<<"in g():";
        cout<<q<<endl;
}

楼主能解释一下我的疑问吗?

论坛徽章:
0
3 [报告]
发表于 2007-05-26 10:32 |只看该作者
我也遇到过这种问题.
函数的参数就算是指针,形参和实参的地位不会改变.也就是说,实参不会改变它原来的指向.
在函数里面只是生成一个临时的指针指向实参指向 的内存,这个临时指针的动作不会影响实参.

论坛徽章:
0
4 [报告]
发表于 2007-05-26 10:34 |只看该作者
ls的正解

论坛徽章:
0
5 [报告]
发表于 2007-05-26 18:32 |只看该作者
q = &y;

你想想这是什么意思就得解了

论坛徽章:
0
6 [报告]
发表于 2007-05-26 20:16 |只看该作者
其实变量的有效域的问题,main域,子函数域
当你调用了函数的传过给子函数的是q的傎的引用也就是q的一个副本,所以你对副本的修改当然不会影响他原来的值了。如果你把q设置为全局变量那么输出结果就要变了。

论坛徽章:
0
7 [报告]
发表于 2007-05-26 23:35 |只看该作者
楼主的问题概括一下几点:

(1) 函数参数的传递方式

指针也就是一个变量,在调用函数栈内是该指针的拷贝值,指向的内存是一致的。


(2) 在函数中要修改指针的指向,不是指针指向的内容,应该传递指向指针的指针,或者指向指针的引用


(3) 楼主的代码可能还存在一个问题,就是返回栈变量的指针,这个是非常危险的


下面的代码还要注意内存泄漏的问题,呵呵


void get(int *p)
{
     int *local = new int(101);
     
     p = local;
}

void change(int *&q)
{
     int *local = new int(102);
     
     q = local;
}

void changeP(int **q)
{
     int *local = new int(103);
     
     *q = local;
}


int main(void)
{
    int a = 50;
   
    int *q = &a;
   
    get(q);
   
    std::cout<<*q<<std::endl;
   
    change(q);
   
    std::cout<<*q<<std::endl;
   
    changeP(&q);
   
    std::cout<<*q<<std::endl;
   
    //注意回收内存
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

论坛徽章:
0
8 [报告]
发表于 2007-05-27 03:15 |只看该作者

回复 2楼 lenovo 的帖子

这个是安值传递,传递的是一份拷贝,所以不改变原来的变量的值呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP