C 的那點事兒

2021-07-11 14:21:42 字數 2518 閱讀 4269

一、預處理

定義:在編譯之前所做的處理,主要包括:

標頭檔案(預處理會展開)、巨集定義(預處理會替換掉)、條件編譯

二、標頭檔案

作用:將一些公用**,如函式原型宣告,型別宣告,全域性變數宣告,巨集定義等,放到乙個檔案中,以提供跨工程**復用,減少**重複書寫。

處理方式:內容展開(若標頭檔案中有遞迴包含逐級展開)

能否重複包含:不能,容易出現重複定義

可以使用條件編譯,如下方式加以解決

#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...