1void Init(int arr[])
2{
3 size_t i=0;
4 for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
5 {
6 arr[i]=i;
7 }
8}
9int main(void)
10{
11 int i=0;
12 int a[10];
13 Init(a);
14 for(i=0;i<10;i++)
15 {
16 printf("%d\n",a[i]);
17 }
18 return 0;
19}
从表面看,上面代码的输出结果应该是0,1,2,3,4,5,6,7,8,9,但实际结果却出乎我们的意料,如图 1 所示 。
文章插图
图 1 示例代码在 VC++2010 中的运行结果
是什么原因导致这个结果呢?很显然,上面的示例代码在void Init(int arr[])函数中接收了一个int arr[]类型的形参,并且在main函数中向它传递一个a[10]实参 。同时,在 Init() 函数中通过sizeof(arr)/sizeof(arr[0])来确定这个数组元素的数量和初始化值 。
在这里出现了一个很大问题:由于 arr 参数是一个形参,它是一个指针类型,其结果是sizeof(arr)=sizeof(int*) 。在 IA-32 中,sizeof(arr)/sizeof(arr[0])的结果为 1 。因此,最后的结果如图 1 所示 。
对于上面的示例代码,我们可以通过传入数组的长度的方式来解决这个问题,示例代码如下:
1void Init(int arr[],size_t arr_len)
2{
3 size_t i=0;
4 for(i=0;i<arr_len;i++)
5 {
6 arr[i]=i;
7 }
8}
9int main(void)
10{
11 int i=0;
12 int a[10];
13 Init(a,10);
14 for(i=0;i<10;i++)
15 {
16 printf("%d\n",a[i]);
17 }
18 return 0;
19}
除此之外,我们还可以通过指针的方式来解决上面的问题,示例代码如下所示:
1void Init(int (*arr)[10])
2{
3 size_t i=0;
4 for(i=0;i< sizeof(*arr)/sizeof(int);i++)
5 {
6 (*arr)[i]=i;
7 }
8}
9int main(void)
10{
11 int i=0;
12 int a[10];
13 Init(&a);
14 for(i=0;i<10;i++)
15 {
16 printf("%d\n",a[i]);
17 }
18 return 0;
19}
现在,Init() 函数中的 arr 参数是一个指向arr[10]类型的指针 。需要特别注意的是,这里绝对不能够使用void Init(int(*arr)[])来声明函数,而是必须指明要传入的数组的大小,否则sizeof(*arr)无法计算 。但是在这种情况下,再通过 sizeof 来计算数组大小已经没有意义了,因为此时数组大小已经指定为 10 了 。
最后
特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!
还没关注的小伙伴,可以长按关注一下:
文章插图
推荐阅读
- 毛豆怎么吃,毛豆新吃法好吃到爆?
- 我想贷款10万哪里好贷 一分利息10万一年多少钱怎么算
- 在手机上怎么申请办医保卡 第一次办医保卡在哪里办
- 白皮甜瓜的种植与管理 白皮甜瓜怎么挑选
- 客一和客二的收费标准 客一客二客三怎么区分
- 迅雷下载加速教程 迅雷下载怎么加速
- 中兴双屏手机详细配置 中兴双屏手机怎么样
- 中兴axon天机体验 中兴axon天机怎么样
- 辣椒炒驴肉怎么炒好吃,熟驴肉怎么吃好吃家庭做法?
- 怎么算八字合不合?