C初級(jí)學(xué)習(xí)——12.19

問題:
分支函數(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 ;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容