1. 函數的定義: 返回值類型 函數名(形參列表) {函數體(函數的實現內容)}, 注意: 若是沒有參數, 小括號也是必不可少的.數組
函數與函數之間能夠嵌套調用(也就是在一個函數內部能夠調用另一個函數), 可是不能嵌套定義(不能在一個函數內部定義另一個函數)xcode
形參: 形式上的參數, 在函數定義時, 給定的參數叫作形參, 是一個一個的變量, 存儲的數據在調用以前完未知模塊化
實參: 函數調用時給定的參數叫作實參, 是一個惟一肯定的數據. 實參向形參傳遞的過程是一個拷貝的過程函數
函數至關於公司的部門, 每個部分完成特定的功能, 部門與部門之間的並列關係決定了函數與函數之間也是並列關係spa
函數的功能: 實現代碼的模塊化管理. 把複雜的邏輯進行拆分, 而主函數只起到宏觀調控的功能便可, main函數是應用程序執行的入口code
函數定義過程當中可能出現的錯誤:遞歸
a. Function definition is not a allowed here: 緣由: 函數內部又定義了一個新的函數, 嵌套定義作用域
solution:函數之間是並列關係, 把內部定義的函數定義在外部it
b. Control reaches end of non-void function: 緣由: 返回值不能爲空, 函數內部沒有經過return返回數據io
solution: 經過return返回對應數據
2. 函數定義形式:
a. 函數定義第一種形式: 無參數, 無返回值
void buyMike() {
printf("還沒給錢\n");
}
函數名的命名規範: 有多個英文帶刺組成, 除了第一個單詞的首字母小寫, 其他單詞首字母大寫
b. 函數定義的第二種形式: 有返回值, 無參數
float salary() {
printf("同志們今年乾的不錯, 明年好好幹, 不要跳槽\n");
return 1.0;//ruturn 將該函數的值返回給主調函數
//千萬不要把代碼放到return下面, 會執行不到
}
c. 函數定義的第三種形式: 無返回值, 有參數
void buyMike2(float money) {
if (money < 10) {
printf("錢不夠\n");
} else {
printf("OK, 買了牛奶\n");
}
}
d. 函數定義的第四種形式: 有返回值, 也有參數
//求兩個數的最大值
int maxValueOfTwo(int a, int b) {
return a > b ? a : b;
}
//求兩個數的最小值
int minValueOfTwo(int a, int b) {
return a < b ? a : b;
}
//求三個數的最大值
int maxOfThreeNumber(int a, int b, int c) {
//1.先求a與b的最大值max
//int max = 0;//存儲最大值
//max = maxValueOfTwo(a, b);
//2.再求max與c的最大值
return maxValueOfTwo(maxValueOfTwo(a, b), c);
}
3.函數調用(讓函數幹活)
a. 無返回值的函數: 函數名(傳遞的是實參表); 如buyMike2(3.2);
b. 有返回值的函數: 定義一個和返回值類型對應的變量, 用來接收函數調用返回的值. 如: int max = maxValue(2, 3);
4. 數組與函數的關係, 數組做爲函數的參數:
a. 當數組做爲函數參數時, 只傳遞函數名稱如int a[10] = {0}; outputArray(a, 10);//outputArray(int arr[], int n)是本身定義的一個函數
5. 函數的使用分爲三部分:(在xcode中)
a. 函數聲明, 相似於使用說明書, 寫在.h文件中
b. 函數定義(函數的實現),實現寫在.m文件中
c. 函數的調用(導入頭文件, 本質就是將.h文件中的內容所有拷貝到該文件中)
6. 變量的做用域: 變量可訪問的範圍
局部變量: 在函數內部定義的變量叫作局部變量, 只在函數內部可訪問, 函數執行時開闢空間, 函數執行結束空間自動回收
全局變量: 在函數外部定義的變量叫作全局變量, 在全局均可訪問, 空間不會回收(warning:全局變量很是危險, 使用需謹慎)
靜態變量: 凡是被static修飾的變量都叫靜態變量.
特色: 1. 若是不賦初值, 默認爲0
2. 只初始化一次(該變量只會定義一次)
3. 空間一旦開闢, 不會回收
7. 函數遞歸: 函數的遞歸是調用一個與本身功能徹底相同的函數(注意: 遞歸必定要有出口, 不然會形成死循環), 如:
//函數模擬吃蘋果
void eatApple(int n) {
//一旦發現蘋果個數爲0, 經過return結束當前函數執行
//遞歸必定要有出口, 不然會形成死循環
if (n == 0) {
return;//返回空
}
//若是不爲零
//1. 留一個蘋果
n--;
//2. 找下一我的來吃蘋果
eatApple(n);
//3. 吃本身手中的蘋果
printf("第%d我的吃蘋果:\n", 10 - n);
}
在main函數中直接進行函數調用便可: eatApple(10);
//倒序報數54321
void reverse(int n) {
if (n == 0) {
return;
}
//1. 留個數
int m = n % 10;
//2. 報數
printf("%d", m);
//3. 找下一我的報數
reverse(n / 10);
}
//正序
void positive(int n) {
if (n == 0) {
return;
}
//1. 留個數
int m = n % 10;
//2. 找下一我的報數
positive(n / 10);
//3. 報數
printf("%d", m);
}
//階乘
int fac(int n) {
if (n == 0 || n == 1) {//0和1的階乘都爲1
return 1;
}
return n * fac(n - 1);
}