問題:
分支函數(shù)如何return:回多個(gè)值
答:1.直接調(diào)用下一個(gè)函數(shù),2.全局變量,3.文件,4.鏈表和容器,5.存入共享內(nèi)存。
函數(shù)
基本概念:把代碼中功能相似并且獨(dú)立的代碼單獨(dú)封裝成一個(gè)獨(dú)立的整體;
避免重復(fù)寫代碼,函數(shù)封裝
優(yōu)點(diǎn):
提高簡潔性,提高開發(fā)效率
提高代碼的重用性
有利于程序的維護(hù)
1。分類
分類一:
系統(tǒng)函數(shù):
由C標(biāo)準(zhǔn)庫(系統(tǒng))提供的函數(shù);如printf,scanf,
用系統(tǒng)函數(shù)時(shí),只需將對(duì)應(yīng)的頭文件包含進(jìn)來,
編譯要加上-lmath
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
int main ()
{
int = i;
//平方根函數(shù)
int sum = sqrt(i);//若報(bào)錯(cuò)加 -lm
//冪函數(shù)
int a= pow(2,16);
printf("2^16=%d\n",a);
char ch='q';
//小寫轉(zhuǎn)大寫
a=toupper(ch);
//大寫轉(zhuǎn)小寫
char ch1=T;
a=chtolower(ch1);
//隨機(jī)產(chǎn)生10個(gè)0-100之間的隨機(jī)數(shù)
srand(time(0));//srand(time(NULL));
int i=0;
int sum = 0;
for(i=0;i<10;i++)
{
sum = rand()%100;
printf(%4d,sum);
}
return 0;
}
自定義函數(shù):
用戶根據(jù)自己需要定義的函數(shù)
分類二:
有返回值的函數(shù):
函數(shù)調(diào)用結(jié)束后,會(huì)返回一個(gè)數(shù)值給主調(diào)函數(shù);
echo $?//查看上一個(gè)函數(shù)的返回值
無返回值的函數(shù):
函數(shù)結(jié)束后,無返回值;一般定義為void類型,(return ;)
分類三:
有參函數(shù):
函數(shù)名后( )有參數(shù),實(shí)參傳給形參;參數(shù)數(shù)目任意;
int text(int a)
無參函數(shù):
2。函數(shù)的基本定義:
無參函數(shù)的定義:
DataType FunctionName()//括號(hào)不可省
{
//函數(shù)體
//可執(zhí)行語句
return ;
}
有參函數(shù)的定義:
DataType FunctionName(Type arg1,Type arg2)
//參數(shù)列表可以有多個(gè),參數(shù)的類型可以任意
{
//函數(shù)體
return
}
注意:
3。函數(shù)的聲明,函數(shù)的調(diào)用,函數(shù)的定義
函數(shù)的定義:
DataType FunctionName(參數(shù)列表)
{
//函數(shù)體
//可執(zhí)行語句
}
函數(shù)的聲明:
DataType FunctionName(參數(shù)列表);
注:聲明時(shí)參數(shù)列表一定要和定義時(shí)的參數(shù)列表一致?。?!
放在函數(shù)被調(diào)用之前的任意位置(如果該函數(shù)體的定義位于調(diào)用函數(shù)上面就不用寫聲明,否則就一定要寫聲明)
函數(shù)的調(diào)用:
FunctionName(value);//注意有分號(hào)
value:數(shù)值
注:函數(shù)調(diào)用實(shí)參的值類型,一定要和函數(shù)定義的形式參數(shù)一致!!
實(shí)參:
實(shí)際參數(shù),即具體的數(shù)值
形參:
形式參數(shù),形參的定義和普通變量的定義毫無區(qū)別;
形參在發(fā)生調(diào)用時(shí)分配空間;
在發(fā)生函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)默認(rèn)將實(shí)參值賦給形參,
實(shí)參的個(gè)數(shù)和類型要和形參一致,實(shí)參用在函數(shù)調(diào)用處
兩個(gè)函數(shù)之間不允許相互調(diào)用
函數(shù)之間沒有優(yōu)先級(jí)問題,函數(shù)之間是等價(jià),平行關(guān)系
void swap_addr(int *pa,int *pb)
{
//傳址
int temp=*pa;
*pa=*pb;
*pb=temp;
return ;
}
int main()
{
int a=0;
int b=0;
printf("input\n");
scanf("%d,%d",&a,&b);
printf("1=%d,%d\n",a,b);
swap_addr(&a,&b);
printf("3=%d,%d\n",a,b);
return ;
}
3.函數(shù)的返回值
無返回值的類型函數(shù)類型:void
這個(gè)類型決定了函數(shù)的返回值的類型,若是 int 則返回值為 int 型,
接受函數(shù) text() 的返回值;要用相同類型的變量接受 int ret = text();
若返回值在后面的代碼中無用時(shí),則無需接受返回值
若不是 void 類型的函數(shù),則必須要有 return
有返回值的函數(shù)類型
return 的作用:
函數(shù)遇到 return ,則結(jié)束,后面的語句不執(zhí)行
關(guān)鍵字:
變量分局部變量和全局變量
局部變量:在函數(shù)中定義的變量,在函數(shù)結(jié)束時(shí)局部變量會(huì)自動(dòng)釋放內(nèi)存,因此不同的函數(shù)中可以使用相同的變量名,
全局變量:在函數(shù)體之外定義的變量,其作用域從定義處開始到本文件結(jié)束,在未定義前不可使用,
變量分靜態(tài)和動(dòng)態(tài)
靜態(tài)變量和動(dòng)態(tài)全局變量:無顯式初始化時(shí)默認(rèn)初始化值為0,
動(dòng)態(tài)局部變量:無顯式初始化時(shí)默認(rèn)初始化值為隨機(jī)值,
靜態(tài)局部變量:
作用域?yàn)楫?dāng)前函數(shù),從定義位置,到其所在的{}的結(jié)束位置。靜態(tài)局部變量不會(huì)被再次初始化,而是沿用上次函數(shù)退出時(shí)的值。
靜態(tài)全局變量:
生命周期為從程序運(yùn)行到程序退出,即貫穿整個(gè)運(yùn)行時(shí)間,當(dāng)下次函數(shù)調(diào)用時(shí),不會(huì)被再次初始化。且只限本文件使用。
若全局變量與局部變量重名,則自動(dòng)屏蔽全局變量,
auto : 聲明變量是動(dòng)態(tài)局部變量,可以省略,如 auto int a = 5;
static : 聲明變量是靜態(tài)變量,分全局和局部兩種,修飾局部變量,全局變量和函數(shù)
extern:聲明為外部變量:extern int sum;
修飾函數(shù):extern int text();
聲明變量或函數(shù)在外部已經(jīng)定義;
register:
寄存器變量:直接存放在寄存器中;
CPU寄存器數(shù)目有限,不可定義多個(gè)寄存器變量
const:只讀變量
常量,不可更改其值
const int num = 5;//int const num = 5;//變量值不可更改
const int p;//int const p;//指針變量的值不可改
int const p;//指針地址不可更改
const int const p;//值和址都不可更改
extern int sum//編譯時(shí)和有sum的外部文件一起編譯
//調(diào)用外部變量sum
//另一個(gè)文件要聲明本文件的調(diào)用函數(shù)( extern int text() )
//不可以重新賦值和定義
int text()
{
sum +=8;
printf("sum=%d\n",sum);
return ;
}
6.。函數(shù)的傳參
傳值
傳址
7.。指針函數(shù)和函數(shù)指針
指針函數(shù):
int text();返回的是一個(gè)地址
函數(shù)指針:
int (pa)():指向函數(shù)的地址,返回的是函數(shù)的值
//傳參
void swap(int a,int b)
{
//傳值
int temp=a;
a=b;
b=temp;
printf("0=%d,%d\n",a,b);
return ;
}
void swap_addr(int *pa,int *pb)
{
//傳址
int temp=*pa;
*pa=*pb;
*pb=temp;
return ;
}
int main()
{
int a=0;
int b=0;
printf("input\n");
scanf("%d,%d",&a,&b);
printf("1=%d,%d\n",a,b);
swap(a,b);
printf("2=%d,%d\n",a,b);
swap_addr(&a,&b);
printf("3=%d,%d\n",a,b);
return ;
}