标题:关于C++中:*&与*的问题
只看楼主
kindol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-3-19
结帖率:100%
已结贴  问题点数:10 回复次数:6 
关于C++中:*&与*的问题
初学C++类,求指教:
代码如下:这是一道计数进出货质量的问题,每个节点设为GOODS,
每次保存的货物质量为weight,设置静态变量total_weight计数总重。
#include<iostream>
using namespace std;
class GOODS {
public:
    GOODS(int w) {
        weight = w;
        total_weight += w;
    }
    ~GOODS(){
        total_weight -= weight;
    }
    int Weight() {
        return weight;
    }
    static int Total_weight() {
        return total_weight;
    }
    GOODS *next;
private:
    int weight;
    static int total_weight;
};
int GOODS::total_weight = 0;
void purchase(GOODS *&f, GOODS *&r, int w) {
    GOODS *p = new GOODS(w);
    p->next = NULL;
    if (f == NULL) {
        f = r = p;
    }
    else {
        r->next = p;
        r = r->next;
    }
}
void sale(GOODS *&f, GOODS *&r) {
    if (f == NULL) {
        cout << "No any GOODS!" << endl;
        return;
    }
    GOODS *p = f;
    f = f->next;
    delete p;
    p = NULL;
    cout << "saled" << endl;
}
int main() {
    GOODS *f = NULL;
    GOODS *r = NULL;
    int w,choice;
    do {
        cin >> choice;
        switch (choice) {
        case 1: {cin >> w; purchase(f, r, w); break; }//1表示进货,w为此次进货的重量
        case 2: {sale(f, r); break; }                //2表示出货,从表头开始出货
        case 0:{break;}                                //0表示退出
        }
        cout << "Now total weight is " << GOODS::Total_weight() << endl;
    } while (choice);
    return 0;
}
这个时候输出时正常的,
但当把
void purchase(GOODS *f, GOODS *r, int w)
void sale(GOODS *f, GOODS *r)
这两个函数的&去掉后输出确实不正常的,
请问*&和*有什么区别?

[此贴子已经被作者于2016-3-20 14:28编辑过]

搜索更多相关主题的帖子: private include public return 
2016-03-20 14:25
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
得分:2 

可以简单的把
& 比喻成你们家的地址
* 比喻成你们家的房子有几层,漂亮不漂亮,就是你一眼就能认出这个房子的外形就是你们家的房子
比喻你有一个小伙伴要寄个东西你,你不能说,你们家是三层楼的小洋房,外面还种了很多的小红花,楼顶
上有一个很高很高的天线,你来了一眼就能找到云云,你这样跟快递大叔说,快递大叔是找不到你们家的
你得说你们家住在**省**市**县**镇**街**号
这样你才能收到小伙伴的东西

2016-03-21 01:07
luckhide
Rank: 5Rank: 5
来 自:青岛
等 级:职业侠客
帖 子:51
专家分:338
注 册:2016-3-19
得分:8 
二楼的比划好晦涩啊,反正我没看懂
楼主可以百度下函数参数传递的三种方式,其中只有地址映射允许子函数修改主函数传递的参数值,指针只能让子函数修改指针指向的变量值,无法改变指针本身的值,所以参数使用了*,说明是指针参数,使用&说明是该参数的地址映射,即允许子函数能实际改变这个指针参数值而改变调用函数的指针指向。
简单说:有了&符号,子函数任何对链表的操作,都不会使主函数丢失链表头。

[此贴子已经被作者于2016-3-21 08:57编辑过]

2016-03-21 08:55
kindol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-3-19
得分:0 
回复 2楼 hjx1120
hh虽然没看懂,还是要O(∩_∩)O谢谢你。
2016-03-21 23:23
kindol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-3-19
得分:0 
回复 3楼 luckhide
那再请问一下:**和*&有什么区别呢?
2016-03-21 23:34
luckhide
Rank: 5Rank: 5
来 自:青岛
等 级:职业侠客
帖 子:51
专家分:338
注 册:2016-3-19
得分:0 
有区别的:**首先说明函数形参是一个指针的指针,使用时类似于第一个*告诉你要到这个地方去取你家地址,第二个*实际放着你家地址,按第二个*的指向即可找到你家。
*&则告诉你,函数的形参是一个指针,但接受过来的实参是该指针变量的地址。
其实函数形参有无&符号就是告诉编译器参数是传址还是传值。
下例简单说明&符号效果:
#include <stdio.h>
void fun(int &a,int b)
{
    a=4321;
    b=1234;
}
void main()
{
    int i=0,j=0;
    fun(i,j);
    printf("%d,%d\n",i,j);
}
运行输出:4321,0

[此贴子已经被作者于2016-3-22 06:32编辑过]

2016-03-22 06:12
kindol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-3-19
得分:0 
回复 6楼 luckhide
O(∩_∩)O哈!突然顿悟了,O(∩_∩)O谢谢你啦。
2016-03-22 22:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-462703-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.433249 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved