首页 理论教育 指针的应用及最小最大温度计算方法

指针的应用及最小最大温度计算方法

时间:2023-10-23 理论教育 版权反馈
【摘要】:例如,假设你有一个温度传感器,它每小时读取一次温度,并将该值记录在名为temps[]的数组中。代码清单8-2.Minimum and Maximum Temperature ProgramCalculateMinMax()函数有三个参数:温度数据的整数数组;两个int指针,用于存储传递给函数的最低和最高温度值。换句话说,在loop()函数中使用运算符(&)引用指针地址,通过按址传递与CalculateMinMax()函数中的两个参数初始化为int指针的效果完全相同。在图8-8中,你可以看到lowTemp的左值为2276,hiTemp为2278(为什么左值是2字节间隔呢?

指针的应用及最小最大温度计算方法

在第5章中,我们看到函数不能更改传递给它的参数的值,因为函数参数是按值传递的数据项。也就是说,参数的副本传递给函数,而不是参数本身。

但是,如果希望函数更改参数,该怎么办?当我们需要更改函数代码中的两个或多个值时,通常会出现这种情况:如果为true,则可以从函数返回一个值,但希望函数更改多个值。使用指针就可以解决这个问题。

例如,假设你有一个温度传感器,它每小时读取一次温度,并将该值记录在名为temps[]的数组中。在一天结束时,你需要读取24个值,并记录一天的最低和最高温度。下面的代码片段可以完成这项工作。具体实现源代码如代码清单8-2所示。

代码清单8-2.Minimum and Maximum Temperature Program

CalculateMinMax()函数有三个参数:

温度数据的整数数组;

两个int指针,用于存储传递给函数的最低和最高温度值。

现在请注意,从loop()函数中调用该函数:

retVal=CalculateMinMax(temps,&lowTemp,&hiTemp);

第一个参数是保存24个温度数据的temps[]数组。需要注意的是,当你“单独” 使用数组名(后面没有数组括号)时,你引用的是数组的左值。这是因为数组是引用类型而不是值类型。事实上,你可以写CalculateMinMax()的函数声明,如清单8-2所示:

int CalculateMinMax(int temps[],int*minTemp,int*maxTemp)

or(www.xing528.com)

int CalculateMinMax(int*temps,int*minTemp,int*maxTemp)

编译器对任一签名的解释是相同的。原因是对CalculateMinMax()的调用使用数组的名称,该名称的计算结果为数组的左值。

返回到loop()中CalculateMinax()的函数调用,注意下面两个参数,temps[]之后是int变量minTemp和maxTemp。因为你希望函数在执行后能更改这些值时,函数需要知道这些变量在内存中的位置。这意味着你必须将这两个变量的左值发送到CalculateMinMax()函数。通过左值而不是右值将变量的默认参数行为从传递值更改为传递地址,仔细想想,loop()中的调用:

retVal=CalculateMinMax(temps,&lowTemp,&hiTemp);

函数调用对接时各参数握手的效果如下:

int CalculateMinMax(int temps[],int*minTemp=&lowTemp,int*maxTemp=&hiTemp)

从上式中分离出最后两个参数看起来应该很熟悉:

int*minTemp=&lowTemp;

int*maxTemp=&hiTemp;

这两条语句是用于初始化指向lowTemp和hiTemp的两个指针的语法变量返回loop()函数。换句话说,在loop()函数中使用运算符(&)引用指针地址,通过按址传递与CalculateMinMax()函数中的两个参数初始化为int指针的效果完全相同。图8-8显示了清单8-2中代码的运行示例。

在图8-8中,你可以看到lowTemp的左值为2276,hiTemp为2278(为什么左值是2字节间隔呢?回答:因为int的左值使用2个字节的存储)。你还可以看到这两个变量很奇怪,因为它们反映了内存中存在的随机位模式程序开始执行时的地址。调用CalculateMinimax()后,你可以看到它们的左值仍然相同,但函数已将温度值指定给适当的变量。显然,这意味着你甚至可以使用指针间接方式将变量更改回loop()函数中,尽管这两个变量都超出了CalculateMinimax()的范围。

图8-8 程序输出结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈