您的术语转置是有点所有的地方。我认为最简单的方法来回答你的问题是逐行浏览你的代码。
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));
}
}
上面的代码使用了两个循环计数器,数组中的一个(在i
)要经过数组中的位置(第一个值,在第二个值阵列等);另一个通过不同的阵列(j
)。它通过检索存储在tab[j]
中的指针并创建一个具有右偏移量的新指针来显示i
列的值。这被称为指针运算(有关于指针运算here附加信息)
大多数人觉得语法*(tab[j] + i)
是笨重,但它更描述了什么是真正发生。在C中,您可以将其重写为tab[j][i]
,这更常见。
'* tab [i]'与tab [i] [0]'相同。 'tab [i] [1]','tab [i] [2]',...会发生什么?...? – pmg 2012-07-06 13:38:52
那:'for(i = 0; i <4; ++ i){printf(“%d%d%d%d \ n”,tab [0] [i],tab [1] [i],标签[2] [i],标签[3] [i]);}'? – fork0 2012-07-06 13:39:42