通過引用傳值:調(diào)用函數(shù)時(shí)傳入某個(gè)地址(也稱為引用)嘁酿,然后由函數(shù)將數(shù)據(jù)存入該地址指向的內(nèi)存留晚。
-
modf()
函數(shù):傳入一個(gè)double
類型的數(shù)據(jù),返回該浮點(diǎn)數(shù)的整數(shù)部分和小數(shù)部分乾蓬。調(diào)用該函數(shù)時(shí),需要傳入一個(gè)地址供modf()
保存整數(shù)部分的計(jì)算結(jié)果壁榕。準(zhǔn)確的說矛紫,modf()
會(huì)返回小數(shù)部分,然后將整數(shù)部分拷貝至傳入的地址护桦。
#include <stdio.h>
#include <math.h>
int main(int argc, const char * argv[]) {
double pi = 3.14;
double integerPart;
double fractionPart;
// 將 integerPart 的地址作為實(shí)參傳入
fractionPart = modf(pi, &integerPart);
// 獲取integerPart地址上的值
printf("integerPart = %.0f,factionPart = %.2f\n",integerPart,fractionPart);
return 0;
}
輸出結(jié)果
integerPart = 3,factionPart = 0.14
編寫通過引用傳遞參數(shù)的函數(shù)
寫一個(gè)函數(shù)含衔,將公制單位米轉(zhuǎn)化為非公制單位的英尺和英寸。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/**
將公制單位米轉(zhuǎn)換為非公制單位英寸和英尺
@param meters 輸入?yún)?shù):米
@param ftPtr 英尺的地址
@param inPtr 英寸的地址
*/
void metersToFeetAndInches(double meters,unsigned int *ftPtr,double *inPtr) {
//這個(gè)函數(shù)假定 meters 的值是非負(fù)數(shù)
//將meters變量的值轉(zhuǎn)化為feet的值二庵,類型為浮點(diǎn)數(shù)贪染。
double rawFeet = meters * 3.281;
//計(jì)算類型為無符號(hào)的整形feet變量的值
//floor():向下取整
unsigned int feet = (unsigned int)floor(rawFeet);
//將feet變量的值存儲(chǔ)在提供的地址里
if (ftPtr) { //ftPtr != NULL
printf("Storing %u to the address %p\n",feet,ftPtr);
*ftPtr = feet;
}
//計(jì)算英寸
double fractionalFoot = rawFeet - feet;
double inches = fractionalFoot * 12.0;
//將inches變量的值保存到傳入的地址
if (inPtr) {
printf("Stroing %.2f to the address %p\n",inches,inPtr);
*inPtr = inches;
}
}
int main(int argc, const char * argv[]) {
double meters = 3.0;
unsigned int feet;
double inches;
metersToFeetAndInches(meters, &feet, &inches);
printf("%.1f meters is equal to %d feet and %.1f inches.\n",meters,feet,inches);
/* 有時(shí)我們只需要獲取返回值的一部分時(shí),比如我只需要獲得英寸inch的數(shù)據(jù)催享,而不需要獲得英尺feet的數(shù)據(jù)杭隙;
通常的做法是將 NULL 作為地址傳入函數(shù),表示“無須傳回相應(yīng)的值”因妙。
所以痰憎,metersToFeetAndInches函數(shù)中會(huì)有 if 條件表達(dá)式判斷是否為空指針。
*/
metersToFeetAndInches(meters, NULL, &inches);
printf("%.1f meters is equal to %.1f inches.\n",meters,inches);
return 0;
}