Array of pointers to arrays

前端 未结 4 1897
温柔的废话
温柔的废话 2021-01-05 03:47

I am new to C programming and this is my problem:

I want to store the first value of each array in a new array, then the second value of each array in a new array an

相关标签:
4条回答
  • 2021-01-05 03:59

    Your terminology is a little bit all over the place. I think the easiest way to answer your question is to go through your code line by line.

    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;
     }
    

    Everything you are doing seems ok until your loop. You are showing only the first integer of every array because you are not going through them. To iterate over them, your code should look like this:

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

    The above code uses two loop counters, one (the i) to go through the positions in the array (first value in the array, second value in the array, etc.); the other to go through the different arrays (the j). It does this by retrieving the pointer stored in tab[j] and creating a new pointer that has the right offset to show the value for the ith column. This is called pointer arithmetic (there is additional information about pointer arithmetic here)

    Most people find the syntax *(tab[j] + i) to be clunky, but it is more descriptive of what is actually happening. In C, you can rewrite it as tab[j][i], which is much more usual.

    0 讨论(0)
  • 2021-01-05 03:59

    int* (*a[5])[5][5][5] declares an array of 5 pointers to a 3d array of pointers to ints

    int* (*(*a[5])[5])[5][5][5] declares an array of 5 pointers to an array of 5 pointers to a 3d array of pointers to ints.

    #include <stdio.h>
    
    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])[4]={&t1,&t2,&t3,&t4};
        int i,j,k,l;
        for (i=0; i<4;i++)
        {
            printf("%d\t", (*tab[i])[1]);
        }
    
        return 0;
    }
    

    There's a difference between t2 and &t2. Though they have the same value their types are different. int [4] vs int (*)[4]. The compiler will throw a warning (clang) or error (gcc).

    int a[4] is conceptually at compiler level a pointer to an array of 4 as well as being the array itself (&a == a).

    int (*a)[4] is conceptually at compiler level a pointer to a pointer to an array of 4 as well as being a pointer to the array itself (a == *a) because it's pointing to an array type where the above is true.

    0 讨论(0)
  • 2021-01-05 04:03

    You store everything but you just don't show it. Try

    for (i=0; i<4;i++)
     {
      for (j=0; j<4; j++)
      printf("%d\t", *(tab[i]+j));
     }
    
    0 讨论(0)
  • 2021-01-05 04:04

    You have stored the data as you intended, you just need to access it properly

    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
      }
    }   
    

    All of the above print the same value, it is just different ways of accessing that value using pointer arithmetic. Each element of tab is a int* the value of each is the address of your other defined int[] arrays at the start

    Edit: In response to the comment of Jerome, you can achieve that by declaring 4 arrays

    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)};
    

    Now tab1 contains the first elements of each array, tab2 the second elements, and so on. Then you can use

     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]);   
       }
     } 
    

    to print what you wanted. If you declared another pointer array like you did at the start

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

    then essentially in matrix terms, tttt is the transpose of tab

    0 讨论(0)
提交回复
热议问题