A pointer to 2d array

匿名 (未验证) 提交于 2019-12-03 09:02:45

问题:

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]?

回答1:

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:

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.



回答3:

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].



回答4:

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[][] */ 


回答5:

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 .



文章来源: A pointer to 2d array
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!