2012-07-06 192 views
4

我新的C编程,这是我的问题:阵列指针到阵列

欲每个阵列的第一值存储在一个新的数组,在一个新的阵列中的每个阵列的随后的第二个值等等。

我可以声明指针数组,但我不知道如何使用它!

请帮我。

int main() 
{ 
    int t1[4]={0,1,2,3}; 
    int t2[4]={4,5,6,7}; 
    int t3[4]={8,9,10,11}; 
    int t4[4]={12,13,14,15}; 
    int *tab[4]={t1,t2,t3,t4}; 
    int i,j,k,l; 
    for (i=0; i<4;i++) 
    { 
     printf("%d\t", *tab[i]); 
    } 

    return 0; 
} 

当我这样做时,我只存储每个数组的第一个值。

+1

'* tab [i]'与tab [i] [0]'相同。 'tab [i] [1]','tab [i] [2]',...会发生什么?...? – pmg 2012-07-06 13:38:52

+0

那:'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

回答

1

你存储的一切,但你只是不显示它。尝试

for (i=0; i<4;i++) 
{ 
    for (j=0; j<4; j++) 
    printf("%d\t", *(tab[i]+j)); 
} 
+2

ITYM'printf(“%d \ t”,tab [i] [j]);'或'printf(“%d \ t”,*(tab [i] + j));' – pmg 2012-07-06 13:43:18

+0

问题要求打印每个数组的第一个元素,然后是第二个,然后是第三个。 *不是*第一个数组,然后第二个数组等。 – Jerome 2012-07-06 14:02:35

3

你存储你想要的数据,你只需要访问它正确

for (i=0; i<4;i++) 
{ 
    for (j = 0; j < 4; j++) { 
    int* temp = tab[i];  
    printf("%d\t", temp[j]);  // or try the next line... 
    printf("%d\t", *(temp + j)); // prints same value as above line 
    printf("%d\t", tab[i][j];  // the same value printed again 
    } 
} 

上述所有打印相同的值,它只是不同的使用访问该值的方法指针算术。的tab每个元素都是一个int*各自的价值是你的其他的地址定义int[]阵列在开始

编辑:针对杰罗姆的评论,你可以做到这一点通过声明4个阵列

int tab1[4]={*t1,*t2,*t3,*t4}; 
int tab2[4]={*(t1+1),*(t2+1),*(t3+1),*(t4+1)}; 
int tab3[4]={*(t1+2),*(t2+2),*(t3+2),*(t4+2)}; 
int tab4[4]={*(t1+3),*(t2+3),*(t3+3),*(t4+3)}; 

现在tab1包含每个数组的第一个元素,tab2第二个元素,依此类推。 然后你可以使用

int *tttt[4]={tab1,tab2,tab3,tab4}; 
for (i=0; i<4;i++) { 
    for (j = 0; j < 4; j++) { 
    printf("%d\t", tttt[i][j]); 
    } 
} 

打印你想要的东西。如果你声明的另一个指针数组像你这样在开始

int* tab[4] = {t1,t2,t3,t4}; 

则基本上在矩阵方面,tttttab

+0

问题要求打印每个数组的第一个元素,然后是第二个,然后是第三个。 *不是*第一个数组,然后是第二个数组等。 – Jerome 2012-07-06 14:02:28

11

您的术语转置是有点所有的地方。我认为最简单的方法来回答你的问题是逐行浏览你的代码。

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],这更常见。