C++使用结构体指针更新数据成员

4

我有一个应该很简单的问题。我有一个全局函数(setData),它需要一个指向我的测试结构体的指针。当我尝试更新数据成员时,它没有起作用。

#include <iostream>
using namespace std;

struct test {
    int data;
};

void setData(test* tp, int newData) {
    test t = *tp;    // I think the problem is here.
    t.data = newData;
}

void printData(test* tp) {
    test testStruct = *tp;
    cout << testStruct.data;
}

int main()
{
    test ts;
    ts.data = 22;
    setData(&ts, 44);
    printData(&ts);
}

3
不要只说“不起作用”,请具体描述是什么没有起作用。 - Oliver Charlesworth
7个回答

3

test t = *tp; // 我认为问题就在这里。

没错,你是对的!你的代码会复制一份、修改它,然后立即丢弃。

相反,你应该通过指针修改传入的结构体:

tp -> data = newData;

请注意->运算符。它是.成员访问运算符的指针相当物。它等同于
(*tp).data = newData;

但是这样看起来更漂亮。

printData中也可以做同样的事情,尽管那里仅仅是一种低效率的方法:

cout << tp -> data;

1

setData 中你所做的是创建一个新的结构体,并更改了其中的数据。
你想要做的是这样的:

void setData(test* tp, int newData) {
    tp->data = newData;
}

1
test t = *tp;

在赋值之前复制您的对象。因此,修改将会丢失。 您需要访问指向的对象:

tp->data = newData;

我建议在深入学习C++之前,先多了解指针和结构体的相关知识。

1
test t = *tp;    // I think the problem is here

是的。你现在已经制作了一个本地副本并进行了修改。相反,你应该只使用:

tp->data = newdata;

1

void setData(test* tp, int newData) {
    test t = *tp;    // I think the problem is here.
    t.data = newData;
}

setData 声明了自己的 test 的副本。如果你想调整调用者的 test,你必须通过指针或引用来实现:

void setData(test* tp, int newData) {
    t->data = newData;
}

或者

void setData(test* tp, int newData) {
    test &t = *tp;    // I think the problem is here.
    t.data = newData;
}

0

你的 setData() 函数只修改了本地 副本struct

你需要将其复制回去:

void setData(test* tp, int newData) {
    test t = *tp;
    t.data = newData;
    *tp = t;
}

或者直接修改全局变量:

void setData(test* tp, int newData) {
    tp->data = newData;
}

后一版本稍微更高效和直观。


0
您只修改了本地变量。请按照以下方法操作。
tp->data = newData;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接