一个函数的形参是普通的局部变量。当发生函数调用时,程序创建这些形参,然后用对应的实参来初始化这些形参。形参的作用域就是函数块。函数内可以改变形参的值,而不会影响调用上下文中实参的值。

如果需要将一个数组当作实参传入函数,则应把对应的形参声明成下面的形式:

类型 名称[ ]

因为,当把数组名作为函数实参时,它会自动被转换为指针。所以上面的声明等同于下面的声明:

类型 *名称

当使用数组来声明函数参数时,方括号 [] 内的任何常量表达式都会被忽略。在函数块内,数组参数名是一个指针变量,并且数组的值可以在该函数内被修改。例 1 中的函数 addArray()将两个数组中对应索引元素的值相加。

【例1】函数 addArray()// addArray() 将第二个数组中每个元素的值加到第一个数组对应元素上 //(例如,“array1 += array2”) // 参数:两个float类型的数组,以及它们共同的长度 // 返回值:无 void addArray( register float a1[ ], register const float a2[ ], int len ) { register float *end = a1 + len; for ( ; a1 < end; ++a1, ++a2 ) *a1 += *a2; }

对于函数中的数组参数使用另一种表示法,上述函数 addArray()可等效为以下形式:void addArray( register float *a1, register const float *a2, int len ) { /* 函数块内容与前述一样 */ }

使用方括号 [] 声明函数数组参数的一个优点就是可读性好,它可以显著地标识出函数将该参数作为指向数组的指针,而不是一个独立的 float 变量。在参数声明时,数组风格的表示法还有两个特点:

(1) 在参数声明时(也只有在该情况下),C99 允许将类型限定符 const、volatile 和 restrict 放在方括号内。这个功能允许声明具有限定符指针类型的参数。

(2) 而且,在 C99 中,也可以将存储类修饰符 static 连带整数常量表达式一起放在方括号内。这种方法表示,在函数调用的时数组内元素数量至少等于该常量表达式。

下面一个示例展示了上述这些特点:int func( long array[const static 5] ) { /* ... */ }

在这里所定义的函数中,参数 array 是一个指向 long 类型的常量指针,所以不能被修改。它指向一个至少有 5 个元素的数组。

C99 同时允许将数组参数声明成可变长度的数组。方法是将一个非常量的、且为正数的整数表达式放在方括号之间。在这种情况下,数组参数仍然是指向第一个数组元素的指针。不同之处在于,数组元素本身也允许长度可变。

在例 2 中,函数 maximum()的第 3 个参数是一个二维数组,其长度可变。

【例2】函数 maximum()// 函数 maximum() 获得double类型二维数组中的最大值 // 参数:行数、列数、二维数组 // 返回值:最大元素的值 double maximum( int nrows, int ncols, double matrix[nrows][ncols] ) { double max = matrix[0][0]; for ( int r = 0; r < nrows; ++r ) for ( int c = 0; c < ncols; ++c ) if ( max < matrix[r][c] ) max = matrix[r][c]; return max; }

参数 matrix 是一个指针,它指向一个具有 ncols 个元素的数组。原文始发于:C语言将数组作为函数参数

c语言以数组作为函数参数,C语言将数组作为函数参数相关推荐

  1. 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)

    文章目录 一.指针与函数之间的关系 二.复制传参 三.地址传参 四.传一维数组(地址) 五.传二维数组(地址) 六.传指针数组(地址) 七.指针函数和函数指针 一.指针与函数之间的关系 1.我们可以给 ...

  2. java二维数组如何传参_C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include void func(int n, char str[ ][5] ) { i ...

  3. c语言字符串数组函数参数,C语言/C++ 数组作为函数参数

    前几天帮别人解决数组拼接问题(类似字符串拼接)时想到这个专题.因为她的代码太糟糕. 我们知道C.C++中的数组是没有拷贝(复制)运算的,除非编译器支持.因为C语言发明的初衷是替换汇编语言,要知道你用不 ...

  4. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

    1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针 ...

  5. c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版

    最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了.所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了<C缺陷和陷阱& ...

  6. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  7. 【☀️C语言函数传参の结构体数组篇☀️】

    背景介绍 C语言中函数参数传递的两种方式("引用传递做函数参数"是C++的特性,C语言不支持.) (1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个 ...

  8. c语言malloc引用类型作参数,C语言动态内存函数的理解和总结

    第一:内存的使用 内存可以分为以下三个主要的部分:栈区.堆区.静态区 栈区(stack):存放的是局部变量.函数的形参等都是在该区上存放的. 堆区(heap):动态内存函数开辟的空间.比如malloc ...

  9. C语言 函数不定长参数 - C语言零基础入门教程

    目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.自定义不定长参数的函数 1.va_start/va_arg/va_end 案例一 2.va_sta ...

最新文章

  1. 创建oracle发邮件job导致的故障
  2. android中ocr解决方案(tesseract)
  3. BZOJ-1951-古代猪文-SDOI2010-费马小定理+欧拉函数+lucas定理+中国剩余定理
  4. 计算机自带游戏在哪里打开,电脑自带游戏选项在哪里打开
  5. 640x360,H264 SPS头如何表示高度?
  6. 【解决windows】Windows Linux双系统安装历程,超详细
  7. 华为数通HCIE很好考吗?
  8. BIM学习笔记(一)
  9. 计算机网络性能常见计算公式
  10. 怎样在电脑中添加pdf打印机 添加pdf打印机的方法
  11. [阿毛]Ubuntu 16安装CH340串口驱动
  12. iOS 集成腾讯云聊天 最新sdk使用方法
  13. 数字IC设计工程师笔试面试经典100题
  14. 什么是 ARPU 为什么你应该关心 ARPU?
  15. 用matlab画黑底白条,计算机仿真F型结构电能表自动检测流水线_论文答辩PPT范例...
  16. 基于Android平台的手机安全助手的设计与实现
  17. 生物+化学 SY000 实验传闻记录 简述(暂记)
  18. Linux系统大约多大,谁来说说linux系统一般多大
  19. java毕业设计成品源码网站javaweb企业财务|记账|账单管理系统
  20. 杰理之提示音配置【篇】

热门文章

  1. JS解决迷宫老鼠算法
  2. Linux脚本保存管道中的变量,Linux下管道重定向使用以及Shell编程(操作系统)
  3. 基于元模型优化的虚拟电厂主从博弈优化调度模型基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理 代码主要做的是虚拟电厂的优化调度策略,其实是多虚拟电厂/微网的优化调度策略,模型为双层,首先下层
  4. java的showcase_【敏捷】7.showcase,开发中必须引起重视的小环节
  5. php 冒泡排序详解非常详细
  6. Python美化输出 pprint
  7. ps命令 – 显示进程状态
  8. 3.02 进程状态转换图
  9. eclipse的使用小技能
  10. java版本实现双人推箱子小游戏