首页/新闻资讯/正文详情

C语言数组作为函数参数:从入门到实战

发布时间:2026/9/26 5:12:28 来源:云帆数科 栏目:资讯中心
C语言数组作为函数参数:从入门到实战
1. 引言今天学习了 C 语言中「数组作为函数参数」这一重要知识点。数组作为函数参数是 C 语言编程中非常基础且高频使用的技巧无论是处理一组数据、实现排序算法还是进行矩阵运算都离不开它。本文将系统梳理数组作为函数参数的几种方式、底层原理以及常见注意事项帮助你把今天学到的内容巩固扎实。2. 为什么需要把数组传给函数在 C 语言中函数是模块化编程的基本单位。当我们需要对一组数据进行统一处理时比如求平均值、排序、查找如果每次都在主函数里写一遍逻辑代码会变得冗长且难以维护。把数组作为参数传给函数就能把数据处理逻辑封装起来实现代码复用。例如求一个数组所有元素的和如果不用函数每次都要写循环而封装成函数后只需调用一次即可。3. 数组作为函数参数的两种基本写法3.1 数组名作为参数传数组首地址这是最常用的方式。函数形参写成数组形式实参直接传数组名。#includestdio.h// 形参写成数组形式intsumArray(intarr[],intn){intsum0;for(inti0;in;i){sumarr[i];}returnsum;}intmain(){intscores[]{85,92,78,90,88};inttotalsumArray(scores,5);printf(总分 %d\n,total);return0;}3.2 数组名作为参数的另一种写法数组名作为参数时除了写成数组形式也可以写成带长度的形式两者在编译器看来是等价的intsumArray(intarr[],intn){intsum0;for(inti0;in;i){sumarr[i];}returnsum;}这两种写法在编译器看来是等价的int arr[]会被自动转换为int *arr。rr。4. 数组作为函数参数的底层原理理解底层原理是掌握这一知识点的关键。4.1 传递的是地址不是整个数组当数组名作为实参传递时C 语言不会复制整个数组而是把数组的首地址即第一个元素的地址传给函数。这意味着函数内部对数组元素的修改会直接影响主函数中的原数组传递效率高无论数组多大都只传一个地址。4.2 为什么必须同时传数组长度由于函数只拿到首地址它并不知道数组到底有多长。因此必须额外传递一个表示数组长度的参数否则函数无法确定遍历的边界容易越界访问。// 错误示范没有传长度函数无法知道数组大小voidprintArray(intarr[]){// 无法确定循环次数}5. 函数内修改数组会改变原数组这是数组参数与普通变量参数最大的区别。普通变量按值传递函数内修改不影响实参而数组按地址传递函数内修改会直接改掉原数组。#includestdio.hvoiddoubleArray(intarr[],intn){for(inti0;in;i){arr[i]*2;// 直接修改原数组}}intmain(){intdata[]{1,2,3,4};doubleArray(data,4);// 此时 data 已变为 {2, 4, 6, 8}for(inti0;i4;i){printf(%d ,data[i]);}return0;}6. 二维数组作为函数参数二维数组作为参数时形参必须指定第二维的大小列数第一维可以省略。#includestdio.h// 必须写列数行数可省略voidprintMatrix(intmat[][3],introws){for(inti0;irows;i){for(intj0;j3;j){printf(%d ,mat[i][j]);}printf(\n);}}intmain(){intmatrix[2][3]{{1,2,3},{4,5,6}};printMatrix(matrix,2);return0;}为什么必须指定列数因为编译器需要根据列数来计算mat[i][j]的实际内存地址偏移。7. 常见错误与注意事项7.1 忘记传数组长度这是初学者最容易犯的错误。数组参数不会自带长度信息务必显式传递。7.2 在函数内用sizeof求数组大小在函数内部对形参使用sizeof(arr)得到的是数组首元素的大小通常是 4 字节而不是整个数组的大小。这是很多人的误区voidbadFunc(intarr[]){intlensizeof(arr)/sizeof(arr[0]);// 错误得到的是指针大小}7.3 越界访问由于函数只拿到地址如果传入的长度参数大于实际数组长度就会发生越界访问导致未定义行为。7.4 用const保护只读数组如果函数只需要读取数组而不修改建议在形参前加const防止误修改intsumArray(constintarr[],intn){// 只能读不能写}8. 综合实战数组排序把今天学的知识综合运用一下写一个用数组参数实现冒泡排序的完整程序#includestdio.h// 冒泡排序直接修改原数组voidbubbleSort(intarr[],intn){for(inti0;in-1;i){for(intj0;jn-1-i;j){if(arr[j]arr[j1]){inttemparr[j];arr[j]arr[j1];arr[j1]temp;}}}}voidprintArray(constintarr[],intn){for(inti0;in;i){printf(%d ,arr[i]);}printf(\n);}intmain(){intnums[]{64,34,25,12,22,11,90};intnsizeof(nums)/sizeof(nums[0]);printf(排序前);printArray(nums,n);bubbleSort(nums,n);printf(排序后);printArray(nums,n);return0;}9. 总结今天学习的「数组作为函数参数」可以总结为几个核心要点数组名作为参数传递的是首地址函数内修改会改变原数组必须同时传递数组长度否则函数无法确定边界int arr[]与int *arr在形参中完全等价二维数组作参数必须指定列数函数内用sizeof求数组大小是错误的只读数组建议加const保护。掌握了这些你就已经理解了 C 语言中数组与函数结合的核心机制。接下来可以继续学习指针数组、函数指针等进阶内容进一步加深对 C 语言内存模型的理解。

相关推荐

2026年重庆渝中区轻奢酒店年度汇总,酣然酒店商务休闲两相宜
2026年重庆渝中区轻奢酒店年度汇总,酣然酒店商务休闲两相宜

重庆渝中区轻奢酒店行业基础科普重庆作为国内热门文旅城市,渝中区解放碑、洪崖洞片区是绝大多数来渝游客与商务出行人员的第一选择,轻奢酒店是介于传统精品酒店与高端豪华酒店之间的住宿品类,核心特点是在保证基础居住舒适度的前提下&#xf… · 2026/9/26 5:12:28

MySQL 进阶讲解(三):事务、索引优化、存储引擎与高阶特性
MySQL 进阶讲解(三):事务、索引优化、存储引擎与高阶特性

1. 引言 在掌握了 MySQL 的基础增删改查之后,进阶之路才刚刚开始。事务保证数据的一致性,索引决定查询的速度,存储引擎影响数据的存储方式与可靠性,而高阶特性则让 MySQL 在复杂业务场景中游刃有余。本文作为 MySQL 进阶系列的第三… · 2026/9/26 5:12:28

DrawIO 跨平台绘图实战:从安装到 VS Code 集成与数字电路图绘制
DrawIO 跨平台绘图实战:从安装到 VS Code 集成与数字电路图绘制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 5:12:22

百考通AI实战:毕业设计从选题到答辩的全流程智能辅助方案
百考通AI实战:毕业设计从选题到答辩的全流程智能辅助方案

每年三四月,我朋友圈的画风就会突然统一起来——全是论文截图,配文不是“刚刚改完第7版”,就是“今晚要把绪论肝完”。这种痛我太熟了,带过几届毕业生,见过太多人被文献综述、数据分析、导师意见来回拉扯,最… · 2026/9/26 12:08:47

JS集合去重与排序全解析:从Set到sort的实战避坑指南
JS集合去重与排序全解析:从Set到sort的实战避坑指南

前几天代码评审,同事交上来一行堪称"标准答案"的代码: [...new Set(data)].sort() 。去重调用Set,排序交给sort,看起来一气呵成。结果测试一跑就翻车,数字列表直接乱套:10排在9前面&#xff0c… · 2026/9/26 12:08:41

codebase-memory-mcp 配 TaoToken:持久化知识图谱 MCP 服务器 settings.json 骨架与毫秒级索引验证
codebase-memory-mcp 配 TaoToken:持久化知识图谱 MCP 服务器 settings.json 骨架与毫秒级索引验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:08:41

智谱 GLM-5.3 深度解读:同一个底座,后训练如何把编程能力拉爆 50%?
智谱 GLM-5.3 深度解读:同一个底座,后训练如何把编程能力拉爆 50%?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:08:41

一张图搞懂 RAG 索引管道与查询管道:TaoToken 统一 Key 接入配置骨架
一张图搞懂 RAG 索引管道与查询管道:TaoToken 统一 Key 接入配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:08:34

Search完全指南:AI的“实时信息获取”能力——用TaoToken统一Key打通Tool Calling与MCP配置
Search完全指南:AI的“实时信息获取”能力——用TaoToken统一Key打通Tool Calling与MCP配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:08:34

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码