Home > Enterprise >  dereferencing 2D array using arithmetic
dereferencing 2D array using arithmetic

Time:07-07

int main(void) 
{
    short arr[3][2]={3,5,11,14,17,20};
    printf("%d %d",*(arr 1)[1],**(arr 2));
    return 0;
}

Hi. In above code as per my understanding ,*(arr 1)[1] is equivalent to *(*(arr sizeof(1D array)*1) sizeof(short)*1)=>arr[1][1] i.e 14. But the program output is arr[2][0]. can someone please explain how dereferencing the array second time adds sizeof(1Darray) i.e *(*(arr sizeof(1D array)*1) sizeof(1D array)*1)=>arr[2][0]

CodePudding user response:

From the C Standard (6.5.2.1 Array subscripting)

2 A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1) (E2))). Because of the conversion rules that apply to the binary operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).

So the expression

*(arr 1)[1]

can be rewritten like

* ( *( arr   1   1 ) )

that is the same as

*( *( arr   2 ) )

arr 2 points to the third "row" of the array. Dereferencing the pointer expression you will get the "row" itself of the type short[2] that used in the expression *( arr[2] ) is converted to pointer to its first element. So the expression equivalent to arr[2][0] yields the value 17.

Thus these two expressions

*(arr 1)[1],

and

**(arr 2)

are equivalent each other.

Note: pay attention to that there is a typo in your code

printf("%d %d",*(arr 1)[1],**(arr 2);

You need one more parenthesis

printf("%d %d",*(arr 1)[1],**(arr 2) );
  • Related