【C语言】如何将数组作为函数的输入参数

您所在的位置:网站首页 数组函数输入 【C语言】如何将数组作为函数的输入参数

【C语言】如何将数组作为函数的输入参数

2024-07-14 23:37:13| 来源: 网络整理| 查看: 265

1.问题描述

对于给定的数组,求出该数组中各个元素之和。程序如下:

# include "stdio.h" void main() { double arr[] = {1,2,3,4,5}; // 给定数组 int length = sizeof(arr) / sizeof(arr[0]); // 数组长度 double sum = 0; // 用于记录数组元素之和 for(int i = 0; i < length; i++) sum += arr[i]; printf("sum = %.4lf\n", sum); // 显示数组元素之和 getchar(); }

上述程序中,给定数组arr,其中有5个元素,求出数组长度,然后定义变量sum(double类型),用于记录数组中元素的累加之和。依次对数组中各元素进行累加,将最后得到的sum输出如下:

可知,数组中元素之和为15,结果正确。

为了将数组元素求和的功能进行独立,新建函数GetSum,将相应功能集成到该函数中,然后在主程序中调用该函数。程序如下:

# include "stdio.h" double GetSum(double arr[]) { int length = sizeof(arr) / sizeof(arr[0]); double sum = 0; for(int i = 0; i < length; i++) sum += arr[i]; return sum; } void main() { double arr[] = {1,2,3,4,5}; double sum = GetSum(arr); printf("sum = %.4lf\n", sum); getchar(); }

运行结果如下:

发现结果为0,不符合预期。

2.问题原因

考虑可能是函数GetSum的声明和调用过程中出了问题,所以对函数GetSum中的步骤进行分析。

2.1在函数中求数组长度遇到的问题

首先是求数组的长度。为了探究该步骤的执行过程,新建函数PrintLength,用于显示数组长度,然后对给定的数组进行运算:

# include "stdio.h" void PrintLength(double arr[]) { printf("sizeof(arr) = %d\n", sizeof(arr)); // arr的大小 printf("sizeof(arr[0]) = %d\n", sizeof(arr[0])); // arr[0]的大小 printf("sizeof(arr) / sizeof(arr[0]) = %d\n", sizeof(arr) / sizeof(arr[0])); // 希望求得数组arr的长度 getchar(); } void main() { double arr[] = {1,2,3,4,5}; PrintLength(arr); }

运行上述程序,结果如下:

由上图可知,arr的所占空间为4字节,arr[0]所占空间为8字节,不符合给定的数组长度。

而两个整型变量相除(整数相除,结果会自动取整),将其结果赋值给一个双精度浮点数,于是结果显示为0。

2.2函数中数组参数的含义 2.2.1查阅资料发现的问题

查阅书籍《C Primer Plus》,在“数组和指针”章节找到一句话:“数组名是该数组首元素的地址”,所以考虑,在上述函数中,“arr”可能表示为数组arr首元素的地址,其类型为指针变量。

2.2.2对问题的探索和猜测

由于数组arr中的元素为double类型,查询double类型数据所占空间:

void main() { printf("sizeof(double) = %d\n", sizeof(double)); getchar(); }

输出结果如下:

可知,double类型数据所占空间为8字节。

查询指针类型数据所占空间:

void main() { double *ptr; printf("sizeof(ptr) = %d\n", sizeof(ptr)); getchar(); }

输出结果如下:

可知,指针类型数据所占空间为4字节,与上述“sizeof(arr)”计算结果相等。

所以,“arr”在函数中,很可能被视为一个指针变量,该变量占据的空间为4字节。

2.2.3对猜测的验证

为了验证上述结论,将“arr”视为一个指针变量,查询其指向的地址与该地址所保存的数值,对比数组arr中第一个元素的地址和数值,程序如下:

# include "stdio.h" void PrintArr(double arr[]) { printf("arr = %p\n", arr); // 指针变量arr所指向的地址 printf("*arr = %lf\n", *arr); // 指针变量arr指向地址中所保存的数值 printf("&arr[0] = %p\n", &arr[0]); // 数组元素arr[0]的地址 printf("arr[0] = %lf\n", arr[0]); // 数组元素arr[0]的数值 getchar(); } void main() { double arr[] = {1,2,3,4,5}; PrintArr(arr); }

输出结果如下:

可见,指针变量“arr”所指向的地址与数组arr中第一个元素的地址相同,指针变量“arr”指向地址中保存的数值与数组arr中第一个元素的数值相等。因此得出结论:当将数组名称作为函数的输入参数时,该数组名称在函数中被视为一个指针变量,指向该数组中第一个元素的地址。

3.解决方案

由于在函数中无法求出数组长度,所以对程序作出更改:在调用函数前,先行求出数组长度,然后将数组长度作为函数的一个参数进行输入。更改后的程序如下:

# include "stdio.h" double GetSum(double arr[], int length) // 在函数声明中,将数组长度作为输入参数 { double sum = 0; for(int i = 0; i < length; i++) sum += arr[i]; return sum; } void main() { double arr[] = {1,2,3,4,5}; int length = sizeof(arr) / sizeof(arr[0]); // 在调用函数前,先求出数组长度 double sum = GetSum(arr, length); // 调用函数时,将数组长度作为参数进行输入 printf("sum = %.4lf\n", sum); getchar(); }

运行该程序,输出结果如下:

结果正确。 



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭