1 函數 1.1函數的介紹 1.1.1 函數的概述 函數是c語言的功能單位。實現一個功能可以封裝一個函數來實現。 定義函數的時候一切以功能為目的,根據功能去定函數的參數和返回值需要傳哪些數據給函數?(實參)、函數的功能代碼(函數體)如何實現?函數需要返回什麼類型的數據?考慮(傳入參數、函數體、返回值 ...
1 函數
1.1函數的介紹
1.1.1 函數的概述
函數是c語言的功能單位。實現一個功能可以封裝一個函數來實現。
定義函數的時候一切以功能為目的,根據功能去定函數的參數和返回值需要傳哪些數據給函數?(實參)、函數的功能代碼(函數體)如何實現?函數需要返回什麼類型的數據?考慮(傳入參數、函數體、返回值類型)
1.1.2 函數的分類 (定義角度)
庫函數((c++語言庫)、自定義函數、系統調用(內核提供給用戶的函數介面)
1.1.3 函數的分類 (有無參數)
無參的函數:不能將函數外部的數據傳遞給函數內部
有參的函數:通過參數將函數外部的數據傳遞到函數內部
(參數:函數外部數據到函數內部的橋梁)
1.2 函數的定義、聲明、調用
1.2.1 函數的定義![](https://img2023.cnblogs.com/blog/3111841/202303/3111841-20230309104150584-936932926.png)
實現函數體,確定函數名,函數的形參、函數的返回值類型
1.2.2 函數聲明
函數聲明:告知編譯器 該函數的函數名是啥 有幾個形參 返回值類型是啥
1.2.3 函數的調用
執行函數體,一般調用格式:函數名(實參);
1.4 函數的傳參
1.4.1 普通變數作為函數的參數
函數內部 需要使用外部變數的值 需要將外部變數的值傳遞給函數內部。這時普通變數就要作為函數的形參(單向傳遞之值傳遞)
1.4.2 數組作為函數的參數
1 數值數組作為函數的參數 函數內部可以(讀寫)外部數據的元素。
using namespace std;
void inputIntArray(int arr[],int n); void sortIntArray(int arr[],int n); void printIntArray( int arr[],int n); void main() { int arr[5] = {0}; int n = sizeof(arr)/sizeof(arr[0]); //獲取鍵盤輸入 inputIntArray(arr,n); //對數組排序 sortIntArray(arr,n); //對數組遍歷 printIntArray(arr,n); } void printIntArray(int arr[], int n) { int i=0; for(i=0;i<n;i++) { cout<<arr[i]<<" "; } cout<<endl; } void inputIntArray(int arr[], int n) { cout<<"請輸入"<<n<<"個int型數據:"; int i = 0; for(i=0;i<n;i++) { cin>>arr[i]; } return; } void sortIntArray(int arr[],int n) { int i =0; for(i=0;i<n-1;i++) { int j=0; for(j=0;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } }
2 字元數組作為函數的參數
int myStrlen(char str[]); void myGetString(char str[],int n); void main() { char str[128] = "0"; //鍵盤獲取字元串 myGetString(str,sizeof(str)); //獲取字元串的長度 cout<<"長度:"<<myStrlen(str)<<endl; } int myStrlen(char str[]) { int i=0; while(str[i] !='\0') i++; return i; } void myGetString(char str[],int n) { cout<<"請輸入一個字元串:"; cin.getline(str,n); }
2 預處理
2.1 記憶體分區
進程:可執行文件從運行到結束整個動態的過程就叫進程。(占記憶體空間)
在32位平臺每一個進程占4G空間(虛擬空間)
2.2變數的存儲
2.2.1 普通局部變數
定義形式:{}裡面定義的普通變數叫普通局部變數
存儲區域:棧區
1、普通局部變數不初始化內容不確定
2、普通局部變數同名就近原則(儘量別同名)
2.2.2 普通全局變數
定義形式:在函數外定義的普通變數
作用範圍:當前源文件以及其他源文件都有效。
生命周期:整個進程。
存儲區域:全局區
1、全局變數不初始化內容為0
2、全局變數和局部變數同名優先選擇局部變數。
3、其他源文件使用全局變數必須對全局變數進行extern聲明。
2.2.3 靜態局部變數
定義形式:在{}加static定義的局部變數就叫靜態局部變數
作用範圍:所在的複合語句之間有效
生命周期:整個進程有效
存儲區域:全局區(全局區存儲特點:整個進程有效,內容不初始化為0)
靜態局部變數整個進程都存在(第一次定義有效)
2.2.4 靜態全局變數
定義形式:在函數外加static修飾定義的變數就是靜態全局變數
2.3 全局函數和靜態函數
作用範圍:只能在當前源文件使用
存儲區域:全局區
2.3.1 全局函數(函數預設都為全局函數)
全局函數:在當前源文件以及其他源文件都可以使用,
如果其他源文件使用需要extern對全局函數進行聲明
2.3.2 靜態函數(加static修飾的函數)
2.4 頭文件包含
頭文件包含:在預處理結果將頭文件的內容原封不動的包含在目的文件中
#include <head.h> 建議<>包含系統頭文件
<> 從系統指定目錄尋找head.h頭文件
#include "head.h" 建議""包含自定義頭文件
""先從當前目錄尋找head.h頭文件 如果找不到 再到系統指定的目錄下尋找
2.5 #define 巨集
編譯四階段:預處理、編譯、彙編、鏈接
使用關鍵字 define定義 叫巨集 巨集儘量大寫和普通變數區分開
#define PI 3.14 (巨集定義)
在預處理結果 使用3.14替換所有出現PI的位置(巨集展開)
2.5.1 不帶參數的巨集
巨集的作用範圍:是從定義處開始 到當前文件結束都有效
#undef可以結束巨集的作用域
巨集 沒有作用域的限制,只在當前源文件 有效
2.5.2 帶參數的巨集(巨集函數)
1、巨集的參數不能有類型
2、 巨集不能保證參數的完整性
可以使用()的形式 讓帶參數的巨集 具備一定的完整性
3、 巨集不能作為結構體、類的成員
4、案例:從外部展開
2.5.3 巨集函數和普通函數的區別:
帶參巨集被調用多少次就會展開多少次,執行代碼的時候沒有函數調用的過程,不需要壓棧彈棧。所以帶參巨集,是浪費了空間,因為被展開多次,節省時間;
帶參函數,代碼只有一份,存在代碼段,調用的時候去代碼段取指令,調用的時候要,壓棧彈棧。有個調用的過程。帶參函數是浪費了時間,節省了空間;
帶參函數的形參是有類型的,帶參巨集的形參沒有類型名。
函數有作用域的限制,可以作為類的成員;巨集函數沒有作用域的限制,不能作為類的成員