2017-12-08 19 views
-4
#include<stdio.h> 
int main(){ 
    int a1[]={6,7,8,18,34,67}; 
    int a2[]={23,56,28,24}; 
    int a3[]={-12,27,-31}; 
    int *y[]={a1,a2,a3}; 
    int **a= y; 

    printf("%d\n",a[0][2]); 
    printf("%d\n",*a[2]); 
    printf("%d\n",*(++a[0])); 
    printf("%d\n",*(++a)[0]); 
    printf("%d\n",a[-1][1]); 
    return 0; 
} 

上記のコード出力を実行すると、8、-12,7,23,8です。しかし、最後の3行をCのポインターの配列の負のインデックス

に変更すると、
printf("%d\n",*(++a[2])); 
printf("%d\n",*(++a)[1]); 
printf("%d\n",a[-1][1]); 

の出力は8、-12,27,27,7になります。私は最後のprintfステートメントを理解することができません。 [-1] [何か]はどのように計算されますか?そして私によれば、*(++a)[1]は27の代わりに56を印刷しなければならない!

+0

負のインデックスについては、[Cで負の配列インデックスを使用できますか?](https://stackoverflow.com/questions/3473675/are-negative-array-indexes-allowed-in-c) – Galen

+1

'a'配列ではない、それはポインタです。 'a [-1]'は '*(a - 1)'と同じですが、 'a'が配列の途中を指す場合は問題ありません。そして、昨日私たちは[もっと楽しい例がありました](https://stackoverflow.com/questions/47683569/can-someone-please-explain-me-this-pointer-c-code) –

+0

@Galen私はすでにそれを読んでいます。負のインデックスが配列内に戻ってくる場合は、それが表示されます。しかし、私はここでそれを適用することはできません。 – Prakhar

答えて

0

ポインタと配列のベースは、実際には仮想メモリのアドレスです。 Cでは、それらを新しいアドレスに計算することができます。コンパイラは、ポインタが指すメモリのサイズ(例えば、int *が4バイトを指す)を知っているので、ポインタ+/- 1はアドレス+/-サイズ(例えばintの場合4バイト)を意味する。

演算子*は、指定されたアドレスに格納されている値を取得することを意味します。

オペレータの優先順位がここにあります。 []は++より前に計算されます。

上記のことを理解していれば、問題は解決するはずです。

関連する問題