2

たとえば、このコード:

#include <iostream>
using namespace std;

void foo(int* x){ cout << "X = " << *x << endl;}

int main()
{
    int value = 5;
    int *p = &value;
    foo(p);
    foo(&value);
    return 0;
}

関数の最初の呼び出しではfoo、ポインター p (x) のコピーが実際には関数内で作成され、関数が終了するとすぐに削除されますよね? 変数値のアドレスの 2 回目の呼び出しではfoo、そのアドレスでポインター x が作成され、関数が終了するとすぐに削除されますよね? これらの呼び出しのうち、スタック メモリの消費量が少ないのはどれですか? それともどちらも同じことですか?

4

4 に答える 4

1

どちらも似ています。main1つはローカル変数(内部)として、もう1つは関数パラメーター(に渡される)としてポインターを2回作成しているため、最初の方法はより高価に見えますfooが、コンパイラーの「最適化」フェーズでは、おそらく最初の部分が2番目の部分に変わります。 (あなたがする唯一のことpはそれを渡すことであり、後でそれを再利用しないと仮定しますmain)。

于 2012-11-19T16:04:10.403 に答える
1

それらはほとんど同じです。唯一の違いはp、 のコール スタックにポインター オブジェクトmainがあることですが、それについて心配する場合は、問題が発生します。:)

于 2012-11-19T16:01:43.317 に答える
0

最初の呼び出しでは、 のアドレスを含む変数を渡していますvalue

2 番目の例では、 のアドレスvalue直接渡しています。

代入演算子は と の両方が同じであると言っていることに注意してくださいp&valueしたがって、証明したように、どちらかを関数に渡すことができるはずです。

于 2012-11-19T16:02:56.720 に答える
0

ポインターには、他のすべてと同様にコピーできる値があります。それらには値のセマンティクスがあります。

void foo(int* t);

ポインタを値で受け取ります。ポインター引数のコピーを作成し、本体内で使用します。

int value = 23;
int *p = &value; // &value takes the address of value and use it to copy initialize p
foo(p); // copy the value of the pointer inside foo
foo(&value); // do the same but don't create a temporary
于 2012-11-19T16:03:03.983 に答える