あなたの用語はあちこちに少しあります。あなたの質問に答える最も簡単な方法は、コードを 1 行ずつ見ていくことだと思います。
int main()
{
int t1[4]={0,1,2,3}; //Declares a 4 integer array "0,1,2,3"
int t2[4]={4,5,6,7}; //Declares a 4 integer array "4,5,6,7"
int t3[4]={8,9,10,11}; //Declares a 4 integer array "8,9,10,11"
int t4[4]={12,13,14,15}; //Declares a 4 integer array "12,13,14,15"
int *tab[4]={t1,t2,t3,t4};//Declares a 4 pointer of integers array "address of the first element of t1, address of the first element of t2, ..."
int i,j,k,l; //Declares 4 integer variables: i,j,k,l
for (i=0; i<4;i++)
{
printf("%d\t", *tab[i]); //print out the integer that is pointed to by the i-th pointer in the tab array (i.e. t1[0], t2[0], t3[0], t4[0])
}
return 0;
}
あなたがしていることはすべて、あなたのループまで問題ないようです。それらを通過していないため、すべての配列の最初の整数のみを表示しています。それらを反復するには、コードは次のようになります。
for (i=0; i<4;i++)
{
for (j=0; j<4; j++)
{
printf("%d\t", *(tab[j] + i));
}
}
上記のコードは、2 つのループ カウンターを使用します。1 つ ( i
) は、配列内の位置 (配列内の最初の値、配列内の 2 番目の値など) を通過します。もう 1 つは、異なる配列を通過します ( j
)。これは、格納されているポインターを取得し、 th 列tab[j]
の値を表示するための正しいオフセットを持つ新しいポインターを作成することによって行われます。i
これはポインター演算と呼ばれます (ポインター演算に関する追加情報はこちらにあります) 。
ほとんどの人は構文*(tab[j] + i)
がぎこちないと感じますが、実際に何が起こっているかをより説明しています。tab[j][i]
C では、より一般的な のように書き直すことができます。