免费注册 查看新帖 |

Chinaunix

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

[C] 关于数组作为函数参数什么时候退化为指针的问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-11 12:43 |只看该作者 |倒序浏览
很拗口

  1. #include <stdio.h>

  2. int fun(char a[20], size_t b);

  3. char c[20] = "";
  4. int main()
  5. {
  6.   fun(c[20],sizeof(c));
  7. }

  8. int fun(char a[20], size_t b)
  9. {
  10.    printf("%d\t%d",b,sizeof(a));
  11. }
复制代码


答案是 20 4
也就是说, 在函数参数中,sizeof(a)中的a还是数组,但到了函数体内,就退化为指针.高手说说深层次的原理吧.谢谢

[ 本帖最后由 aaaab 于 2008-6-11 12:46 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-11 12:51 |只看该作者
int fun(char a[20], size_t b)
{
   printf("%d\t%d",b,sizeof(a));
}

C语言处理a[n]的时候,它没有办法知道n是几,它只知道&n[0]是多少,它的值作为参数传递进去了
虽然c语言可以做到直接int fun(char a[20]),然后函数能得到20这个数字,但是,C没有这么做,至于原因就不太清楚了,或许是大多数时候都没有必要吧

论坛徽章:
0
3 [报告]
发表于 2008-06-11 12:51 |只看该作者
这个语言就是这样子设计的咯.

论坛徽章:
0
4 [报告]
发表于 2008-06-11 12:56 |只看该作者
这个退化我知道,请看我的代码,在函数参数里测量sizeof(c) = 20. 我一开始的想法还是以为是4

论坛徽章:
0
5 [报告]
发表于 2008-06-11 13:27 |只看该作者
以前有过大量讨论,search一下就明白了
还有某个人的帖子《都是退化惹得祸》

论坛徽章:
0
6 [报告]
发表于 2008-06-11 15:25 |只看该作者
呵呵
退化

论坛徽章:
0
7 [报告]
发表于 2008-06-11 16:05 |只看该作者
请看一下我的代码. 在函数参数那调用就还是数组,进了函数体才退化到指针

论坛徽章:
0
8 [报告]
发表于 2008-06-11 16:08 |只看该作者
c[20]不越界了吗?
是个字符。

论坛徽章:
0
9 [报告]
发表于 2008-06-11 17:13 |只看该作者
原帖由 aaaab 于 2008-6-11 16:05 发表
请看一下我的代码. 在函数参数那调用就还是数组,进了函数体才退化到指针

这个程序编译会有警告的,fun(c[20], sizeof(c))中c[20]是个字符,另外数组还越界了,函数调用的参数不匹配。

论坛徽章:
0
10 [报告]
发表于 2008-06-11 17:14 |只看该作者

回复 #1 aaaab 的帖子

请参考《C专家编程》第十章
10.4 向函数传递一个一维数组
10.5 使用指针向函数传递一个多维数组
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP