Can C language access one-dimensional array in the form of two-dimensional array

char p1[12] = {1,2,3,4,5,6};

char (*p2)[3];

p2 = &p1;

this is possible, but gcc compiles with a warning:

warning: assignment from incompatible pointer type [- Wincompatible-pointer-types]

Mar.03,2022

the following is just a personal understanding. If there are any fallacies, thank you for pointing out.

the first thing to make clear is that
although all pointers are fixed in size (for example, 4 bytes in a 32-bit environment), the pointer itself is typed, that is, each pointer can only point to an object of a specific type (except void * ), such as int * pointer can only point to int type data.

then the array type:
Let's declare an array int a [10]; is convenient to explain.
although in many cases the array name is implicitly converted into a pointer to the first element of the array, giving the illusion of a = & a [0] , the array is indeed a separate type, and you can realize it in two cases-- & a and sizeof (a) ,
& a points to the whole number. When we try to write this, int * p = & a; , compilation cannot pass, and must be written as int (* p) [10] = & a; , that is, a simple int pointer cannot receive the result of & a.
when we print out the result of sizeof (a) , we can see that it is 40 bytes instead of 4 bytes, so obviously the array name and pointer are two different things.
understands that an array is a special type, so we can know that the a just declared above is actually an int array type
of length 10, that is, int (*) [10] type. Note that the 10 here cannot be ignored, and the length is part of the array type.

back to the question,
p2 is a pointer because it points to a char array of length 3, so its type is char (*) [3] ,
and p1 is a char array of length 12, so the type of & p1 is: char (*) [12] ,
now assigns & p1 to p2, although both belong to p2. So the compiler will report an error,
if you really want to do this, you need to do a cast:
p2 = (char (*) [3]) & p1;

Menu