C++ 指针传参测试

1、前言

假如有一个类A(非空),将其作为形参传入函数中,在函数中修改它的值,会生效吗?

(1) void func(A *a) {  ... }

(2) void func(A *&a) { ... }

答案是显然的,不管是传入指针,还是指针的地址,指针a的值在函数中被修改后都生效。

然而如果指针a是空指针,它是在函数内被创建的,那结果如何?

2、测试

用Qt写一个测试对话框,代码如下:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPushButton>

const int kBtnCount = 6;

struct SAnimal
{
    QString name;
    int age;
    
    SAnimal() : name(""), age(0) {}
};

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
    
private:
    void init();
    
    void createAnimal1();
    void createAnimal2(SAnimal *ani);
    void createAnimal3(SAnimal *&ani);
    SAnimal* createAnimal4();
    void changeAnimal1(SAnimal *ani);
    void changeAnimal2(SAnimal *&ani);
    
private:
    SAnimal *m_animal = nullptr;
    QPushButton *m_btn[kBtnCount] = {nullptr};
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <qboxlayout.h>
#include <qdebug.h>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    init();
}

Dialog::~Dialog() {}

void Dialog::init()
{
    setWindowTitle("指针测试");
    setMinimumSize(600, 200);
    
    for (int i = 0; i < kBtnCount; ++i)
    {
        m_btn[i] = new QPushButton(QString("按钮%1").arg(i + 1), this);
        m_btn[i]->setFixedSize(80, 36);
    }
    
    QHBoxLayout *hLay = new QHBoxLayout(this);
    hLay->setMargin(36);
    hLay->setSpacing(36);
    hLay->setAlignment(Qt::AlignCenter);
    for (int i = 0; i < kBtnCount; ++i)
    {
        hLay->addWidget(m_btn[i]);
    }
    
    connect(m_btn[0], &QPushButton::clicked, this, [this] {
        createAnimal1();
        if (m_animal) {
            qDebug() << m_animal->name << m_animal->age;
        }
    });
    
    connect(m_btn[1], &QPushButton::clicked, this, [this] {
        SAnimal *ani = nullptr;
        createAnimal2(ani);
        if (ani) {
            qDebug() << ani->name << ani->age;
        }
    });
    
    connect(m_btn[2], &QPushButton::clicked, this, [this] {
        SAnimal *ani = nullptr;
        createAnimal3(ani);
        if (ani) {
            qDebug() << ani->name << ani->age;
        }
    });
    
    connect(m_btn[3], &QPushButton::clicked, this, [this] {
        SAnimal *ani = createAnimal4();
        if (ani) {
            qDebug() << ani->name << ani->age;
        }
    });
    
    connect(m_btn[4], &QPushButton::clicked, this, [this] {
        SAnimal *ani = new SAnimal();
        changeAnimal1(ani);
        qDebug() << ani->name << ani->age;
    });
    
    connect(m_btn[5], &QPushButton::clicked, this, [this] {
        SAnimal *ani = new SAnimal();
        changeAnimal2(ani);
        qDebug() << ani->name << ani->age;
    });
}

void Dialog::createAnimal1()
{
    m_animal = new SAnimal();
    m_animal->name = "Tomas";
    m_animal->age = 1;
}

void Dialog::createAnimal2(SAnimal *ani)
{
    ani = new SAnimal();
    ani->name = "XiaoHui";
    ani->age = 2;
}

void Dialog::createAnimal3(SAnimal *&ani)
{
    ani = new SAnimal();
    ani->name = "XiaoBai";
    ani->age = 3;
}

SAnimal *Dialog::createAnimal4()
{
    SAnimal *ani = new SAnimal();
    ani->name = "PanJu";
    ani->age = 4;
    
    return ani;
}

void Dialog::changeAnimal1(SAnimal *ani)
{
    if (ani) {
        ani->name = "XiaoHuang";
        ani->age = 5;
    }
}

void Dialog::changeAnimal2(SAnimal *&ani)
{
    if (ani) {
        ani->name = "XiaoHua";
        ani->age = 6;
    }
}

运行界面如下:

点击这6个按钮后,打印如下:

"Tomas" 1
"XiaoBai" 3
"PanJu" 4
"XiaoHuang" 5
"XiaoHua" 6

分析:

可以看到,点击按钮2没有打印信息,因为调用createAnimal2(SAnimal *ani)时,指针是值传递(传递的是指针值的副本),因此函数执行完后指针ani依然是空,只有传入指针的地址(即&*或**)才生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏笋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值