2013-04-21 16 views
5

を理解したい。それが実行されるとは、次のコードスニペットを参照してくださいCアレイ動作

int main() 
{ 

    int arr[] = { 0,3 , 4,28,1198}; 
    for(int i=0;i<5;i++) 
    printf("\n arr[i] %u \n" , arr+i); 
    printf("\n *******************\n"); 
    printf("%u ", &arr+1); 

    return 1; 

} 

を、それが出力:

arr[i] 3219650892 

arr[i] 3219650896 

arr[i] 3219650900 

arr[i] 3219650904 

arr[i] 3219650908 

******************* 
3219650912 

を私の最後の要素のアドレスを示しているようです奇妙な1つの整数が追加されました。私はそれが私に2番目の要素のアドレスを与えていたはずだと思う。

この現象を理解できたら助かりますか?

+0

&arrは(char *)[5]を意味し、+1は+5インデックスを意味します。 – BLUEPIXY

答えて

10

これを理解するには、arrの意味を&arrと比較してください。

arrは、アレイの名前です。 Cには、配列式が最初の要素へのポインタに変換されるという規則があります(ただし、ここでは適用されない特定の状況を除く)。したがって、arr&arr[0]に変換されます。これは最初の要素のアドレスです。これはintへのポインタなので、1を追加すると次のポインタへのポインタが得られますint。したがって、このポインタへの連続的なインクリメントは配列の要素を通ってインクリメントする。

対照的に、&arrは配列へのポインタです。 *配列の開始アドレスと最初の要素の開始アドレスは同じですが、型が異なります。 &arrのタイプは「5 intの配列へのポインタ」です。これに1を加えると、5つのintの次の配列へのポインタが得られます。つまり、アドレスは5 intの配列全体のサイズだけインクリメントされます。

なお、アドレスの印刷には%u指定子を使用するのは不適切です。これは、これらの特殊な状況の一つである脚注

*

printf("%p ", (void *) (&arr+1)); 

:配列が&で使用されている場合、変換がある次のような、%pを使用してvoid *にアドレスを変換する必要がありますまだ完成してない。 &arrでは、arrは配列であり、ポインタではなく、&arrがそのアドレスです。

3

&arr+1

&arrarr配列+ 1要素の最後のエレメントのアドレスのアレイarrので&arr + 1ポイントへのポインタです。つまり、arr最後の要素のアドレスは&arr[4]なので、&arr + 1&arr[5]と同じアドレスです(しかし型は異なります)。

+0

よく説明されています。 +1。 – Maroun

0

& arrは5つの整数の配列へのポインタを与えます。

したがって、& arr + 1は5つの整数の次の配列を指します。

関連する問題