文章目錄
- C語言之函式進擊
- 一、函式是啥
- 二、庫函式
- 三、自定義函式
- 實參?形參?
- 傳值呼叫?傳址呼叫?
- 四、函式的嵌套呼叫和鏈式訪問
- 嵌套呼叫
- 鏈式訪問
- 五、函式的宣告和定義
- 函式宣告
- 函式定義
- 六、函式遞回
C語言之函式進擊
一、函式是啥
在計算機科學中,函式就是一個大型程式中的某部分代碼,由一個或多個陳述句塊組成,負責完成牟星特定任務,具備相對的獨立性,各個函式的存在使得代碼變得井井有條,可讀性較高,
二、庫函式
為了支持可移植性和提高程式的效率,一些程式員都可能用得到的基礎功能就會被C語言的基礎庫中一系列類似的庫函式所提供,方便進行軟體開發,倘若沒有庫函式,那每個程式員都要整一套自己的基礎功能函式,會加快禿頭速度👱👱?♀
想要了解庫函式,必要的軟體少不了,在這里博主向大家強烈推薦以下網站或者軟體
www.cplusplus.com
http://en.cppreference.com (如果想要將該英文網站改成中文的模式,將en改成zh即可)
以及MSDN(Microsoft Developer Network)
話不多說,咱來了解庫函式先,簡單總結,庫函式的型別大致分為這幾種
- IO函式(即輸入輸出函式) printf scanf getchar putchar
- 字串操作函式 strcmp strlen
- 字符操作函式 toupper
- 記憶體操作函式 memcpy memcmp memset
- 時間/日期函式 time
- 數學函式 sqrt pow
- 其他庫函式 …
注:庫函式的使用必須包含#include對應的頭檔案,畢竟用了別人的庫函式總得要打聲招呼先
舉個栗子??
strcpy (字串復制函式)

代碼舉例:
#include <stdio.h>
#include <string.h>//strcpy函式的頭檔案
int main()
{
char arr1[20] = { 0 };
char arr2[20] = "Fighting!";
strcpy(arr1,arr2);//將arr2里的內容復制到arr1當中
printf("arr1:%s\n",arr1);//列印arr1
printf("arr2:%s\n",arr2);//列印arr2
return 0;
}
代碼效果:

memset (記憶體初始化函式)

代碼舉例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "Fighting!";
printf("arr:%s\n",arr);//原來的arr列印
memset(arr,'*',5);//將arr前五個位元組替換為'*'
printf("arr:%s\n",arr);//后來的arr列印
return 0;
}
代碼效果:

三、自定義函式
但是庫函式無法解決所有問題,因為這要是啥都能干,程式員就要失業了
因此在這里更加重要的是自定義函式
自定義函式和庫函式一樣,有函式名,回傳值型別和函式引數, 但是不一樣的是這些都是我們自己來設 計,這給程式員一個很大的發揮空間,
函式語法:
ret_type fun_name(para1, * )
{
statement;//陳述句項,也就是函式的主體
}
ret_type 回傳型別
fun_name 函式名
para1 函式引數,可以是多個,用,隔開,在這里我用*代表其他引數
舉個栗子??
寫一個函式可以找出倆個整數中的最大值
int get_max(int x, int y)
//x和y是形式引數
{
return (x > y)?(x):(y);
//這里用到了條件運算子,x大于y嗎,如果是真的回傳x,假的回傳y
}
int main()
{
int a = 10;
int b = 20;
//函式的呼叫
int max = get_max(a,b);//a和b是實參
printf("max = %d\n", max);
return 0;
}
代碼效果:

實參?形參?
實際引數:真實傳給函式的引數叫做實參(就比如本題目中的a,b),其型別包括常量、變數、運算式、函式等,不管是哪種型別的,在進行函式呼叫時,它們必須有確定的值,一遍吧這些值傳送給形參
形式引數:函式名后括號中的變數就叫做形參(就比如本題目中的x,y),形參在函式被呼叫的程序中才會分配記憶體單元,當函式呼叫完成后就會自動銷毀了,所以形參只在函式中有效
寫一個函式可以交換倆整型變數的內容
傳值呼叫?傳址呼叫?
#include <stdio.h>
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
void Swap2(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);//傳值呼叫,實參傳給形參,其實形參是實參的一份臨時拷貝
printf("Swap1:num1 = %d num2 = %d\n", num1, num2);
Swap2(&num1, &num2);//傳址呼叫
printf("Swap2:num1 = %d num2 = %d\n", num1, num2);
return 0;
}
代碼效果:

從這個結果中,深刻了解到傳值呼叫和傳址呼叫區別還是非常大的
函式決議:

因此
Swap1函式進行傳值函式,只是將num1和num2的值傳入了,形參x和y接收了值,通過中間變數tmp交換了x和y的值,然而形參x和y在函式呼叫結束后就會被銷毀,所以num1和num2的值并沒有被改變,
Swap2函式進行傳址呼叫,將num1和num2的地址傳給了整形指標變數px和py,通過中間變數tmp交換了px和py里的數值,也就是交換了num1和num2的值,所以倆整形變數里的內容交換任務得以實作
四、函式的嵌套呼叫和鏈式訪問
函式與函式之間是可以有機結合的
嵌套呼叫
舉個栗子??
#include <stdio.h>
void new_line()
{
printf("加油\n");
//在new_line()函式中列印加油二字
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
//在three_line()函式中嵌套呼叫new_line()函式
}
}
int main()
{
three_line();
//在main()函式中嵌套呼叫three_line()函式
return 0;
}
代碼效果:

鏈式訪問
把函式的回傳值作為另一個函式的引數
舉個栗子??
代碼1:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = "Hello";
int ret = strlen(strcat(arr,"world"));
//strcat函式呼叫后,回傳arr里的內容"Helloworld"
//strlen函式呼叫后,回傳字串的字符個數10
printf("%d\n",ret);
return 0;
}
代碼效果:

說明:
strlen函式是計算字串長度的函式
size_t strlen( const char *string )
從字串string的某個位置(可以是字串的開頭,中間位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符’\0’為止,然后回傳計數器size_t的值(不包括’\0’)
其頭檔案是#include <string.h>
strcat函式是字串連接函式
char strcat(char *strDestination , const char*strSource)
把strSource所指向的字串(包括’\0’)復制到strDestination所指向的字串后面(洗掉*strDestination原來末尾的’\0’),要保證*strDestination足夠的長,以容納被復制進來的*strSource,回傳指向strDestination的指標的內容
其頭檔案是#include <string.h>
代碼2:
#include <stdio.h>
int main()
{
printf("%d",printf("%d",printf("%d",43)));
//瘋狂套娃之中
//先輸出43
//因為43的字符個數是2,所以再輸出2
//因為2的字符個數是1,所以再輸出1
return 0;
}
代碼效果:

說明:
printf函式是格式輸出函式
int printf(const char *format [, argument]…)
該函式回傳一個int型別的數值,代表輸出的字符總數
其頭檔案是#include <stdio.h>
五、函式的宣告和定義
函式宣告
- 告訴編譯器有一個函式叫什么,引數是什么,回傳型別是什么,其他具體是不是存在,無關緊要,
- 函式的宣告要滿足先宣告后使用,
- 函式的宣告一般要放在頭檔案中,
int Add(int x,int y);
函式定義
函式的定義是指函式的具體實作,交代函式的功能實作
#include "test.h"
//在頭檔案里宣告了Add函式,參考自己的頭檔案要用""而不是<>
int Add(int x,int y)
{
//Add函式的實作
return x + y;
}
六、函式遞回
什么是函式遞回!請聽下回講解…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280350.html
標籤:其他
下一篇:全景圖
