函數(shù)是C語(yǔ)言的功能單位,實(shí)現(xiàn)一個(gè)功能可以封裝一個(gè)函數(shù)來(lái)實(shí)現(xiàn),定義函數(shù)的時(shí)候一切以功能為目的,根據(jù)功能去定函數(shù)的參數(shù)和返回值。
封裝的目的是為了方便函數(shù)的復(fù)用,只需要在使用某個(gè)功能的時(shí)候調(diào)用該函數(shù)即可;也是為了程序的模塊化,方便閱讀,方便調(diào)試。
4.2函數(shù)的分類(lèi) 4.2.1從定義角度分類(lèi)(即函數(shù)是誰(shuí)實(shí)現(xiàn)的)(1)庫(kù)函數(shù):C庫(kù)實(shí)現(xiàn)的;
(2)自定義函數(shù):程序員自己實(shí)現(xiàn)的函數(shù);
(3)系統(tǒng)調(diào)用:操作系統(tǒng)實(shí)現(xiàn)的函數(shù)。
4.2.2從參數(shù)角度分類(lèi)(1)有參函數(shù)
函數(shù)有形參,參數(shù)的數(shù)量、類(lèi)型等完全取決于函數(shù)的功能,依需要實(shí)現(xiàn)的功能來(lái)確定。
int max(int x,int y)
{
}
int fun(int x,float y,double z)
{
}
(2)無(wú)參函數(shù)
函數(shù)沒(méi)有參數(shù),在形參出可寫(xiě)void,也可以不寫(xiě)
int fun()
{
}
int fun(void)
{
}
4.3.3從返回值角度分類(lèi)(1)帶返回值的函數(shù)
在定義函數(shù)的時(shí)候必須帶著返回值類(lèi)型,函數(shù)體中必須有return,如果沒(méi)有返回值類(lèi)型,默認(rèn)返回整形。
char fun()//定義了一個(gè)返回字符數(shù)據(jù)的函數(shù)
{
char b = 'a';
return b;
}
fun()//沒(méi)有定義返回值的類(lèi)型,默認(rèn)返回整形。
{
return 1;
}
(2)沒(méi)有返回值的函數(shù)
定義函數(shù)時(shí)函數(shù)名前面加上void
void fun(形參表)
{
return;
}
沒(méi)有返回值,不需要return。若需要使用return結(jié)束函數(shù)的調(diào)用,可用return;即可
#includeint max(int x, int y)//函數(shù)max的返回值是int類(lèi)型,有兩個(gè)形參x,y,函數(shù)的作用是求兩個(gè)數(shù)的大值
{
int z;
if (x >y)
{
z = x;
}
else
{
z = y;
}
return z;
}
void help(void)//前面一個(gè)void表示沒(méi)有返回值,后面一個(gè)void表示沒(méi)有形參
{
printf("****************\n");
printf("幫助信息********\n");
printf("****************\n");
}
int main()
{
int num;
num = max(5, 10); //調(diào)用max函數(shù),求5 和 10兩個(gè)數(shù)的大值
help(); //調(diào)用help函數(shù),help是無(wú)參函數(shù),不需要傳參
printf("%d", num);
return 0;
}
運(yùn)行的結(jié)果是:
****************
幫助信息********
****************
10
4.3函數(shù)的定義返回值類(lèi)型 函數(shù)名字(形參列表)
{//函數(shù)體,實(shí)現(xiàn)函數(shù)的功能
}
函數(shù)名字應(yīng)見(jiàn)名知意,簡(jiǎn)潔易懂,符號(hào)C語(yǔ)言命名規(guī)則,不能重名。
形參必須定義類(lèi)型,多個(gè)形參用逗號(hào),分隔。
函數(shù)的定義不能嵌套,不能在一個(gè)函數(shù)體內(nèi)定義另一個(gè)函數(shù),即每個(gè)函數(shù)都是平行的。
void fun1()
{
void fun2()
{
}
}
報(bào)錯(cuò):C2601 本地函數(shù)定義是非法的。
void fun1()
{
}
void fun2()
{
}
這樣的定義是正確的。
4.4函數(shù)的聲明1、概念:對(duì)已經(jīng)定義的函數(shù)進(jìn)行說(shuō)明,可以聲明多次
2、為什么要聲明:編譯器在編譯C程序時(shí)是從上往下編譯的,在編譯到調(diào)用的函數(shù)時(shí)編譯器可能不認(rèn)識(shí)這個(gè)函數(shù),所以需要對(duì)函數(shù)進(jìn)行聲明。
3、什么時(shí)候要聲明
(1)主調(diào)函數(shù)和被調(diào)函數(shù)在同一個(gè).c文件中時(shí)
a.被調(diào)函數(shù)再上,主調(diào)函數(shù)在下(不需要聲明)
void fun(void)
{
printf("hello world\n");
}
int main()
{
fun();
}
編譯器先處理了被調(diào)用的函數(shù),已經(jīng)認(rèn)識(shí)了這個(gè)函數(shù),之后再調(diào)用這個(gè)函數(shù)時(shí)就不用聲明了。
b.被調(diào)函數(shù)在下,主調(diào)函數(shù)在上(需要聲明)
int main()
{
fun();
}
void fun(void)
{
printf("hello world\n");
}
編譯器還沒(méi)有認(rèn)識(shí)fun函數(shù)時(shí)就去調(diào)用了,所以這時(shí)需要聲明。
聲明的方法
(1)直接聲明法:
將被調(diào)用的函數(shù)的第一行拷貝過(guò)去,結(jié)尾加分號(hào)。
void fun(void);
void fun(void)
{
printf("hello world\n");
}
(2)間接聲明法:
將函數(shù)的聲明放在頭文件中,.c文件包含頭文件即可,
a.c
#include#include"4_3.h"
int main()
{
fun();
}
void fun(void)
{
printf("hello world\n");
}
a.h
extern void fun(void);
(2)主調(diào)函數(shù)和被調(diào)函數(shù)不在同一個(gè).c文件中的時(shí)候
一定要聲明,聲明的方法:
a.直接聲明法:將被調(diào)函數(shù)的第一行拷貝過(guò)去,后面加分號(hào),前面加extern
b.間接聲明法:將函數(shù)的聲明放在頭文件中,.c文件包含頭文件即可,
直接聲明法
間接聲明法:
3、分文件:主函數(shù)放在一個(gè).c,被調(diào)函數(shù)放在另一個(gè).c,函數(shù)的聲明放在頭文件中,在主調(diào)函數(shù)前用#include "xx.h"間接聲明。
4.5函數(shù)的調(diào)用函數(shù)的調(diào)用方法:
帶返回值的函數(shù):變量 = 函數(shù)名(實(shí)參列表);
無(wú)返回值的函數(shù):函數(shù)名(實(shí)參列表);
1、有無(wú)返回值
有返回值的函數(shù)需要一個(gè)變量去接收返回值,而沒(méi)有返回值的函數(shù)不需要接收,
2、有無(wú)形參
有形參的函數(shù),就把實(shí)參寫(xiě)在實(shí)參列表,實(shí)參可以是常量、變量,也可以是一個(gè)表達(dá)式,沒(méi)有形參就不寫(xiě)。
形參是變量,是被調(diào)函數(shù)的局部變量。
4.6變量的存儲(chǔ)類(lèi)別 4.6.1 內(nèi)存的分區(qū)1、內(nèi)存:物理內(nèi)存、虛擬內(nèi)存
物理內(nèi)存:實(shí)在存在的存儲(chǔ)設(shè)備,內(nèi)存條、硬盤(pán)等等
虛擬內(nèi)存:操作系統(tǒng)虛擬出來(lái)的內(nèi)存。
操作系統(tǒng)會(huì)在物理內(nèi)存和虛擬內(nèi)存之間做映射,32位系統(tǒng)下,每個(gè)進(jìn)程的尋址范圍是4G,地址是0x00 00 00 00~ 0x ff ff ff ff
數(shù)據(jù)存放在物理內(nèi)存,我們看到的是虛擬地址。
2、運(yùn)行程序時(shí)操作系統(tǒng)會(huì)將虛擬內(nèi)存4G進(jìn)行分區(qū),方便對(duì)內(nèi)存進(jìn)行管理
(1)堆區(qū):在動(dòng)態(tài)申請(qǐng)內(nèi)存的時(shí)候,在堆里開(kāi)辟內(nèi)存
(2)棧區(qū):主要存放局部變量
(3)靜態(tài)全局區(qū):
a.未初始化的靜態(tài)全局區(qū):靜態(tài)變量(定義時(shí)用static修飾的變量),或全局變量,沒(méi)有初始化的放在此區(qū);
b.初始化的靜態(tài)全局區(qū):全局變量、靜態(tài)變量、賦過(guò)初值的放在此區(qū)。
(4)代碼區(qū):存放程序代碼
(5)文字常量區(qū):存放常量
4.6.2普通的全局變量概念:在函數(shù)外部定義的變量
int num = 100;//num沒(méi)有在函數(shù)體內(nèi)部定義,而是在函數(shù)外面定義的,那么num就是一個(gè)全局變量
int main()
{
}
普通全局變量的作用范圍:程序的所有地方,在所在的.c文件可以不聲明,而在別的.c文件調(diào)用時(shí)需要聲明:extern int num;(聲明的時(shí)候不要賦值)
生命周期:在程序運(yùn)行的時(shí)候一直存在,直到程序結(jié)束
注意:定義普通全局變量的時(shí)候如果不賦初值,默認(rèn)初值為0。
#includeint num;
int main()
{
printf("num = %d", num);
return 0;
}
運(yùn)行的結(jié)果:num = 0
4.6.3 靜態(tài)全局變量 static概念:定義全局變量時(shí)前面用static修飾
static int num = 100;//num就是一個(gè)靜態(tài)全局變量
int mian()
{
}
靜態(tài)全局變量的作用范圍:只能作用在其所在的.c文件中,在其他的.c文件中不能使用。
生命周期:在程序運(yùn)行的時(shí)候一直存在,直到程序結(jié)束
注意:定義靜態(tài)全局變量的時(shí)候如果不賦初值,默認(rèn)初值為0。
4.6.4 普通局部變量概念:在函數(shù)內(nèi)部定義的,或者復(fù)合語(yǔ)句中定義的變量
int main()
{
int num;//普通局部變量,在函數(shù)內(nèi)部定義的
{
int a;//普通局部變量,在復(fù)合語(yǔ)句中定義的
}
}
普通局部變量的作用范圍:在函數(shù)內(nèi)部定義的只在函數(shù)內(nèi)部有效,而在復(fù)合語(yǔ)句中定義的只在復(fù)合語(yǔ)句中有效
生命周期:在函數(shù)調(diào)用之前,局部變量不占用空間,只在調(diào)用函數(shù)的時(shí)候才會(huì)為局部變量開(kāi)辟空間,函數(shù)結(jié)束了局部變量就被釋放了,在復(fù)合語(yǔ)句中也是如此
注意:普通局部變量不賦初值,默認(rèn)的初值是隨機(jī)的。
#includevoid fun()
{
int num = 3;//只在fun內(nèi)部有效的局部變量
num++;
printf("num = %d\n", num);
}
void fun2(int x)//這里定義的x形參也是只在fun2內(nèi)部有效的局部變量
{
x++;
printf("x = %d\n",x);
}
int main()
{
fun();
fun();
fun();
fun2(3);
fun2(3);
return 0;
}
運(yùn)行的結(jié)果:
num = 4
num = 4
num = 4
x = 4
x = 4
在第一次調(diào)用fun時(shí),為局部變量num開(kāi)辟空間,在函數(shù)結(jié)束后局部變量就被釋放了,所以在第二次調(diào)用fun時(shí),num依然是原來(lái)的num。
fun2()同理。
4.6.5 靜態(tài)局部變量概念:在定義局部變量時(shí)前面加static修飾
作用范圍:在它定義的函數(shù)或復(fù)合語(yǔ)句中有效
生命周期:靜態(tài)局部變量從第一次調(diào)用函數(shù)到程序結(jié)束,而不是像普通局部變量一樣函數(shù)結(jié)束就釋放掉。
注意:普通局部變量不賦初值,默認(rèn)的初值是0。
#includevoid fun()
{
static int num = 3;//只在fun內(nèi)部有效的靜態(tài)局部變量
num++;
printf("num = %d\n", num);
}
int main()
{
fun();
fun();
fun();
return 0;
}
運(yùn)行的結(jié)果是:
num = 4
num = 5
num = 6
變量重名的問(wèn)題在完全相同的作用范圍內(nèi),不允許重名;作用范圍不同的可以重名;局部范圍內(nèi),重名的全局變量不起作用。(就近原則)
不能定義兩個(gè)同名的全局變量,在一個(gè)函數(shù)內(nèi)部也不能定義兩個(gè)同名的局部變量。
全局變量num,局部變量num:在函數(shù)內(nèi)部只認(rèn)局部變量定義的num, 不認(rèn)全局變量的num。
#includeint num = 100;
int main()
{
int num = 10;
printf("num = %d\n", num);
return 0;
}
運(yùn)行的結(jié)果是:num = 10
說(shuō)明這里打印的num是main函數(shù)內(nèi)部定義的局部變量,而不是外部定義的全局變量
4.6.6外部函數(shù)我們定義的普通函數(shù)都是外部函數(shù),即函數(shù)可以再程序中的任何文件中調(diào)用。
聲明用extern + 返回值 + 函數(shù)名 + (形參表);
4.6.7內(nèi)部函數(shù)在定義函數(shù)時(shí),static + 返回值 + 函數(shù)名 + (形參表);即用static修飾的函數(shù)成為內(nèi)部函數(shù)。
static限定了內(nèi)部函數(shù)的作用范圍,只在所在的.c內(nèi)部有效,不能在其他的.c文件中調(diào)用。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前文章:C語(yǔ)言學(xué)習(xí)(4)第四章函數(shù)-創(chuàng)新互聯(lián)
文章起源:http://www.rwnh.cn/article20/doecco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、定制網(wǎng)站、Google、品牌網(wǎng)站設(shè)計(jì)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容