user2465355
user2465355

Reputation: 375

Can I access elements of a 2D array using pointers in C++?

For 1D array, I can use array name as a pointer and add offset to it to access each element of the array. Is there something similar for 2D arrays?

I defined a 2D array as follows

int arr[2][3] = {{1,2,3}, {4,5,6}};

int** arrPtr = arr;

but I got compiler error for the second line. Shouldn't 2D array have type int**?

I came across another thread here:

C++ Accessing Values at pointer of 2D Array

and saw this:

2dArray = new int*[size];

Could someone please tell me what int*[size] means? (size is an int, I presume).

Thanks a lot.

Upvotes: 2

Views: 12559

Answers (2)

IanPudney
IanPudney

Reputation: 6021

A multidimensional array defined as yours is is only a single pointer, because the data is encoded in sequence. Therefore, you can do the following:

int arr[2][3]={{1,2,3},{4,5,6}};
int* arrPtr = (int*)arr;

In general, the pointer to the element at arr[a][b] can be accessed by arrPtr + a*bSize + b where bSize is the size of the first array dimension (in this case three).

Your second question relates to dynamic memory allocation - allocating memory at runtime, instead of defining a fixed amount when the program starts. I recommend reviewing dynamic memory allocation on cplusplus.com before working with dynamically allocated 2D arrays.

Upvotes: 3

Cob013
Cob013

Reputation: 1067

int* array[10] means an array of 10 pointers to integer.

You can access a 2D array with a simple pointer to its first entry and do some maths exploiting the spacial location principle.

int array[2][2] = {{1,2}, {3, 4}};
int* p = &array[0][0];
for(int i=0; i<2*2; i++)
   printf("%d ", *(p++));

If you have a matrix:

 1 2
 3 4

in memory it is encoded as 1 2 3 4 sequentially ;)

Upvotes: 1

Related Questions