一、函數
1.函數的基本概念
函數是把代碼中功能相似并且獨立的代碼單獨封裝成一個獨立的整體;
-
函數優點
提高代碼的簡潔性,提高開發效率 提高代碼的重用性 有利于程序的維護
-
函數的分類
分類一:
系統函數:
由C系統提供的函數;如:printf(),scanf(),gets(),puts()
調用系統函數時,只需將其對應的頭文件包含進來,即可
example:
#include<stdio.h> -----> printf("hello!");pow(a,b);------->計算a的b次方 自定義函數: 用戶根據需要自己定義的函數; 分類二: 有返回值函數: 函數調用結束后,會返回一個數值給主調函數; 無返回值函數: 函數結束后,無返回值,一般定義為void類型,即空類型 分類三: 有參函數: 參數可以任意多個 無參函數:
2.函數的基本定義:
無參函數的定義
DataType FunctionName()
{
//函數體
//可執行語句
}
注:函數名后的括號不可以省略!!!!!!有參函數的定義
DataType FunctionName(參數列表)
{
//函數體
}
注: 參數列表可以有多個,參數的類型可以任意(相對)!-
函數的定義,函數的聲明以及函數的調用
函數的定義:
DataType FunctionName(參數列表)
{
//函數體
}
函數的聲明:
DataType FunctionName(參數列表);
注:
聲明時,參數列表一定要和定義時的參數列表一致!!!!!!!
后面的分號不可省略!!!
放在函數被調用之前的任意位置!!!!!!函數的調用:
FunctionName(value);
value:數值
注:
函數調用時,實參值的類型,一定要和函數定義是的形參列表一致!!!
函數調用可以在任何位置;實參:
實際參數,即具體的數值.
函數調用時的參數都是實參
形參:
形式參數,形參的定義和普通變量的定義無區別!
函數定義以及聲明時的參數列表都是形參注:
函數名表示函數的入口地址.
函數之間沒有優先級問題,函數之間是等價的.即平行關系!!!
形參在發生調用時分配空間!!!
在發生函數調用時,系統會默認將實參值賦給形參!!!
3.函數的返回值
無返回值的類型函數類型為:void
DataType FuncName(參數列表)
{
//函數體
}
DataType:決定了函數的返回值類型,
若是int,則函數返回值為int型,
若為double,則返回值為double類型
如果函數的返回值能夠在后面的程序中使用,則需要相同類型的
變量接收返回值
若是void類型的函數,則無返回值,return可有可無!!!!!
若函數不是void類型,則必須要有return!!!!
4.return的作用:
* 函數遇到return,則函數結束,后面的代碼不在執行
* 用于返回函數的值即執行結果
5.關鍵字
變量分為全局變量和局部變量
全局變量:
在函數體之外定義的變量,
其作用域是從變量定義處開始,一直到本文件結束!!!!!
在全局變量定義之前不可使用全局變量!
局部變量:
在函數中定義的變量,其作用域是整個函數!
函數結束時,局部變量會自動消亡!因此,不同的函數中
可以使用相同的變量名.
若全局變量和局部變量重名,則全局變量對局部變量不可見!!!
即屏蔽全局變量.
auto:
聲明變量是動態變量,可以省略!
動態全局變量
作用域:
從定義處開始,到文件末
生命周期:
整個程序運行期間
動態局部變量
生命周期:僅限于定義該變量的函數中
如:
auto int a = 5;
int b = 4;
static:
聲明變量為靜態變量;
作用域:
從定義處開始,到文件結束
聲明周期:
整個程序運行期間.
靜態變量若定義時沒有初始化,則系統默認初始化為:0!
靜態變量只初始化一次!!!!!
靜態全局變量
靜態局部變量
靜態函數:static修飾函數,則此函數只能用于本文件,
其他文件中不可使用!!!!
extern:
聲明為外部變量:extern int sum;
修飾函數:extern int test();
聲明變量或函數在外部已經定義;
register:
寄存器變量:變量直接存放在寄存器中,
CPU的寄存器個數有限,不可以定義多個寄存器變量
速度快
const:
常量,不可更改其值
const int num = 5;
int const num = 5;
const int *p;
int const *p; //值不可更改
int* const p; //址不可更改
const int* const p; //值和址都不可更改
6.函數的傳參
值傳遞
地址傳遞
7.指針函數和函數指針
指針函數:
int test();
返回一個局部地址是不允許的,沒有意義.
函數指針:
int (pa)();