52

I have a question about a pointer to 2d array. If an array is something like

int a[2][3];

then, is this a pointer to array a?

int (*p)[3] = a;

If this is correct, I am wondering what does [3] mean from int(*p)[3]?

6 Answers 6

43
int a[2][3];

a is read as an array 2 of array 3 of int which is simply an array of arrays. When you write,

int (*p)[3] = a;

It declares p as a pointer to the first element which is an array. So, p points to the array of 3 ints which is a element of array of arrays.

Consider this example:

        int a[2][3]
+----+----+----+----+----+----+
|    |    |    |    |    |    |
+----+----+----+----+----+----+
\_____________/
       |
       |    
       |
       p    int (*p)[3]

Here, p is your pointer which points to the array of 3 ints which is an element of array of arrays.

Sign up to request clarification or add additional context in comments.

1 Comment

wouldn't "p" become an array of 3 integer pointers, with the first value pointing to the first value of "a"?
40

Rather than referring to int[2][3] as a '2d array', you should consider it to be an 'array of arrays'. It is an array with two items in it, where each item is itself an array with 3 ints in it.

int (*p)[3] = a;

You can use p to point to either of the two items in a. p points to a three-int array--namely, the first such item. p+1 would point to the second three-int array. To initialize p to point to the second element, use:

int (*p)[3] = &(a[1]);

The following are equivalent ways to point to the first of the two items.

int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);

2 Comments

You could even write [3]a for example :) It's a good way of learning what arrays in C really are.
How much memory does this declaration take: int (*p)[65];?? Is this one pointer, or 65 pointers?
12

Stricly speaking, no, int (*p)[3] = a; is not a pointer to a. It is a pointer to the first element of a. The first element of a is an array of three ints. p is a pointer to an array of three ints.

A pointer to the array a would be declared thus:

int (*q)[2][3] = &a; 

The numeric value of p and q are likely (or maybe even required to be) the same, but they are of different types. This will come into play when you perform arithmetic on p or q. p+1 points to the second element of array a, while q+1 points to the memory just beyond the end of array a.

Remember: cdecl is your friend: int a[2][3], int (*q)[2][3].

Comments

6

The [3] is a part of the type. In this case p is a pointer to an array of size 3 which holds ints.

The particular type of an array always includes its size, so that you have the types int *[3] or int *[5], but not just int *[] which has undefined size.

int *x[20]; /* type of x is int *[20], not just int *[] */
int y[10][10]; /* type of y is int[10][10], not just int[][] */

2 Comments

Thanks for your comment. When you say size, does it mean (*p) has [0],[1]],[2] ? If this is the case, where is a room for [2]? Or does it points to [0][0] and [0][1]?
p is simply a pointer to an array of 3 ints. It doesn't know that the first dimension of a is 2, because it is assigned to the first element of a, which is exactly of type int[3].
4

you can point to 2d array like 1d array

#include <iostream>
int main()
{
   int array[2][2] = {{0,1}, {2,3}}; // array
   int *ptr;
   ptr=(int*)array;
   std::cout << *(ptr)   << '\n';//out 0
   std::cout << *(ptr+1) << '\n';//out 1 
   std::cout << *(ptr+2) << '\n';//out 2
   std::cout << *(ptr+3) << '\n';//out 3
}

Comments

3

Also note:

int *p[5]        // p is an array of 5 pointers

int (*p)[5]      // p points to an array of 5 ints

int (*(p+5))[10] // p is a pointer to a structure where the structure's 5th element has 10 ints .

2 Comments

The OP asks a conceptual question and I have answered it here. In place of 5 put 3!. Also I have added more details on how to obtain value from 2d arrays using pointers.
I would argue that this is more confusing than the rest of the answers provided here.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.