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