一、預處理
定義:在編譯之前所做的處理,主要包括:
標頭檔案(預處理會展開)、巨集定義(預處理會替換掉)、條件編譯
二、標頭檔案
作用:將一些公用**,如函式原型宣告,型別宣告,全域性變數宣告,巨集定義等,放到乙個檔案中,以提供跨工程**復用,減少**重複書寫。
處理方式:內容展開(若標頭檔案中有遞迴包含逐級展開)
能否重複包含:不能,容易出現重複定義
可以使用條件編譯,如下方式加以解決
#ifndef 巨集
#define 巨集
#endif
#include <>:編譯器去系統預設指定目錄查詢
#include「」:編譯器先在當前目錄查詢,找不到再去系統預設目錄
三、巨集定義
定義:用乙個簡單易記的字元集合代替複雜的內容
格式:#define 字元集合 內容
處理方式:簡單的完全的字元替換
優點:增強**可讀性,提高可移植性
注意:以下兩行是不等價的【見3.c】
#define ip int * //預處理前替換掉 ip a,b 指:int*a;int b不等價
typedef int * ip; //編譯時 ip a,b 指:int*a; int* b;
帶參巨集:
1、整體的返回值要新增括號
2、使用引數時也要新增括號
四、關鍵字
【typedef】
作用:給型別起別名,可以提高**的可移植性
1、typedef int ** ipp;
2、typedef int (*a2p)[5];
3、typedef int (*fp)(int, int);
【static】
1、static修飾區域性變數
延長區域性變數的生命週期至整個程式
2、static修飾全域性變數
限定了全域性變數的作用域為當前定義的原始檔
3、static修飾函式
限定了函式的使用範圍為當前定義的原始檔
總結:static雖然限定了全域性變數和函式的作用域,
但是其它原始檔可以定義同名變數或函式。
【const】
1、const int *a 和 int const *a
a的指向可以改變,a指向的內容不可改變
2、int *const a
a的指向不可改變,a指向的內容可以改變
3、const int *const a
a的指向不可改變,a指向的內容也不可改變
1、const int *a; int b; a = &b; *a = 100; 錯
2、int *const a; int b; a = &b; *a = 100; 錯
3、int b; int *const a = &b; *a = 100; 對
如果有const int *a;int *b;那麼語句a=b;是否可行?
反過來b=a;又是否可行?為什麼呢?
結論:const指標不可以通過位址改變資料,而非const指 針可以通過位址修改資料,所以在指標變數賦值時只能 是非const指標賦值給const指標,反過來則有風險。
總結:const修飾誰,誰就不可改變
五、條件編譯
定義:給某段**指定編譯條件
處理方式:條件成立參與編譯,條件不成立相當於刪除
格式一:注釋成塊**
#if 表示式
#endif
格式二:測試**
#if 表示式
#else
#endif
格式三:
#ifdef 巨集
#endif
格式四:
#ifndef 巨集
#endif
六、複雜的指標宣告
1、二級指標(多級指標)
int a = 250;
int *p = &a;
int **q = &p;
p <===> &a
*p <==> *(&a) <==> a
q <===> &p
*q <==> *(&p) <==> p <==> &a
**q <==> *p <==> a
總結:&使資料埋藏的更深,*使資料重見天日
2、指向二維陣列的指標
int a[5];
int *p = a<==> &a[0]
int a[2][5];
int [5] *p => int (*p)[5] = p=a=&a[0]
a+1 <==> p+1 <==> &a[1]
*(p + i) <==> &a[i][0]
&a[i][j] <==> *(p+i)+j
a[i][j] <==> *(*(p+i)+j)
3、函式指標
void test(int a, char *b);
void (*p)(int, char *) = test;
p(250, null);
總結:作為函式引數的時候使用
C 宣告變數的那點事兒
c 宣告變數的語法 三種 型別 變數名 強型別宣告 var 變數名 待編譯時確定型別 dynamic 變數名 待執行時確定型別 到底哪種執行效率高呢?還是不說廢話,上 需要知道結果,可以copy 後執行看看 csharp using system using system.diagnostics n...
C 專題 const那點事兒
目錄限定符const是老生常談的話題了,不管是面試還是平時工作都會經常遇到,你真的對它了解了麼?我這裡主要是從三個維度進行總結,並進行例項驗證。const修飾內建型別 以下兩種表達是等價的 const int a 0 int const b 1 a 1 不允許,編譯報錯 b 2 不允許,編譯報錯co...
游標那點事兒
兩種迴圈跳出方法 1 稍顯複雜點 create procedure dbo.usp cralltables client id varchar 256 asdeclare table name varchar 50 set nocount on declare t name cur cursor l...