- Arduino 教程
- Arduino - 首页
- Arduino - 概述
- Arduino - 开发板说明
- Arduino - 安装
- Arduino - 程序结构
- Arduino - 数据类型
- Arduino - 变量与常量
- Arduino - 运算符
- Arduino - 控制语句
- Arduino - 循环
- Arduino - 函数
- Arduino - 字符串
- Arduino - 字符串对象
- Arduino - 时间
- Arduino - 数组
- Arduino 函数库
- Arduino - I/O 函数
- Arduino - 高级 I/O 函数
- Arduino - 字符函数
- Arduino - 数学库
- Arduino - 三角函数
- Arduino 高级
- Arduino - Due & Zero
- Arduino - 脉冲宽度调制
- Arduino - 随机数
- Arduino - 中断
- Arduino - 通信
- Arduino - 集成电路
- Arduino - 串行外围接口
- Arduino 项目
- Arduino - 闪烁 LED
- Arduino - 渐变 LED
- Arduino - 读取模拟电压
- Arduino - LED 条形图
- Arduino - 键盘注销
- Arduino - 键盘消息
- Arduino - 鼠标按钮控制
- Arduino - 键盘串口
- Arduino 传感器
- Arduino - 湿度传感器
- Arduino - 温度传感器
- Arduino - 水位检测器/传感器
- Arduino - PIR 传感器
- Arduino - 超声波传感器
- Arduino - 连接开关
- 电机控制
- Arduino - 直流电机
- Arduino - 伺服电机
- Arduino - 步进电机
- Arduino 和声音
- Arduino - 音调库
- Arduino - 无线通信
- Arduino - 网络通信
- Arduino 有用资源
- Arduino - 快速指南
- Arduino - 有用资源
- Arduino - 讨论
Arduino - 向函数传递数组
要将数组参数传递给函数,请指定数组名称,无需任何括号。例如,如果已将数组hourlyTemperatures声明为函数,则调用会将数组hourlyTemperatures及其大小传递给函数modifyArray。
重点
以下列出了一些在将数组传递给函数时需要了解的重要事项:
将数组传递给函数时,通常也会传递数组大小,以便函数可以处理数组中的特定数量的元素。否则,我们需要将此知识构建到被调用函数本身中,或者更糟糕的是,将数组大小放在全局变量中。
C++ 通过引用传递数组给函数,即被调用函数可以修改调用者原始数组中的元素值。
数组名称的值是计算机内存中数组第一个元素的地址。由于传递了数组的起始地址,因此被调用函数精确地知道数组存储在内存中的位置。因此,当被调用函数在其函数体中修改数组元素时,它正在修改其原始内存位置中的数组的实际元素。
尽管整个数组是通过引用传递的,但单个数组元素是按值传递的,就像简单的变量一样。
要将数组的元素传递给函数,请在函数调用中使用数组元素的下标名称作为参数。
为了使函数通过函数调用接收数组,函数的参数列表必须指定函数期望接收数组。
例如,函数modifyArray的函数头可以写成:
void modifyArray( int b[], int arraySize )
该语句表示modifyArray期望在参数b中接收一个整数数组的地址,并在参数arraySize中接收数组元素的数量。数组大小在数组括号中不是必需的。如果包含它,编译器会忽略它;因此,可以将任何大小的数组传递给函数。
C++ 通过引用将数组传递给函数。当被调用函数使用数组名称b时,它指的是调用者中的实际数组(即本节开头讨论的数组hourlyTemperatures)。
请注意modifyArray函数原型的奇怪外观。
void modifyArray( int [] , int ) ;
出于文档目的,此原型可以按以下方式编写。
void modifyArray( int anyArrayName[], int anyVariableName ) ;
但是,C++ 编译器会忽略原型中的变量名。请记住,原型告诉编译器参数的数量以及每个参数的类型以及参数的预期出现顺序。
下一个示例中的程序演示了传递整个数组和传递数组元素之间的区别。
示例
void modifyArray( int [], int ); // appears strange; array and size void modifyElement( int ); // receive array element value void setup () { Serial.begin (9600); const int arraySize = 5; // size of array a int a[ arraySize ] = { 0, 1, 2, 3, 4 }; // initialize array a Serial.print ( "Effects of passing entire array by reference:" ) ; // output original array elements for ( int i = 0; i < arraySize ; ++i ) Serial.print ( a[ i ] ) ; Serial.print ("\r" ) ; Serial.print ("The values of the modified array are:\n" ); // output modified array elements for ( int j = 0; j < arraySize; ++j ) Serial.print ( a[j ] ) ; Serial.print ("\r" ) ; Serial.print ("\r\rEffects of passing array element by value:" ); Serial.print ( "\ra[3] before modifyElement: " ); Serial.print ( a[ 3 ] ); Serial.print ( "\ra[3] after modifyElement: " ); Serial.print ( a[ 3 ] ); } void loop () { } // in function modifyArray, "b" points to the original array "a" in memory void modifyArray( int b[], int sizeOfArray ) { // multiply each array element by 2 for ( int k = 0 ; k < sizeOfArray ; ++k ) b[ k ] *= 2; } // end function modifyArray // in function modifyElement, "e" is a local copy of // array element a[ 3 ] passed from main void modifyElement( int e ) { // multiply parameter by 2 Serial.print ( "Value of element in modifyElement: " ); Serial.print ( ( e *= 2 ) ); } // end function modifyElement
结果
Effects of passing entire array by reference:01234 The values of the modified array are:01234 Effects of passing array element by value: a[3] before modifyElement: 3 a[3] after modifyElement: 3 $ is not a hexadecimal digit f is a hexadecimal digit