0

次の C コードを検討してください。

char array1[1]={1};
char array2[2]={2, 2};

void viewDataPointedToBy(char* z)
{
  printf("%i\n", *z);
}

int main(void)
{
  viewDataPointedToBy(array1);   //prints 1, as expected.
  viewDataPointedToBy(array2);   //prints 2, as expected.

  viewDataPointedToBy(&array1);  //prints 1, How??
  viewDataPointedToBy(&array2);  //prints 2, How??

  viewDataPointedToBy(&&array1); //Compilation Error: 'array1' used but not defined, Why ?

  system ("pause");
  return 0;
}

の最初の 2 つの呼び出しの結果を理解していますviewDataPointedToBy。次の 3 つの呼び出しの結果について説明が必要です。

4

4 に答える 4

3

これは、C配列名と配列アドレスが同等であるためです。したがって、渡すときは を渡す&array1ことと同じarrayです。

この動作を確認するには、アドレスを印刷してみてください。

printf("%u %u\n", array1, &array1); 
于 2013-10-01T14:31:14.857 に答える
2

最後のエラーについては、構文の問題が原因だと思います。変数を二重参照することはできません。本当に意味がありません。&array は定数です。もう一度参照しても、どこにも行きません。エラーは、コンパイラーが && をブール二項演算子として認識しようとしていることが原因であると想定しています。

于 2013-10-01T14:46:49.037 に答える
0

配列のベース アドレスを送信します。

(1)viewDataPointedToBy(array1)

また

viewDataPointedToBy(&array1)

両方の関数で、array1 のベースアドレスを送信します

したがって、両方の関数の結果は同じです。

(2) の場合 : viewDataPointedToBy(&&array1)

(&&)論理演算子を使用できます。したがって、エラーが発生します。

于 2013-10-01T14:37:39.463 に答える
0

array itslef はポインタであり、要求された address のアドレスです。指定された配列では受け入れられません。

于 2013-10-01T14:33:49.817 に答える