简体   繁体   中英

Use of & in declaring pointers to array

To make a pointer to a whole array we proceed like that:

    int arr[3] = {1,2,3};
    int (*p)[3] = &arr;

How come i get an incompatibility error when trying to do the same with a 2D array?

    int arr[3][3] = {{12,10,45}, {44,55,66}, {79,85,91}};
    int (*p)[3] = &arr;

The problem here is &.

I'm sure this is a simple question that might have already been answered but i don't find any answer to this specific issue concerning the use of &.

You've got p in the second example as a pointer to a 1D array, not a pointer to a 2D array. For that, you need the following:

int (*p)[3][3] = &arr;

arr has type int [3][3] , so &arr has type int (*)[3][3] . So you can use:

int arr[3][3] = {{12,10,45}, {44,55,66}, {79,85,91}};
int (*p)[3][3] = &arr;

You can then access p as (*p)[i][j] .

But it would be more typical to use:

int arr[3][3] = {{12,10,45}, {44,55,66}, {79,85,91}};
int (*p)[3] = arr;

In this case, int [3][3] is compatible with an int (*)[3] pointer, and you can use p[i][j] when accessing it.

An analogous situation exists with one-dimensional arrays. If you have int x[3] , then the usual pointer type to use is int *p , in which case you would do p = x and access it as p[i] .

But if you really want the extra level of indirection, you could use:

int (*p)[3] = &x;

Then instead of p[i] , you would now need to use (*p)[i] when accessing it.

In C, "pointer" is a category of types. To get a particular type, you have to specify what type of object the pointer points to .

Accordingly, the unary & does not generically compute a pointer. It creates a pointer to the type of its operand.

Similarly, in C, "array" is a category of types. To get a particular type, you have to specify the element type, the number of dimensions , and the sizes of at least the last n-1 dimensions.

Thus, with

 int arr[3] = {1,2,3}; int (*p)[3] = &arr;
  • arr is defined as an array of 3 int , therefore
  • &arr has type pointer to array of 3 int (spelled int (*)[3] as a C type name), and
  • p is declared with that type

so everything is consistent.

How come i get an incompatibility error when trying to do the same with a 2D array?

Because your "the same" is not analogous.

With

 int arr[3][3] = {{12,10,45}, {44,55,66}, {79,85,91}}; int (*p)[3] = &arr;

, arr has type array of 3 array of 3 int , and &arr has type pointer to array of 3 array of three int (aka int (*)[3][3] ). This is not the same type that p has . The appropriate declaration of p for this version of arr would be

    int (*p)[3][3] = &arr;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM