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

时间:2012-04-16 15:07:48

标签: c++ struct

我有一个简单的问题。我有一个全局函数(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);
}

7 个答案:

答案 0 :(得分:2)

  

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

是的,你是对的!您的代码正在复制,修改它,然后立即丢弃。

您应该修改通过指针传入的结构:

tp -> data = newData;

请注意->运算符。它是指向.成员访问运算符的指针。它相当于

(*tp).data = newData;

但它看起来更好。

你可以在printData中做同样的事情,虽然这只是效率低下的事情:

cout << tp -> data;

答案 1 :(得分:1)

你在setData中所做的是创建一个新的结构,并在那里更改了数据 你想要做的是:

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

答案 2 :(得分:1)

test t = *tp;

在做作之前复制您的对象。因此,修改丢失了。 您需要访问指向的对象:

tp->data = newData;

我建议你在进一步深入C ++之前,先阅读更多有关指针和结构的内容。

答案 3 :(得分:1)

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

是的。您现在已制作本地副本并对其进行了修改。相反,你应该使用:

tp->data = newdata;

答案 4 :(得分: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;
}

答案 5 :(得分: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;
}

后一版本更有效,更直观。

答案 6 :(得分:0)

您只修改本地变量。这样做

tp->data = newData;