当前位置: 首页 > news >正文

函数:计算数组的元素和

一、计算数组的元素和

参数传递给函数时,实际上只有数组的首地址作为指针传递给了函数。

在函数定义中的int a[ ]等价于int *a。在只有地址信息的情况下,是无法知道数组里有多少个元素的,因此在计算数组中的元素和时,要加一个参数——数组的元素个数。

#include<stdio.h>
//#include<string.h>
#include<math.h>
int sum(int* a, int n) {int ans = 0;for (int i = 0; i < n; i++)ans += a[i];return ans;
}/*在函数调用时,a不一定非要传递一个数组,例如:*/
int main() {int a[] = { 1,2,3,4 };printf("%d\n", sum(a + 1, 3));    //利用指针的加减法把要开始相加元素的地址传给函数return 0;
}

一般地,若p是指针,k是正整数,则p+k就是指针p后面第k个元素,p-k是p前面的第k个元素,而如果p1、p2 是同类型的指针,则p2-p1是从p2到p1的元素个数(不含p2)

 二、计算左闭右开区间内的元素和

写法一:

#include<stdio.h>
//#include<string.h>
#include<math.h>
int sum(int* begin, int* end) {int n = end - begin;int ans = 0;for (int i = 0; i < n; i++)ans += begin[i];return ans;
}
/*测试函数————计算左闭右开区间内的元素和:*/
int main() {int a[] = { 1,2,3,4 };printf("%d\n", sum(a + 1, a+3));    //利用指针的加减法把要开始相加元素的地址传给函数return 0;
}

 写法二:更具一般性,用一个新指针p作为循环变量,同时累加其指向的值

#include<stdio.h>
//#include<string.h>
#include<math.h>
int sum(int* begin, int* end) {int* p = begin;int ans = 0;for (int* p = begin; p != end; p++)ans += *p;return ans;
}
/*测试函数————计算左闭右开区间内的元素和:*/
int main() {int a[] = { 1,2,3,4 };printf("%d\n", sum(a + 1, a+3));    //利用指针的加减法把要开始相加元素的地址传给函数return 0;
}

数组在传参时的注意点

1. 数组传递的方式: 在C语言中,数组的传递通常使用指针来实现。当你传递一个数组作为函数参数时,实际上传递的是数组的首地址,也就是数组的第一个元素的地址。函数中可以通过指针来访问和修改数组中的元素。这种传递方式可以避免在内存中复制整个数组,提高了效率。

2. 数组大小的传递:在函数中传递数组时,通常需要额外传递数组的大小信息,以便函数知道数组的长度。这样可以避免在函数内部发生数组越界的错误。可以通过传递数组大小作为参数,或者在数组的末尾使用一个特定的值来表示数组的结束。

3. 数组的修改: 在函数中传递数组时,函数可以修改数组中的元素。这是因为数组传递的是数组的地址,函数可以通过指针来访问和修改数组中的元素。注意,在函数内部修改数组的元素会对原始数组产生影响。

4. 数组的长度限制: 在C语言中,数组的长度是固定的,一旦定义了数组的大小,就不能再改变。因此,在传递数组时需要确保函数中不会越界访问数组。如果需要处理可变长度的数据,可以考虑使用动态内存分配(如“malloc”和“free”)来创建和释放数组。

5. 数组的一维和多维传递:对于一维数组,可以直接将数组作为参数传递给函数。而对于多维数组,需要指定每个维度的大小,并使用适当的方式进行传递。可以使用指针或者使用数组指定每个维度的大小。

 参考书籍:《算法竞赛入门经典(第二版)》作者:刘汝佳

http://www.lryc.cn/news/359607.html

相关文章:

  • 如何进行数据库分库分表
  • Spring-Cloud-CircuitBreaker-Resilience4j (3.1.1)
  • 重构与优化-组织数据(3)
  • 游戏交易平台源码游戏帐号交易平台系统源码
  • Matlab里面的浮点数与FPGA定点数的相互转化应用(含Matlab代码,封装成函数可直接调用)
  • 机器学习笔记——欠拟合、过拟合
  • 【二进制部署k8s-1.29.4】七、验证master的安装
  • springboot获取当前数据库连接
  • 【学习笔记】Windows GDI绘图(九)Graphics详解(上)
  • 公告:公众号铁粉粉丝介绍以及说明
  • BioTech - 使用 CombFold 算法 实现 大型蛋白质复合物结构 的组装过程
  • 代码随想录算法训练营第36期DAY46
  • 港湾周评|李小加“刀刃向内”裁员
  • 超大功率光伏并网逆变器学习(三相)
  • 大豆、棉花深度学习数据集大合集
  • 教育数字展馆助力全球教育传播,科技引领数字化教育潮流
  • 14.微信小程序之地理定位功能
  • 理解lambda表达式
  • 【面试】Java的前端编译器和后端编译器
  • 教育小程序的性能优化:从前端到后端的综合提升策略
  • 单链表实现通讯录
  • Linux 命令操作技巧
  • 深度学习21天 —— 卷积神经网络(CNN):识别验证码( 第12天)
  • 利用 Docker 简化Redis部署:快速搭建Redis服务
  • Web前端框架:深入探索与实践
  • 【算法】贪心算法——柠檬水找零
  • Jmeter安装教程
  • 关于磁盘管理
  • 人大金仓数据库大小写不敏感确认
  • 【Java】还有人不懂继承?25 个 Case 包教包会