Reputation: 45
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?
Upvotes: 3
Views: 71
Reputation: 206557
I am confused why addr of array param and addr of ptr para 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?
It's coincidence.
The memory requirements of the stack frame for my_array_func
and my_pointer_func
are same. Hence, the address used to store the argument is same.
Also, remember that
void my_array_func( char ca[10] )
is the same as
void my_array_func( char* ca )
If you introduce another layer of function before the call to my_pointer_func
, you'll see that the addresses are not the same.
#include <stdio.h>
char ga[] = "abcdefghijklm";
void my_array_func( char ca[10] )
{
printf(" addr of array param = 0x%p \n",&ca);
printf(" addr (ca[0]) = 0x%p \n",&(ca[0]));
}
void my_pointer_func( char *pa )
{
printf(" addr of ptr param = 0x%p \n",&pa);
printf(" addr (pa[0]) = 0x%p \n",&(pa[0]));
}
void intermediate_func(char* pa)
{
my_pointer_func( pa );
}
int main()
{
printf(" addr of global array = 0x%p \n",&ga);
printf(" addr (ga[0]) = 0x%p \n",&(ga[0]));
my_array_func( ga );
my_pointer_func( ga );
intermediate_func( ga );
}
Output:
addr of global array = 0x0x601040
addr (ga[0]) = 0x0x601040
addr of array param = 0x0x7fffee05cf98
addr (ca[0]) = 0x0x601040
addr of ptr param = 0x0x7fffee05cf98
addr (pa[0]) = 0x0x601040
addr of ptr param = 0x0x7fffee05cf78
addr (pa[0]) = 0x0x601040
Upvotes: 2