C語言基礎學習(七)

預處理: 處理由#開頭的語句
1: 文件包含 #include
#include < > 表示文件是在系統默認的目錄中
#include “ ” 表示文件是指定目錄

在頭文件中定義函數會怎樣? 如果有多個文件都包含了同一個頭文件,容易出現函數重定義
原因是include的文件會被展開

一般頭文件中放的是類型定義、全局變量和函數的外部調用聲明(extern)

2: 條件編譯
#if 條件
如果條件爲真 ,則把該語句編譯進去,否則不編譯
#endif

#if 條件
如果條件爲真 ,則把該語句編譯進去,否則不編譯
#else
如果條件不爲真 ,則把該語句編譯進去,否則不編譯
#endif

條件編譯和宏的組合
#if NUM==10
// #else
#endif

#ifdef 宏名
如果有對應的宏定義,則編譯該語句, 否則不編譯
// #else
// 如果沒有對應的宏定義,則編譯該語句, 否則不編譯
#endif

#ifndef 宏名
如果沒有對應的宏定義,則編譯該語句, 否則不編譯
#endif

3: 宏定義 在非條件判斷時候就是一個替換
自定義:
#define NUM 10 就表示定義了一個有值的宏NUM , 值爲10
#define GEC210 表示定義了一個無值的宏 GEC210
gcc -E -o KEY_name_system.e KEY_name_system.c -DDEBUG
DEBUG 是個宏名
編譯環境已定義
GNU-C
FUNCTION 當前函數名
LINE 所在的行數
TIME 當前預編譯的時間
FILE 當前文件名

#define apple int *
定義了一個宏apple 它等價於int *
apple a , b ; 相當於 int * a, b ;
int *a , int b ;

typedef int * apple ;
定義了一個int 類型 apple, apple是int的別名
apple a , b; 定義了兩個int *類型的變量a b
int * a; int *b

#define max(a, b) ((a)>(b)? (a) 😦 b))

#define max(a , b, temp) {
if(a > b)
temp = a;
else
temp = b;
}
帶參數的宏定義可以忽略類型

熟悉以上操作和驗證過程
如何在一個代碼中使用宏 判斷一個數或者表達式和0的大小關係

#define check(a ) {
if( (a) > 0)
printf(“ large than 0 \n”);
}

遞歸函數
函數自己調用自己

計算 1+2 +3 +。。。 +n n是從鍵盤的輸入
cnt = 0;
for(i = 0; i< =n ;i++)
{
cnt +=1;
}

寫一個函數可以實現的功能是1+2 +3 +。。。 +n ,要求使用上函數的遞歸調用

main:
sum = func( n);

int func( int n)
{
if(n == 1)
return n;
else
return ( n + func(n-1));
}

遞歸函數要注意:
1: 不要在遞歸過程中申請大空間,容易造成棧溢出
2: 代碼量也要儘可能精簡
3: 要有結束遞歸的條件 也就是在某種條件下就不要再遞歸了

帶參數的main函數
int main(int argc, char *argv[])
{
argc表示總參數個數, 包括了可執行文件名
argv是指針數組名, 由char *組成 ,
argv[0]表示執行文件名對應的字符串
argv[1] … argv[argc -1] 表示在命令行輸入的各個參數, 都是字符串

如果argv[1]輸入的是“100”. 這個是字符串 需要使用atoi轉換成是數字
atoi(argv[1]) 得到數字100
需要增加 stdlib.h這個頭文件
}

內聯函數 C99
可以節約系統調用函數花費的時間
inline函數 建議編譯器儘快調用該函數 但是編譯的最終效果是編譯器以及當前決定的
內聯函數是沒有地址的

內核鏈表 內聯函數
簡單實現
inline int func(void )

typedef int * handle_t( int );
int * handle_t( int ); 定義了一個指針函數, 返回值爲指針int *類型, 參數爲int
typedef int * handle_t( int ); 定義了一個指針函數類型 函數的返回值爲指針int *類型, 參數爲int

typedef int (* handle_t)( int );
int (* handle_t)( int ); 定義了一個函數指針, 返回值爲指針int類型, 參數爲int
typedef int (* handle_t)( int ); 定義了一函數指針類型 函數的返回值爲int 類型, 參數爲int

void (*signal (int sig, void (*func)(int)) ) (int); 返回值是函數指針的函數
void *signal (int sig, void (func)(int)) 返回值爲void的函數, 參數有兩個
void (*signal (int sig, void (*func)(int)) ) (int);
返回值爲void(*p)(int)函數指針的函數,形參 (int sig, void (*func)(int))
func是個函數指針,指向的函數是返回值爲void , 形參爲int
typedef void (*sighandler_t)(int);
定義了一個函數指針類型 sighandler_t, 所指向的函數是返回值爲void , 形參爲int
sighandler_t signal( int sig, sighandler_t func);
函數signal 返回值爲函數指針, 形參:1個int ,1個是函數指針
函數指針指向的函數都是返回值爲void, 形參爲int的

數組指針數組
int (* arg[10]) [4]
由10個 int [4]類型的指針構成的數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章