1

私は最近、Google のC++ 資料を見直していて、ポインターを示す次のコードに出くわしました。

void Unknown(int *p, int num);
void HardToFollow(int *p, int q, int *num);

void Unknown(int *p, int num) {
 int *q;

 q = #
 *p = *q + 2;
 num = 7;
}

void HardToFollow(int *p, int q, int *num) {
 *p = q + *num;
 *num = q;
 num = p;
 p = &q;
 Unknown(num, *p);
}

main() {
 int *q;
 int trouble[3];

 trouble[0] = 1;
 q = &trouble[1];
 *q = 2;
 trouble[2] = 3;

 HardToFollow(q, trouble[0], &trouble[2]);
 Unknown(&trouble[0], *q);

 cout << *q << " " << trouble[0] << " " << trouble[2];
}

私の質問は次のとおりです。q ポインターはもともとトラブル [1] に割り当てられています。HardToFollow に送信されると、q ポインター (現在は p と呼ばれる) が値 4 に更新され、その後、トラブル [1] も同様に更新されます。その直後に、元の q ポインター (この関数では p と呼ばれます) は、ローカル変数 (p = &q) を指すようにリダイレクトされます。それにもかかわらず、プログラムの終わりまでに、元の q ポインターは問題を指すように戻っています[1]。どうしてそうなった?

4

3 に答える 3

3

値渡しを介して関数にmain::q渡すことで単純に変更することはできません。HardToFollow値渡しqとして渡すので、viaとそれ自体がHardToFollow指すものを変更することはできますが、他のものを指すように変更することはできません。qppq

例を少し変更すると、期待どおりの結果が得られます。

void HardToFollow(int*& p, int q, int *num) {
 *p = q + *num;
 *num = q;
 num = p;
 p = &q;
 //Unknown(num, *p); //forget about this for now
}
于 2012-07-17T09:27:46.880 に答える
1

明確にするコメントをいくつか追加しました。

void HardToFollow(int *p, int q, int *num) {
  /* this modifies the value pointed to by p */
  *p = q + *num;
  *num = q;
  num = p;
  /* this does not modify the original pointer */
  p = &q;
  Unknown(num, *p);
}

[...]

  /* the memory address q points to is copied to the function scope */
  HardToFollow(q, trouble[0], &trouble[2]);
于 2012-07-17T09:04:47.533 に答える
0

関数 Unknown では、メイン関数からのポインター q で動作しないため、関数は
num という名前のポインターの値でのみ動作します

于 2012-07-17T08:50:03.917 に答える