为什么两个不同函数的数组和指针参数的地址相同?

3

我有以下代码,来自Peter van der Linden的Expert C Programming - Deep C Secrets第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  

我感到困惑的是为什么数组参数的地址指针参数的地址是相同的。对我来说,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
可能是Char array vs Char Pointer in C的重复问题。 - Jim Garrison
1个回答

2

我很困惑为什么数组参数和指针参数的地址相同。对我来说,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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接