Given that the name of an array is actually a pointer to the first element of an array, the following code:
#include <stdio.h>
int main(void)
{
int a[3] = {0, 1, 2};
int *p;
p = a;
printf("%d\n", p[1]);
return 0;
}
prints 1
, as expected.
Now, given that I can create a pointer that points to a pointer, I wrote the following:
#include <stdio.h>
int main(void)
{
int *p0;
int **p1;
int (*p2)[3];
int a[3] = {0, 1, 2};
p0 = a;
p1 = &a;
p2 = &a;
printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",
p0[1], (*p1)[1], (*p2)[1]);
return 0;
}
I expected it to compile and print
p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1
But instead, it goes wrong at compile time, saying:
test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]
Why is that assignment wrong? If p1
is a pointer to a pointer to an int
and a
is a pointer to an int
(because it's the name of an array of int
s), why can't I assign &a
to p1
?
Line 11 is
p1 = &a;
where p1
has type int **
and a
has type int[3]
, right?
Well; &a
has type int(*)[3]
and that type is not compatible with int**
as the compiler told you
You may want to try
p1 = &p0;
And read the c-faq , particularly section 6.
In short: arrays are not pointers , and pointers are not arrays .
a
is not a pointer to int
, it decays to such in certain situations. If &a
was of type int **
you couldn't very well use it to initialize p2
, could you?
You need to do p1 = &p0;
for the effect you want. "pointer to pointer" means "at this address, you will find a pointer". But if you look at the address &a
, you find an array (obviously), so int **
is not the correct type.
For many operations, a
implies &a
and both return the same thing: The address of the first item in the array.
You cannot get the address of the pointer because the variable does not store the pointer. a
is not a pointer, even though it behaves like one in some cases.
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.