2

int を渡すと、値で渡されます。
void something(int i)
何らかのタイプの配列を渡すと、参照によって渡されます。
void something(int i[])
また void something(int *i);

int のような型は値で渡され、配列は参照として渡されます。

最初の質問は、参照によって渡される型が他にあるのかということです。2 番目の質問は、配列の最初のパスと 2 番目
のパスの違いは何ですか?(int i[])(int *i)

編集:質問を明確にします。配列など、関数に渡すその他の型は、関数内で変更できます。(あなたが説明したように、これは正確には参照渡しではありません)。

void something(int i[])
{
i[0]=5;
}

something(i);

これにより、ローカルだけでなく配列が変更されます。

構造体はどうですか?組合?それらへのポインタも通過しますか?

4

5 に答える 5

4

すべてが値、期間によって渡されます。

違いは、Cが配列を処理する方法にあります。、、、または単項演算子のオペランドである場合、または宣言内の別の配列を初期化するために使用される文字列リテラルである場合を除き、sizeof「N要素配列」タイプの式は変換(「減衰」)されます。タイプ「ポインタ」の式。式の値は、配列の最初の要素のアドレスになります。_Alignof&TT

したがって、次のような宣言が与えられます

int a[10] = {0};

式がコード内の、、、またはa以外の場所にある場合は常に、式が&a関数に渡されているかどうかに関係なく、 式はポインタ式に変換され、式の値はのアドレスになります。sizeof a_Alignof aa[0]

したがって、次のような関数呼び出しでは

foo(a);

aはポインタ式に変換され、ポインタ式( )の値が&a[0]関数に渡されます。

同様に、関数パラメータ宣言ではT a[]、は;T a[N]として解釈されます。T *aパラメータは、配列の表記に関係なく、配列ではなくポインタとして宣言されています。

于 2012-11-08T15:44:47.800 に答える
4

C では、すべての型が値渡しされます。配列は実際には関数呼び出しで渡されません。配列パラメーターを宣言すると、コンパイラーは暗黙のうちに配列をポインターに置き換え、それを呼び出すと、配列のアドレスを渡します。最初の要素。

ポインターも値渡しされます。ポインタをコピーしても、ポイント先の値を変更できるため、参照渡しと非常に似ています (ただし、まったく同じではありません)。

于 2012-11-08T15:19:31.557 に答える
2

C ではすべて値渡しです。配列は参照によって渡されません。代わりに、他のすべてのポインターと同様に、値によって渡されるポインターに分解されます。

ポインターを値で渡すということは、ポインターが保持するアドレスがコピーされ、関数内で、外部ポインターと同じデータを指すこのコピーを操作することを意味します。ただし、関数内でポインター自体の値を変更しようとしても、呼び出し元が渡したポインターには影響しません。

void fn (int *ptr)
{
  // this is OK and the data that the pointer points to will be updated, 
  // even though the pointer itself is a copy
  *ptr = 5;

  // this will not have an effect out of the function since ptr is merely a copy
  ptr = NULL;
}

上記の例で、 の値を変更する場合は、 ではなくptr、パラメーターを持つ関数として宣言する必要があります。int **int *

void fn (int **ptr)
{
  *ptr = NULL;
}
...
int *x;
// at this point, x is uninitialised
fn(&x);
// x is now NULL
于 2012-11-08T15:19:46.897 に答える
0

すべての型は値を渡しますが、(関数呼び出しのコンテキストでは)配列名の値は最初の要素のアドレスです。

于 2012-11-08T15:19:05.397 に答える
0

考えられるすべてのデータ型 (列挙型であっても) は、参照または値として渡すことができます。

于 2012-11-08T15:20:07.530 に答える