用函式實現模組化程式設計四

EricsT發表於2024-11-13

陣列作為函式引數

呼叫有參函式時,需要提供實參,實參可以是常量、變數或表示式

陣列元素的作用與變數相當,一般來說,凡是變數可以出現的地方,都可以用陣列元素代替,因此,陣列元素也可以用作函式實參,其用法與變數相同,向形參船體陣列元素的值。此外,陣列名也可以作實參和形參,傳遞的是陣列第一個元素的地址

陣列元素作函式實參

陣列元素可以用作函式實參,不能用作形參。因為形參是在函式被呼叫時臨時分配儲存單元的,不可能為一個陣列元素單獨分配儲存單元(陣列是一個整體,在記憶體中佔連續的一段儲存單元)

在用陣列元素作函式實參時,把實參的值傳給形參,是“值傳遞”方式。資料傳遞的方向是從實參傳到形參,單向傳遞

例:輸入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;
}

執行結果:

用函式實現模組化程式設計四

相關文章