陣列作為函式引數
呼叫有參函式時,需要提供實參,實參可以是常量、變數或表示式
陣列元素的作用與變數相當,一般來說,凡是變數可以出現的地方,都可以用陣列元素代替,因此,陣列元素也可以用作函式實參,其用法與變數相同,向形參船體陣列元素的值。此外,陣列名也可以作實參和形參,傳遞的是陣列第一個元素的地址
陣列元素作函式實參
陣列元素可以用作函式實參,不能用作形參。因為形參是在函式被呼叫時臨時分配儲存單元的,不可能為一個陣列元素單獨分配儲存單元(陣列是一個整體,在記憶體中佔連續的一段儲存單元)
在用陣列元素作函式實參時,把實參的值傳給形參,是“值傳遞”方式。資料傳遞的方向是從實參傳到形參,單向傳遞
例:輸入10個數,要求輸出其中值最大的元素和該數是第幾個數
#include <stdio.h>
#include <string.h>
int maxNum(int m, int n)//取最大值
{
return m > n ? m : n;
}
int main(void)
{
int arr[10];//定義
memset(arr, 0, sizeof(arr));//初始化
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)//輸入
scanf("%d", &arr[i]);
int iMax = arr[0];
int iIndex = 1;
for (int i = 1; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (iMax >= maxNum(iMax, arr[i]))
continue;
iMax = arr[i];
iIndex = i + 1;
}
printf("\n%d\n%d\n", iMax, iIndex);//輸出
return 0;
}
在VS編譯器內會報C4996錯誤,解決見下文:(下同)
C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. - EricsT - 部落格園 (cnblogs.com)
執行結果:
陣列名作為函式引數
除了可以用陣列元素作為函式引數外,還可以用陣列名作為函式引數(包括實參和形參)
用陣列元素作為實參時,向形參變數傳遞的是陣列元素的值,而用陣列名作函式實參時,向形參(陣列名或指標變數)傳遞的是陣列首元素的地址
例:有一個一維陣列 score 內放 10 個學生成績,求平均成績
#include <stdio.h>
#include <string.h>
float ave(float score[], size_t iSize)
{
float fRet = 0;
for (int i = 0; i < iSize; i++)//求和
fRet += score[i];
return fRet / iSize;//平均值
}
int main(void)
{
float score[10];//定義
memset(score, 0, sizeof(score));//初始化
for (int i = 0; i < sizeof(score) / sizeof(score[0]); i++)//賦值
scanf("%f", &score[i]);
printf("\n%f\n", ave(score, sizeof(score) / sizeof(score[0])));//平均值
return 0;
}
執行結果:
用陣列名作函式引數,應該是在主調函式和被調函式分別定義陣列
實引數組與形引數組型別應該一致
C語言編譯系統並不檢查形引數組的大小,只是將實引數組的首元素的地址傳給形引數組名。因此形引數組首元素和實引數組首元素是有同一地址,它們共佔同一儲存單元
形引數組可以不指定大小,在定義陣列時在陣列名後面跟一個空的方括號
用陣列名作為函式實參時,不是把陣列元素的值傳遞給形參,而是把實引數組的首元素地址傳遞給形引數組,這樣子兩個陣列就共佔同一段記憶體單元,所以形引數組元素的值改變,則實引數組元素對應的值也會改變
多維陣列名作函式引數
多維陣列元素可以作函式引數
可以用多維陣列名作為函式的實參和形參,在被呼叫函式中對形引數組定義時可以指定每一維的大小,也可以省略第一維的大小
例:有一個3*4的矩陣,求所有元素中的最大值
#include <stdio.h>
int maxNum(int num[][4], size_t iSize)
{
int iMax = num[0][0];
for (int i = 0; i < iSize; i++)
for (int j = 0; j < 4; j++)
iMax = iMax > num[i][j] ? iMax : num[i][j];
return iMax;
}
int main(void)
{
int num[3][4] =
{
{ 1, 3, 5, 7 },
{ 2, 4, 6, 8 },
{ 15, 17, 34, 12 }
};
printf("\n%d\n", maxNum(num, 3));
return 0;
}
執行結果: