【问题标题】:Why the addresses of array- and pointer-argument of two different functions are the same?为什么两个不同函数的数组和指针参数的地址相同?
【发布时间】:2015-09-07 03:03:13
【问题描述】:

我有以下代码来自 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  

我很困惑为什么 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    

这两个代码段有什么区别?

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

我很困惑为什么数组参数的 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多