1

このプログラムでは、私が言及した 3 つのアドレスすべてが配列の最初の要素を参照していますが、逆参照したときに配列の最初の要素の値を取得できないのはなぜですか?

int main()  
{  
    int a[5] = {1,2,3,4,5};  
    printf("address a = %d\n",a);  
    printf("address of a[0] = %d\n",&a[0]);  
    printf("address of first element = %d\n",&a);  
    printf("value of first element of the array a =%d\n",*(a));  
    printf("first element =%d\n",*(&a[0]));  
    printf("a[0] = %d\n",*(&a));//this print statement again prints the address of a[0] 

    return 0;  
}

最初の 3 つの print ステートメントの配列の最初の要素のアドレスを取得aし、3 つすべてを逆参照すると、4 番目と 5 番目の print ステートメントの値のみが取得され、6 番目の print ステートメント (コメント付き) の値は取得されません。

4

4 に答える 4

5

覚えておくべきこと:

  1. 配列の名前は、その最初の要素のアドレスです

したがって、配列名が a であるため、a を印刷すると、a[0](配列のアドレスでもある) のアドレスが得られます。つまり、&a[0](と同じa)の値が得られ、&a同じになります。

これで、最初の要素a&a[0]参照して参照すると、次の 3 つの方法で最初の要素を逆参照できることがわかりました。

  • *a
  • *(&a[0])
  • a[0]- 内部的に、これは次のように変換されることに注意してください。*(a+0)

覚えておくべきこと:

   2. ポインタに整数を追加すると、次の要素へのポインタが取得されます

ここで、&a配列全体のアドレスを指します。の値はや と&a同じですが、最初の要素へのポインターではなく、配列へのポインターです。したがって、ieに 1 を追加すると、この配列を超えることになります。&a[0]a&a&a + 1

同様に、&a[0]aは最初の要素へのポインタであるため、それらに 1 を追加すると、配列の次の要素が得られます (配列に複数の項目が定義されている場合)。つまり、最初の要素から次の要素を指します(a+1)&a[0] + 1今、それらを逆参照するために、次を使用できます。

  • *(a+1)
  • *(&a[0] +1)
  • a[1]- 内部的に、これは次のように変換されることに注意してください。*(a+1)

次の疑問を取り除くために、さらに情報を追加します。

この回答が示すように、配列の名前が最初の要素のアドレスである場合、 &a は最初の要素のアドレスのアドレスになります。

この疑問に対する答えは、いいえでもあり、はいでもあります。

  • いいえ、住所の住所のようなものはありません。
  • はいを理解するには、次の状況を考えて

    みてください: 10 個の箱のチョコレートがあり、各箱には 5 個のチョコレートが入っており (箱の中に 1 列に並んでいます)、箱が並んでいるとします。

チョコレート5個入り5箱

わかりました、説明するのに十分なチョコレートです。

ここで、ボックスはチョコレートの配列を表します。したがって、それぞれ5個のチョコレートが入った5つの箱があります。そのための宣言は次のようになります。

aそれを C に翻訳すると、5 つの数字を持つ配列であると仮定します。

-さて、最初の箱の場所を教えてくださいと言われたら、あなたはそれを と呼ぶでしょう&a。2 番目のボックスの場所を教えてほしいと頼んだ場合は、 として参照してください&a +1

  • 最初の箱に入っている最初のチョコレートの場所を教えてほしいと言われたら、&a[0]または(a+0)またはと言うでしょうa
  • 最初の箱に入っている 2 番目のチョコレートの場所を教えてほしいと言われたら、&a[1]または(a+1)またはと言うでしょうa+1: では、配列の名前と(a+1)同様aに、最初の要素のアドレスであり、整数です。したがって、a1 ずつ増加すると、2 番目の要素のアドレスを意味します。
  • チョコレートの 2 番目の箱の場所を教えてほしいと言ったら、次のように言うでしょう。(&a+1)
  • チョコレートの 2 番目の箱に入っている最初のチョコレートの場所を教えてほしいと頼んだら、次のように言うでしょう*(&a+1)*((&a+1) + 0)
  • 2 番目のチョコレートの箱に入っている 3 番目のチョコレートの場所を教えてほしいと言ったら、次のように言うでしょう。(*(&a+1))+2
于 2012-08-20T06:50:09.010 に答える
0

あなたの質問だけに答えるために、定義上、演算子*&はそれらがキャンセルするようなものです。変数のアドレスを取得してから逆参照すると、変数が返されます。これが配列ですa。ほとんどのコンテキストでは、配列はポインタに「減衰」するため、次に表示されるのは最初の要素のアドレスです。

于 2012-08-20T06:57:07.640 に答える
0

C 標準では、「型の配列」型を持つ式は「へのポインター」型に変換され配列の最初の要素を指すことが指定されて&います。ただし、この質問には関係ありません)。これがあなたの例にどのように適用されるかは次のとおりです。

  • aint の配列です。intへのポインタに変換されます。値は の最初の要素のアドレスですa
  • では&a[0]a[0]が最初に処理されます。a再び int へのポインタに変換されます。次に、添字演算子が適用され、配列の最初の要素の左辺値が生成されます。最後に、&この左辺値のアドレスを取得するため、値は の最初の要素のアドレスになりますa
  • In&aaのオペランドで&あるため、int へのポインタには変換されaません。配列のままで、&aそのアドレスを取得します。結果の型は「int の配列へのポインター」であり、その値は配列のアドレスであり、初期要素のアドレスと同じです。

完全を期すために: C 標準の関連規則は 6.3.2.1 パラグラフ 3 です。例外は次のとおりです。

  • 配列式は のオペランドです&
  • 配列式は のオペランドですsizeof
  • 配列式は のオペランドです_Alignof
  • 配列式は、配列の初期化に使用される文字列リテラルです。

最後は、 inchar s[] = "abc";"abc"初期要素へのポインタに変換されないことを意味します。s の初期化に使用される配列のままです。

于 2012-08-20T11:22:50.930 に答える
-1

aポインターであり、a[0]です*(a+0)。したがって、 を記述するとき*(&a)は、逆参照していません。

于 2012-08-20T06:43:31.260 に答える