2D array and pointers

In this tutorial, we are going to learn the relationship between 2d array and pointers.




2D array

Let's declare a 3x3 array.

int arr[3][3];

Let's assume the starting address of the above 2D array as 1000.

Visual Representation

2D array

The above array's memory address is an arithmetic progression with common difference of 4 as the size of an integer is 4.




&arr is a whole 2D array pointer

&arr is a pointer to the entire 2D(3x3) array. i.e. (int*)[3][3]

If we move &arr by 1 position(&arr+1), it will point to the next 2D block(3X3).


In our case, the base address of the 2D array is 1000. So, &arr value will be 1000.

What will be the value of &arr+1?

In general, for Row x Col array the formula will be base address + (Row * Col) * sizeof(array datatype)

In our case, Row = 3, Col = 3, sizeof(int) = 4.

It is base address + (3 * 3)* 4 => 1000 + 36 => 1036

2D array whole pointer



arr is a 1D array pointer

arr is a pointer to the first 1D array. i.e. (int*)[3]

If we move arr by 1 position(arr+1), it will point to the next 1D block(3 elements).


The base address of first 1D array also 1000. So, arr value will be 1000.

What will be the value of arr+1?

It will be base address + Row * sizeof(datatype).

1000 + 3 * 4

1012

2D row pointer



*arr is a pointer to the first element of the 2D array.

*arr is a pointer to the first element of the 2D array. i.e. (int*)

If we move *arr by 1 position(*arr+1), it will point to the next element.


The base address of the first element also 1000.So, *arr value will be 1000.

What will be the value of *arr+1?

It will be base address + sizeof(datatype).

1000 + 4

1004

2D element pointer



**arr will be the value of the first element.

Since *arr holds the address of the first element, **arr will give the value stored in the first element.

If we move **arr by 1 position(**arr+1), the value will be incremented by 1.

If the array first element is 10, **arr+1 will be 11.




Summary

1. &arr is a 2D array pointer (int*)[row][col]. So, &arr+1 will point the next 2D block.

2. arr is a 1D array pointer (int*)[row]. So, arr+1 will point the next 1D array in the 2D array.

3. *arr is a single element pointer (int*). So, *arr+1 will point the next element in the array.

4. **arr is the value of the first element. **arr+1 will increment the element value by 1.