任何一個C語言程序都是由一個或者多個程序段(小程序)構成的,每個程序段都有自己的功能,我們一般稱這些程序段為“函數”。所以,你可以說C語言程序是由函數構成的。
比如你用C語言編寫了一個MP3播放器程序,那么它的程序結構如下圖所示:
將一個常用的功能封裝起來,方便以后調用
函數名:函數叫什么名字
函數體:函數是干啥的,里面包含了什么代碼
固定格式(很多語言的函數都是這么寫的)
返回值類型 函數名(形式參數列表)
{
函數體
}
舉例
定義一個函數,計算兩個整數的和
sum(int a, int b)
{
int c = a + b;
}
sum(10, 11); 引出返回值
說明函數的調用過程
簡述return的作用
1. 形參和實參的基本概念
2. 形參個數和實參一致:sum(10, 11, 12)
3. 參數的傳遞是值傳遞
4. 參數名不能跟函數內的局部變量同名
5. 函數可以沒有參數:設計一個函數返回PI
1. 返回值的基本概念、return的作用
2. void
3. return
void可以省略return
可以多次使用return
return后面不能有其他語句
4. 函數的弱語法
如果沒有寫返回值類型,默認是int
如果寫了返回值,可以不返回
調用一個沒有定義過的函數
1. 明確函數作用,起一個有意義的函數名稱
2. 明確函數的參數和返回值
3. 舉例:
求兩個整數的和
打印一條橫線
打印N條橫線
不能嵌套定義函數
死循環調用,自己調用自己
不能重復定義、可以重復聲明
返回值:0,正常退出;1,異常退出
#include
返回值:字符串的長度
1. 函數的定義順序
2. 函數的聲明作用:聲明和定義,類似于身份證和人的關系,編譯買機票、鏈接登機
3. 只有函數聲明、沒有定義,編譯警告、鏈接報錯
1. 單文件的壞處
一個文件的內容太多,不利于閱讀、調試
多人修改同一個文件出問題
公司里面是團隊合作
2. 將sum函數抽取到另一個.c文件中
先直接調用sum函數,編譯警告、鏈接main.c錯誤
#include “sum.c” , 編譯鏈接main.c,運行成功(畫圖分析.o文件中的東西)
如果avr.c中使用sum.c,編譯鏈接main.c,運行程序(畫圖分析出錯原因)
3. 在其他文件中聲明sum函數
int sum(int,int);
編譯鏈接main.c
編譯鏈接sum.c
編譯鏈接main.c sum.c,運行成功
avr.c利用一樣的方法
4. 將int sum(int,int)抽取到另外一個文件中
不抽取聲明的壞處:增加新的函數了
抽取到.c文件中?開發工具會將所有的.c進行編譯鏈接
抽取到.h文件中
5. 抽取步驟總結
.c文件寫函數的定義
.h文件寫函數的聲明
要想用我的函數,請包含我的.h文件
好處分析
1.
1 #include <stdio.h> 2 3 /* 4 1.什么情況下定義函數:添加一個常用的新功能 5 6 2.函數的定義格式 7 返回值類型 函數名(形式參數列表) 8 { 9 函數體10 }11 12 3.定義函數需要明確的東西13 1> 起一個有意義的函數名14 2> 15 */16 17 int printLine()18 {19 printf("-------------/n");20 return 0;21 }22 23 int average(int num1, int num2)24 {25 return (num1 + num2)/2;26 }27 28 int main()29 {30 /*31 printLine();32 33 printLine();34 35 printLine();36 */37 38 int a = 10;39 int b = 9;40 41 int c = average(a, b);42 43 printf("c is %d/n", c);44 45 int a1 = 11;46 int b1 = 20;47 48 int d = average(a1, b1);49 printf("d is %d/n", d);50 51 return 0;52 }
2.
1 #include <stdio.h> 2 /* 3 參數注意點 4 1.形式參數:定義函數時函數名后面中的參數,簡稱形參 5 2.實際參數:調用函數式傳入的具體數據,簡稱實參 6 3.實參個數必須等于形參個數 7 4.函數體內部不能定義和形參一樣的變量 8 5.如果是基本數據類型作為函數形參,純粹是值傳遞,修改函數內部形參的值,并不會影響外面實參的值 9 6.一個函數可以沒有形參,也可以有無限多個形參10 */11 12 // 形式參數,簡稱形參13 int sum(int num1, int num2)14 {15 // 函數體內部不能定義和形參一樣的變量16 // int num1;17 18 num1 = 50;19 20 return num1 + num2;21 }22 23 /*24 return的作用:25 1> 退出函數26 2> 返回一個具體值給函數調用者27 28 返回值注意點29 1> void代表沒有返回值30 2> 如果沒有明確說明返回值類型,默認是返回int類型31 3> 就算明確聲明了返回值類型,也可以不返回任何值32 33 默認情況下,C語言不允許兩個函數的名稱一樣34 */35 36 char test()37 {38 return 'A';39 }40 41 /*42 void test(int a, int b)43 {44 45 }*/46 47 void test5()48 {49 50 }51 52 /* 偽代碼53 void login(QQ, 密碼)54 {55 // 1.驗證QQ有沒有值56 if (QQ沒有值) return;57 58 // 2.驗證密碼有沒有值59 if (密碼沒有值) return;60 61 // 3.把QQ、密碼發送到服務器62 63 }*/64 65 int test3()66 {67 printf("999999999/n");68 }69 70 // 如果不明確聲明返回值類型,默認就是int類型71 test2()72 {73 printf("888888888/n");74 return 10;75 }76 77 int main()78 {79 int c = test2();80 printf("c=%d/n", c);81 82 test3();83 //test();84 85 /*86 int a = 100;87 int b = 27;88 89 // a、b稱為函數的實際參數,簡稱實參90 int c = sum(a, b);91 92 93 printf("a=%d, b=%d, c=%d/n", a, b, c);*/94 95 return 0;96 }
3.函數練習
1 /* 2 求兩個整數的差 3 打印一條橫線 4 打印N條橫線 5 6 定義函數的步驟 7 1> 根據函數的作用,起一個有意義的名稱 8 2> 確定函數的形參個數 9 3> 確定函數的返回值10 */11 #include <stdio.h>12 13 void printLines(int n)14 {15 for (int i = 0; i<n; i++)16 {17 printf("-------------------/n");18 }19 }20 21 void printLine()22 {23 printf("-------------------/n");24 }25 26 int minus(int a, int b)27 {28 return a - b;29 }30 31 int main()32 {33 printLines(10);34 //printLine();35 //printf("%d/n", minus(100, 29));36 37 return 0;38 }
4.函數注意點
1 #include <stdio.h> 2 /* 3 1.默認情況下,不允許有函數的名稱一樣 4 2.函數不能嵌套定義 5 3.函數不能重復定義,但是可以重復聲明 6 4.如果有函數的聲明,沒有函數的定義 7 1> 編譯可以通過,因為編譯器只會檢測語法合不合理,并不會檢測函數有沒有定義 8 2> 鏈接報錯,因為鏈接的時候會檢測函數是否定義 9 10 */11 12 // 函數的聲明13 //void printLine();14 //void printLine();15 //void printLine();16 //void printLine();17 //void printLine();18 //void printLine();19 20 int main()21 {22 void printLine();23 24 printLine();25 return 0;26 }27 28 // 函數的定義29 30 void printLine()31 {32 printf("--------/n");33 }
新聞熱點
疑難解答