免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2619 | 回复: 4
打印 上一主题 下一主题

形参数组的地址和它的第一个元素地址为何不同 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-16 10:49 |只看该作者 |倒序浏览
看 C 专家编程(徐波译),p216,“玩转数组/指针参数”的例子。简写如下:
  1. #include <stdio.h>

  2. char ga[] = "abcdefg";

  3. void array_func(char ca[10]) {
  4.         printf(" addr of array param = %#x \n", &ca);
  5.         printf(" addr (ca[0]) = %#x \n", &(ca[0]));
  6.         printf(" addr (ca[1]) = %#x \n", &(ca[1]));
  7.         printf(" ++ca = %#x \n\n", ++ca);
  8. }

  9. int main(void) {
  10.         printf(" addr of global array = %#x \n", &ga);
  11.         printf(" addr (array[0]) = %#x \n", &(ga[0]));
  12.         printf(" addr (array[1]) = %#x \n\n", &(ga[1]));

  13.         array_func(ga);

  14.         return 0;
  15. }
复制代码
我执行的结果:
  1. [fyodor @ ~]$ ./work/gcc/diff_addr_arry
  2. addr of global array = 0x8049708
  3. addr (array[0]) = 0x8049708
  4. addr (array[1]) = 0x8049709

  5. addr of array param = 0xbfb223f0
  6. addr (ca[0]) = 0x8049708
  7. addr (ca[1]) = 0x8049709
  8. ++ca = 0x8049709

  9. [fyodor @ ~]$ ./work/gcc/diff_addr_arry
  10. addr of global array = 0x8049708
  11. addr (array[0]) = 0x8049708
  12. addr (array[1]) = 0x8049709

  13. addr of array param = 0xbfad3930
  14. addr (ca[0]) = 0x8049708
  15. addr (ca[1]) = 0x8049709
  16. ++ca = 0x8049709
复制代码
每次还不同。怀疑是 stack 中对 array_func 参数动态分配了 ca 的地址。
请教诸位。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-04-16 11:14 |只看该作者
&ca取到的是栈中的地址

论坛徽章:
0
3 [报告]
发表于 2010-04-16 11:17 |只看该作者
把数组作为参数时,实际上只传了一个指针,就是数组的首地址,相当于把数组的首地址压栈,因此array_func打印ca的地址,就是栈上的地址。

论坛徽章:
0
4 [报告]
发表于 2010-04-16 12:01 |只看该作者
如果把
  1. void array_func(char ca[10])
复制代码
变成
  1. void array_func(char* ca, int len)
复制代码
这样你好理解了把
栈变量....

不传参直接这样再看看
char ga[] = "abcdefg";

...main...

char* str = ga;

printf .. &str
printf .. &str[0]
printf .. &str[1]

论坛徽章:
0
5 [报告]
发表于 2010-04-16 12:21 |只看该作者
谢楼上诸位。

我知道一维形参数组的函数传递进来的是指针,ca 为栈变量。之前短路了,应该是 ca 同 &ga[0],&ca 是指针本身的地址了,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP