C語言的重要概念

2021-07-09 20:30:27 字數 3362 閱讀 4809



一、c語言的指標

1.指標說明

指標是包含另一變數的位址的變數。

(1)int *p

p是乙個指標,指向乙個整型數。

(2)int *p()

p是乙個函式,該函式返回乙個指向整數的指標。

(3)int (*p)()

p是乙個指標,該指標指向乙個函式,這個函式返回乙個整數。

(4)int *p

p是乙個陣列,該陣列的每乙個元素是指向整數的指標。

(5)int (*p)

p是乙個指標,該指標指向乙個陣列,這個陣列的每乙個元素是乙個整數。

(6)int *(*p)()

p是乙個指標,該指標指向乙個函式,這個函式返回乙個指向整數的指標。

2.指標的初始化(賦位址)

(1)通過符號&取變數(包括結構變數、陣列第乙個元素)的位址賦給指標;

(2)把陣列名賦給指標;

(3)把函式名賦給指向函式的指標;

(4)動態分配記憶體

例:struct c;

struct c *p;

p=(struct c *)malloc(sizeof(struct c));

3.指標與陣列、函式的關係

(1)對於一維陣列 int a[i] 或指標 int *a

a+i 指向 a[i]

(2)對於字串 char s[i] 或指標 char *s

s+i 指向第 i個字元 s[i]

(3)對於二維陣列int a[i][j]

*a+j 指向 a[0][j]

*(a+i) 指向 a[i][0]

*(a+i)+j 指向 a[i][j]

例:對於 a[2][3]=; 有 *(*(a+1)+1)=5;

(4)對於字串陣列char p[i][j] 或字元型指標陣列char *p[i]

*p+j 指向第 0個字串的第 j個字元

*(p+i) 指向第 i個字串的第 0個字元

*(p+i)+j 指向第 i個字串的第 j個字元

例:對於 *p=; 有 *(*(p+1)+1)='e';

例:對於 char p[3]=; 有 *(*(p+1)+1)='e';

(5)對於指標陣列int *a[i]

a[i] 指向 變數i

即 *a[i]=變數i 或 a[i]=&變數i

(6)對於結構struct xy

*p;p是指向結構xy的指標

(*p).x 或 p->x 是表示 x 的內容

(*p).y 或 p->y 是表示指標 y 的值(位址)

*(*p).y 或 *p->y 是表示 y 所指的內容

&(*p).x 或 &p->x 是表示 x 的位址

(7)指向函式的指標

對於 void func(char *str)

; //定義了乙個函式

void (*p)(char*);//定義了乙個函式指標

p=func; //讓指標指向函式

則(*p)("…"); //用指標p可以呼叫函式func

(8)指向多個不同函式的指標陣列

對於void function_1() ; …

void function_4() ; //定義了四個函式

typedef void(*menu_fcn)();//定義了指向函式的指標

menu_fcn command[4]; //定義了指標陣列

command[0]=function_1; …

command[3]=function_4; //讓指標陣列指向四個函式

則command[0](); //用指標陣列中的乙個元素呼叫乙個函式

4.指標的分類

(1)近指標(near):

近指標為16位指標,它只含有位址的偏移量部分。近指標用於不超過64k 位元組的單個資料段或**段。在微、小和中編譯模式下產生的資料指標是近指標(預設狀態);在微、小和中編譯模式下產生的碼指標(指向函式的指標)是近指標(預設狀態)。

(2)遠指標(far) (庫函式的標頭檔案裡邊就有far關鍵字)

遠指標為32位指標,指標的段位址和偏移量都在指標內。可用於任意編譯模式。每次使用遠指標時都要重灌段暫存器。遠指標可定址的目標不能超過64k ,因為遠指標增減運算時,段位址不參與運算。在緊湊、大和巨模式下編譯產生的資料指標是遠指標(預設狀態)。

(3)巨指標(huge)

巨指標為32位指標,指標的段位址和偏移量都在指標內。可用於任意編譯模式。遠指標定址的目標可以超過64k 。巨指標是規則化的指標。

5.指標的轉換

(1)遠指標轉換成巨指標

使用以下函式

void normalize(void far * * p)

6.指標的使用

(1)將浮點數轉換成二進位制數

float ff=16.5;

unsigned char *cc;

(float*)cc=&ff;

//此時cc的內容為"00008441"

//即cc第乙個位元組=0;第二個位元組=0;第三個位元組=0x84;第四個位元組=0x41;

(2)將二進位制數轉換成浮點數

float ff;

unsigned char *cc;

cc=(unsigned char*)malloc(4);

cc=(unsigned char*)&ff;

*(cc+0)=0;

*(cc+1)=0;

*(cc+2)=0x84;

*(cc+3)=0x41;

//此時ff=16.5

free(cc);

二、c 語言的函式

1.使用者自定義函式格式

型別 函式名(形式參數列)

引數說明

2.函式的呼叫方式

(1)傳值方式

①傳給被呼叫函式的是整型、長整型、浮點型或雙精度型變數。被呼叫的函式得定義相應的變數為形參。

②傳給被呼叫函式的是結構變數。被呼叫函式得定義結構變數為形參。

③傳給被呼叫函式的是結構變數的成員。被呼叫函式得定義與該成員同類的變數為形參。

(2)傳址方式

①傳給被呼叫函式的是變數的位址。被呼叫函式得定義指標變數為形參。

②傳給被呼叫函式的是陣列的位址即陣列名。被呼叫的函式得定義陣列或指標變數為形參。

③傳給被呼叫函式的是函式的位址即函式名稱。被呼叫函式得定義指向函式的指標變數為形參。

④傳給被呼叫函式的是結構的位址。被呼叫函式得定義結構指標為形參。

3.函式呼叫(傳值方式)結果的返回

(1)返回的是數值

要求被呼叫的函式型別與接收返回值的變數型別相同。

(2)返回的是指標

要求被呼叫的函式是指標函式,其指向的型別與接收的指標變數指向型別相同。

(3)不返回任何值

被呼叫的函式是void型。

C 重要概念

純虛函式不需定義其實際操作,它的存在只是為了在派生類中被重新定義。既然抽象類中的虛函式不打算被呼叫,我們就不應該定義它,應該把它設 為純虛函式 在函式宣告之後加上 0 即可 virtual void display 0 多型 以單一指令呼叫不同函式,這種性質稱為多型。虛函式派生下去仍為虛函式,而且可...

C 重要的幾個概念

1 虛繼承 在預設情況下,派生類物件中應該包含子類那部分。如果某個類在派生過程中出現了多次,則應該有包含該類的多個子物件。但是這樣顯然對iostream是行不通的,乙個iostream物件肯定只希望在同乙個緩衝區中進行讀寫操作,也會要求條件狀態能同時反映輸入輸出操作的情況。假如iostream包含了...

C 重要幾個概念

1 c 中虛函式的作用是什麼 2.c 運算子過載怎麼理解?說起來比較麻煩,還是自己看起來領悟的快。給你個簡單的運算子過載的例子。過載了兩個 點的加減運算。他使本來只可以在數值上用 運算的可以被座標點運用。點x 1,1 y 2,2 z 3,3 例子如下,成功除錯。include using names...