为什么两个不同函数的array-和pointer-argument的地址相同?

时间:2015-09-07 03:03:13

标签: c arrays pointers

我有来自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 paramaddr of ptr param是相同的。至于我,capa是两个不同的指针,因此它们的地址应该是不同的。有人可以帮忙解释一下吗?

作为对比:

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    

两个代码之间有什么区别?

1 个答案:

答案 0 :(得分:2)

  

我很困惑为什么数组参数的addr和ptr para的addr是相同的。至于我,ca和pa是两个不同的指针,因此它们的地址应该是不同的。任何人都可以帮忙解释一下吗?

这很巧合。

my_array_funcmy_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