I have the following code from Chapter 9 of Expert C Programming - Deep C Secrets by Peter van der Linden.
char ga[] = "abcdefghijklm";
void my_array_func( char ca[10] )
{
printf(" addr of array param = %#x \n",&ca);
printf(" addr (ca[0]) = %#x \n",&(ca[0]));
}
void my_pointer_func( char *pa )
{
printf(" addr of ptr param = %#x \n",&pa);
printf(" addr (pa[0]) = %#x \n",&(pa[0]));
}
main()
{
printf(" addr of global array = %#x \n",&ga);
printf(" addr (ga[0]) = %#x \n",&(ga[0]));
my_array_func( ga );
my_pointer_func( ga );
}
The output looks like:
addr of global array = 0x870f018
addr (ga[0]) = 0x870f018
addr of array param = 0x574f17c8
addr (ca[0]) = 0x870f018
addr of ptr param = 0x574f17c8
addr (pa[0]) = 0x870f018
I am confused why addr of array param
and addr of ptr param
are the same. As for me, ca
and pa
are two different pointers, and thus their addresses should be different. Anyone can help to explain?
As a contrast:
main ()
{
int a = 1;
int *p1 = &a;
int *p2 = &a;
printf("add of p1 = %#x \n", &p1);
printf("add of p2 = %#x \n", &p2);
}
will give result of different addresses:
addr of p1 = 0x50a687e0
addr of p2 = 0x50a687d8
What's the difference between the two code pieces?