2016-03-20 11 views
3

ここでは、教科書のCプログラムです。ユーザーから3 * 5の2D配列を要求し、3行目を出力します。Cプログラム内の配列ポインタ

int* p[5]と混同しています。なぜここに持っている必要があります[5]、私はちょうどint* pはOKだと思います。 int配列内の次のメモリ空間を繰り返し追加してポイントすることができます。そして誰もこのプログラムでポインタの仕組みを説明できますか?

#include <stdio.h> 

int main(void){ 
     int a[3][5]; 
     int i,j; 
     int *p[5]; 

     p = &a[0]; 
     printf("Please input:\n"); 
     for(i = 0; i < 3; i++){ 
       for(j = 0; j<5;j++){ 
         scanf("%d\n",(*(p+i))+j); 
       } 
     } 
     p = &a[2]; 
     printf("the third line is:\n"); 
     for(j = 0; j<5; j++){ 
       printf("%5d", *((*p)+j)); 
     } 
     printf("\n"); 
} 
+0

2Dアレイは、アレイのちょうど配列です。 – alk

+0

あなたは正しいです。 'p [5]'の必要はありません。明らかに、 'p [i]'への割り当てはありません。 –

+1

'p = &a[0];'はコンパイルしないでください。 – immibis

答えて

3
int *p[5]; 

int 5つのポインタの配列です。

&a[0]int[5]あるaの第一の要素のアドレスであるため、何がしたいことは5 int

int (*p)[5]; 

の配列へのポインタです。

コンパイラは、エラーではないにしても、少なくともこれについての警告を少なくとも明示する必要があります。ここで、この上

詳細は:CでC pointer to array/array of pointers disambiguation

+0

うん、それは警告を報告する。かっこがあるはずです。しかし、私がint * p(*(p + i))+ j)に変更すると、int *ではなくintをタイプするようになります。それはなぜ起こるのですか? –

+1

@JenniferQ 'int'に 'int *'を付けると 'int'を返します –

+0

@JenniferQ:' int * p'は 'int'を指すように' p'を定義します。逆参照演算子 '*'を 'p'に適用すると、ここには' int'が入ります。 – alk