I have an example involving a pointer to a 2D array. Can someone help me understand what is going on in this example?
int main()
{
int i = 0, j=0, sum0=0, sum1=0;
int data[4][3] = { {23,55,50},{45,38,55},{70,43,45},{34,46,60}};
int *Ptr;
Ptr = *data; //Why is the indirection operator used here?
// Does Ptr = 23 by this assignment?
for (i=0; i<4; i++) {
sum1 = 0;
for (j = 0; j < 3; j++) {
sum1 += data[i][j];
}
if (sum1 > sum0) {
sum0 = sum1;
Ptr = *(data + i); // Seems like this statement makes Ptr
} // point one row below ... what syntax
} // can you use to access columns then?
// Is it possible to use pointer arithmetic
for (i=0; i<3; i++) // to access elements of data[i][j] that
printf("%d\n", Ptr[i]); // are not at j = 0?
return 0;
}
datais a 2 dimentional array, which has 4 rows and each row has 3 elements (ie 4 X 3).Now,
Ptr = *data;means you are storing the starting address of 1st row to the pointer variablePtr. This statement is equivalent toPtr = *(data + 0).Ptr = *(data + 1)– this means we are assigning 2nd row’s starting address.Then
*Ptror*(Ptr + 0)will give you the value of the first element of the row to which is pointing. Similarly,*(Ptr + 1)will give you the value of the second element of the row.The
forloop in your program is used to identify which row has the maximum value of the sum of its elements (3 elements). Once the control comes out of thatforloop,Ptrwill be pointing to the row which has the maximum sum of its elements andsum0will have the value of the sum.Consider an array
int a[5];, I hope you know thata[0]and0[a]is the same. This is becausea[0]means*(a+0)and0[a]means*(0 + a). This same logic can be used in 2 dimensional array.data[i][j]is similar to*(*(data + i) + j). We can write it asi[data][j]also.For more details please refer to the book "Understanding Pointers in C" by Yashavant Kanetkar.