5

関数にパラメーターを渡すと、関数のスタックにコピーが作成され、呼び出し元の関数のパラメーターの実際の値に変更はありません。

関数へのポインタを渡すとどうなりますか?パラメータの値が呼び出し元関数で変更されることはわかっています。しかし、それは内部でどのように起こりますか?呼び出された関数は、呼び出し元の関数の変数にどのようにアクセスしますか?

wikipeidiaのCall_by_referenceページから情報を取得しようとしましたが、実質的ではありませんでした。

文字列について読み始め、文字列をパラメータとして他の関数に渡すと、これと混同します。これに関するどんな助けも大きな助けになるでしょう。ありがとう!!!!

4

5 に答える 5

10

関数へのポインターを渡すと、ポインターがコピーされます。ただし、オブジェクトへのポインタのコピーは、へのポインタxでもあるxため、を変更するために使用できますx

(考案された)アナロジーとして、それxがあなたの家だとしましょう。Cの規則により、家の中で何かを修理するために配管工が必要な場合は、配管工に家のコピーを渡し、修理してもらい、そのコピーを返送することができます。言うまでもなく、数バイトを超える家の場合、すべてのコピーがあるため、これは非常に非効率的です。代わりに、配管工にあなたの家へのポインター(その住所)を与えて、配管工があなたの家にアクセスしてその場で修理できるようにします。これが参照による呼び出しです。変更するデータではなく、そのデータへのポインタを渡すので、呼び出し先は、どの値だけでなく、どの場所で操作するかを知ることができます。

const int broken = 0, fixed = 1;

struct House {
    int plumbing;
};

void plumber(House *h)
{
    h->plumbing = fixed;
}

int main()
{
    struct House h;
    h.plumbing = broken;
    plumber(&h);          // give the plumber the address of the house,
                          // not a copy of the house
    assert(h.plumbing == fixed);
}

文字列を渡す場合、渡すのはchar文字列の最初のポインタへのポインタです。ポインタ演算を使用すると、次の要素に到達できます。

于 2012-10-18T11:26:28.353 に答える
4

Cには参照渡しがありません。関数へのポインターを渡すときは、実際には変数のアドレスを関数に渡します。次に、関数はそのアドレスの値を変更でき、この変更は関数を呼び出す際の変数に反映されます。ただし、ポインターが指すアドレスを変更しようとしても、ポインターは値によって渡されたままであるため、変更は呼び出し元の関数に反映されません。

void f(int *j) {
  (*j)++;
  int k = 20;
  j = &k;
}

int main() {
  int i = 20;
  int *p = &i;
  printf("i = %d, p = %p\n", i, p);
  f(p);
  printf("i = %d, p = %p\n", i, p);

  return 0;
}

出力

i = 20, p = 0x123456
i = 21, p = 0x123456
于 2012-10-18T11:33:36.137 に答える
4

Cのすべてのパラメーターは値によって渡されます。

于 2012-10-18T11:35:40.427 に答える
3

すべてのデータは、特定のアドレスを持つ特定の場所に保存されます。参照渡しする場合は、データのアドレスを参照渡しします。そして、間接アドレス指定を使用してデータを操作するように関数に指示します。

関数に渡すと、(変数の)アドレスがデータとして送信されますが、データ自体は値で渡されます。

于 2012-10-18T11:27:45.987 に答える
3
                        a=10     b=20
                        ------   -------
                        0xf8      0Xf4
                    ----------  ---------

                Suppose a and b are two variables in a function stack
                when you call another function 
                foo(&a,&b)
                actually 0xf8 and 0xf4 is caught in the definition of 
                foo(int *pa,int *pb)

       So  pa=0xf8    pb=0xf4
           --------    ---------
 But *pa = 10 and *pb = 20 , You can manipulate like this.
 So these pointers start pointing to the actual data and any changes here are reflected in the original environment.
于 2012-10-18T11:43:31.937 に答える