我有来自Peter van der Linden的专家C编程 - 深C秘密第9章的以下代码。
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 );
}
输出如下:
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
我很困惑为什么addr of array param
和addr of ptr param
是相同的。至于我,ca
和pa
是两个不同的指针,因此它们的地址应该是不同的。有人可以帮忙解释一下吗?
作为对比:
main ()
{
int a = 1;
int *p1 = &a;
int *p2 = &a;
printf("add of p1 = %#x \n", &p1);
printf("add of p2 = %#x \n", &p2);
}
将给出不同地址的结果:
addr of p1 = 0x50a687e0
addr of p2 = 0x50a687d8
两个代码之间有什么区别?
答案 0 :(得分:2)
我很困惑为什么数组参数的addr和ptr para的addr是相同的。至于我,ca和pa是两个不同的指针,因此它们的地址应该是不同的。任何人都可以帮忙解释一下吗?
这很巧合。
my_array_func
和my_pointer_func
的堆栈帧的内存要求相同。因此,用于存储参数的地址是相同的。
另外,请记住
void my_array_func( char ca[10] )
与
相同void my_array_func( char* ca )
如果您在调用my_pointer_func
之前引入了另一层功能,则会看到地址不同。
#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 );
}
输出:
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