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依然是空,只有传入指针的地址(即&*或**)才生效。
562

被折叠的 条评论
为什么被折叠?



