Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Traverse through layers of array using pointer to layer of array

Tags:

arrays

c

pointers

                         |--------|     
//                     / |4  4  4 |     
//                   |--------| 4 | 
//                 / |3  3  3 | 4 | 
//               |---------|3 |   |
//             / | 2  2  2 |3 | /
//            |---------|2 |__|
//            | 1  1  1 |2 | /
//            | 1  1  1 |__| 
//            | 1  1  1 | /
//            |_________|
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}};

I consider that this array consists of 4 layers.

I want to create pointer to layer of array and traverse through layers of that array using pointer.

I try :

double (*pp1)[sizeof(arr[0]) / sizeof(ar[0][0][0])]; 
pp1 = arr[0]; 

and get error from intelIsense: value of type (double (*)(3) can`t be assigned to double(*)(9)

like image 456
spin_eight Avatar asked Sep 14 '12 09:09

spin_eight


People also ask

How do you iterate through a pointer to an array?

This is done as follows. int *ptr = &arr[0]; After this, a for loop is used to dereference the pointer and print all the elements in the array. The pointer is incremented in each iteration of the loop i.e at each loop iteration, the pointer points to the next element of the array.

How is the 2nd element in an array accessed based on pointer notation *?

How is the 2nd element in an array accessed based on pointer notation? a[2] is equivalent to *(a + 2) in pointer notation.

How the array can be handled by the Pointers in C language explain?

When we allocate memory to a variable, pointer points to the address of the variable. Unary operator ( * ) is used to declare a variable and it returns the address of the allocated memory. Pointers to an array points the address of memory block of an array variable.


1 Answers

So if you do:

int i;
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},
                       {3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}};

double (*pp3)[3][3];    
pp3 = arr;    
for (i = 0; i <= 3; i++)    
{   printf("pp3 + %d is %f \n", i, ***(pp3 + i));
}   

Then you get the desired behavior. The problem with your code is that, just as the compiler is telling you, you are trying to assign a pointer to an array of 9 double (double (*pp1)[sizeof(arr[0] / sizeof(arr[0][0][0])] evaluates to double (*pp1)[9] ), but you need a pointer to an array of 3 of array of 3, which is what you declared with double arr[4][3][3]. From my tests, gcc will accept the double (*pp1)[9] with a compiler warning, which is what I tried to get at in my comment below. Hope that clears things up.

If you want to keep this general, then what you really want is double (*pp3)[sizeof(arr[0]) / sizeof(arr[0][0])][sizeof(arr[0][0]) / sizeof(arr[0][0][0])], which is a bloody nightmare.

EDIT: Forgot a dereference... Should've copy/pasted haha. Also added explanation about the question's code behavior. Fixed as per comments.

like image 117
surfreak Avatar answered Sep 23 '22 01:09

surfreak