首頁 > 軟體

C語言深入講解函數的使用

2022-04-12 19:00:18

關於函數

函數是C語言的基本單元,函數中包含實現程式功能的程式碼。

C語言程式的入口位於main()函數之中,為了方便組織配合,偵錯和執行,一般是用main函數作為主調函數,通過呼叫其他的函數來實現程式的執行。

他們的關係圖如下:

1. 函數的定義形式

先給大家看看完整的函數程式碼格式,先有個大概印象

int add(int a,int b);
//這是函數宣告,告訴系統有這樣一個函數
//注:如果函數寫在main函數之前,那這句程式碼是可以省略的
int add(int a,int b)
{
	int c=a+b;
	return c;
}
  • 函數頭

格式:

返回型別 函數名 (引數1,引數2,…)

對於上面函數例子int add(int a,int b)來說,add前面的int是返回型別,add是函數名,int a 是第一個引數,int b 是第二個引數。

翻譯: 定義了一個名為add的函數,向函數傳入兩個整形資料後,函數會返回一個函數內部處理後的整形資料。

  • 函數體

函數名後帶括號裡的全部內容。函數體內部包括宣告變數和執行完成函數功能的程式碼。

解釋: 這裡宣告了整形變數c,用c接受了引數a和引數b相加後的值,然後add函數返回c的值。

2. 函數的宣告

函數的宣告的告訴編譯器有一個函數叫什麼,引數是什麼,返回型別是什麼。但是具體內容還是要看函數內部的功能程式碼。

形式:

返回型別 函數名 (引數) ;

注意要有";"來結束宣告。

3. 返回語句

在C語言學習中會經常看到這樣一句程式碼return 0;這也是main函數的最後一句程式碼,其作用有以下兩點:

  • 立即從當前函數中退出,返回到調運這個函數的程式中。
  • 將函數的返回值待會到呼叫這個函數的程式中。

來給大家看個例子:

//int Add5(int n);
//這裡的函數宣告在main函數之前,可以省略上面一行的程式碼
int Add5(int n)
{
	return n + 5;
	//看看return後面的語句能不能被執行
	printf("能執行的話吱一聲");
}

int main()
{
	int a = 1,b=0;
	 b = Add5(b);
	 printf("%d", b);
	 return 0;
}

return 後面的程式碼是不會執行的。

4. 函數引數

引數根據其傳送的方式分為形式引數和實際引數兩種。

4.1 形式引數(傳值呼叫)

形式引數的作用就算傳送數值,它把引數的數值傳入函數,但引數本身的值是不會被函數修改的,前面舉的例子都是用的形參(形式引數的簡稱)。

下面給大家看看例子:

void fuc(int n);
//void型別即返回型別為空,不會有返回值,但還是會執行內部的程式碼。
//這裡的宣告不能省!函數的定義在main函數下面。
int main()
{
	int a = 10;
	fuc(a);//將a的值傳給了n
	printf("%d", a);
	return 0;
}

void fuc(int n)//這裡是函數的定義
{
	n = 0;
}

結果列印a的值為10,沒有被fuc()修改成0。

4.2 實際引數(傳址呼叫)

實際引數是通過把引數的地址傳到函數內部,函數通過地址直接修改實際變數的值,因此,實際引數是可以通過函數修改的。

這裡看看傳遞實參的效果:

void fuc(int* n);
//改動1 n的型別是指標,它存的是實際變數的地址
int main()
{
	int a = 10;
	fuc(&a);
	//改動二 &為取地址符,直接獲取變數的地址,這裡是把a的地址傳送到函數內部
	printf("%d", a);
	return 0;
}

void fuc(int* n)//改動三 其實和改動一是一樣的
//這裡的變數是n,n的型別是int*,n現在是變數a的地址
{
	*n = 0;
}

對於*n = 0;

*為解除參照操作符,可以取出地址裡面儲存的值這裡是把n中儲存的地址對應的數賦值為0

執行結果如下,a的值被更改為0

4.3 無引數

很多時候函數是不需要引數的,沒有引數是不會影響函數執行的,一般列印選單的話是不用設定引數的,這裡隨便給大家展示一下:

void  Member_Menu();
void  Member_Menu()
{
	printf("*******************n");
	printf("使用者管理:>>n請輸入您想進行的操作:n1.會員新增n2.會員刪除n3.會員修改n");
}

執行時函數的功能就是列印選單。

5. 函數的呼叫

5.1 巢狀呼叫

函數內部是可以再呼叫其他函數的。如:

void fuc1()
{  
 printf("函數1");  
 }
 void fuc2()
 {
 printf("函數2");
 }
 void fuc3()
 {
	fuc1();
	fuc2();
 }
 int main()
{
	fuc3();
	return 0;
}

5.2 函數遞迴

遞迴簡單來說是自己呼叫自己,這種呼叫十分巧妙,它可以用少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。

遞推實現的重點:

  • 找到遞推公式
  • 設定結束標誌

現在給大家展示一下遞迴的使用:

斐波那契數列:F(0)=1,F(1)=1,F(n) = F(n-1) + F(n-2) (n>=2)

遞迴版本:

int fib(int n)
{
 if (n <= 2)         
 return 1;
    else
    return fib(n - 1) + fib(n - 2);
}

非遞迴版本:

int Fib()
{
	int n,m=1,k,j,i=0;
	scanf_s("%d", &n);
	if (n == 0 || 1 == n)
		i = 1;
	if (n > 1)
	{
		for (k = 1, i = 1; k < n; k++)
		{
			j = i;//儲存i即n-1
			i += m;//n=n-1  +n-2
			m = j;//m==f(n-2)變成n-1,也就是下一個的n-2
		}
	}
	printf("%d", i);
}

簡單對比一下給大家看看二者的區別,不過這裡的遞迴只是以最低要求(完成任務)來寫的,實際上這樣寫道話質量是很低的,這點下一次我們會詳細說明的。

總結:

今天給大家帶來的是簡單的函數介紹,讓大家簡單瞭解函數宣告,兩種引數變數以及函數的呼叫方法。

到此這篇關於C語言深入講解函數的使用的文章就介紹到這了,更多相關C語言 函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com