3

簡単な質問があります。テスト構造体へのポインタを取るグローバル関数 (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);
}
4

7 に答える 7

3

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

はい、あなたは正しいです!あなたのコードはコピーを作成し、それを変更して、すぐに破棄します。

代わりに、ポインターを介して渡された構造を変更する必要があります。

tp -> data = newData;

->オペレーターに注意してください。これは、.メンバー アクセス演算子に相当するポインターです。と同等です

(*tp).data = newData;

しかし、それはより良く見えます。

で同じことを行うことができますがprintData、効率が悪いだけです。

cout << tp -> data;
于 2012-04-16T15:10:47.940 に答える
1
test t = *tp;    // I think the problem is here

うん。これで、ローカル コピーが作成され、それが変更されました。代わりに、次を使用する必要があります。

tp->data = newdata;
于 2012-04-16T15:10:47.037 に答える
1

あなたがしたことはsetData、新しい構造体を作成し、そこでデータを変更したことです。
あなたがしたいことはこれです:

void setData(test* tp, int newData) {
    tp->data = newData;
}
于 2012-04-16T15:10:37.203 に答える
1
test t = *tp;

影響の前にオブジェクトをコピーします。したがって、変更は失われます。指摘されたオブジェクトにアクセスする必要があります。

tp->data = newData;

C++ についてさらに深く掘り下げる前に、一般的なポインタと構造体についてもう少し読むことをお勧めします。

于 2012-04-16T15:10:37.763 に答える
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;
}
于 2012-04-16T15:12:06.437 に答える
0

ローカル変数のみを変更しています。代わりにこれを行う

tp->data = newData;
于 2012-04-16T15:11:38.960 に答える
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;
}

後者のバージョンは、わずかに効率的で直感的です。

于 2012-04-16T15:10:11.180 に答える