1. 程式人生 > >C語言指標學習筆記

C語言指標學習筆記

指標

1.        表示式中,陣列可以解讀成“指向它的初始元素的指標”(有三個例外),和在後面加不加[]沒有關係

2.        向一個函式傳遞陣列時,實際上傳遞的是一個指向初始元素的指標

3.        C中三種記憶體領域的壽命

靜態變數和全域性變數的壽命從程式執行時開始,到程式關閉時結束

自動變數的壽命到宣告該變數的語句塊執行結束為止

通過malloc()分配的領域的壽命到呼叫free()為止

利用malloc()來進行動態記憶體分配

1.        Malloc()根據引數指定的大小來分配記憶體塊,它返回指向記憶體塊初始位置的指標,一旦記憶體分配失敗,malloc()將返回NULL,利用malloc分配的記憶體結束使用時,通過free()來釋放記憶體。

2.        Malloc()返回值的型別為void *,malloc()不是系統呼叫,屬於標準庫函式

3.        呼叫free()後,對應的記憶體區域是不會立刻返還給作業系統的

C語言申明

1.        首先著眼於識別符號(變數或者函式名)

2.        從距離識別符號最近的地方開始,依照優先順序解釋派生型別(指標、陣列和函式),優先順序如下:

1)        用於整理宣告內容的括弧

2)        用於表示陣列的[],用於表示函式的()

3)        用於表示指標的*

3.        解釋完派生型別,使用”of”、”to”、”returning”將他們連線起來

4.        最後,追加資料型別修飾符(在左邊,如Int、double等)

C語言

英語表達

中文表達

Int hoge

Hoge is int

Hoge是int

Int hoge[10]

Hoge is array(元素個數為10) of int

Hoge是int陣列(..10)

Int hoge[10][3]

Hoge is array(元素個數為10)of array(元素個數為3) of int

Hoge是int陣列(元素個數3)的陣列(元素個數為10)

Int *hoge[10]

Hoge is array(元素個數為10)of pointer to int

Hoge是指向int的指標的陣列(元素個數為10)

Int (*hoge)[10]

Hoge is pointer to array(元素個數為10) of int

Hoge是指向int的陣列(元素個數為3)的指標

Int func(int a)

Func is function(引數為Int a)returning int

Func是返回int的函式(引數為int a)

Int (*func)(int a)

Func is a pointer to function(引數為int a) returning int

Func是指向返回int的函式(引數為int a)的指標

C的資料型別的模型

一、      基本型別和派生型別

派生型別

1)        結構體

2)        共用體

3)        指標

4)        陣列

5)        函式

int (*func_table[10])(int a);

指向返回Int的函式(引數為int a)的指標的陣列(元素個數為10)


基本型別:鏈的最後面的元素

二、      指向陣列的指標

Int (*array_p)[3]

Int array[3]

Array_p = &array 不能寫成 array_p= array因為array(指向Int的指標),array_p(指向int的陣列(元素個數3)的指標)

三、      C語言中不存在多維陣列

Int hoge[3][2]//int的陣列(元素個數2)的陣列(元素個數3)

Hoge[i]是指:int的陣列(元素個數2)的陣列(元素個數3)中的第i個元素,其型別為“int陣列(元素個數2)”

作為引數傳遞時:函式原型:void func(int *hoge)

指向int 的陣列(元素個數2)的指標

void func(int (*hoge)[2]) 即 void func(int hoge[3][2])

四、      函式型別派生

從函式型別是不能派生出除了指標型別之外的其他任何型別的。

從陣列型別是不能派生出函式型別的。

五、      計算型別的大小

Sizeof(型別名)

Sizeof(int(*[5])(double))

指向返回Int的函式(double)的指標的陣列(元素個數5)的大小

1)        指標:大部分情況下,指標的大小和派生源的大小沒有關係,大小固定

2)        陣列:派生源型別的大小乘以元素個數

Int *hoge[10]//4*10=40個位元組

Double *hoge[10]//4*10=40個位元組

Int hoge[3][2] //4*2*3=24個位元組

六、      基本型別(派生型別的底層)

基本型別:char和int這樣的整型以及float和double這樣的浮點型

表示式

表示式和資料型別

基本表示式:

1)        識別符號(變數名、函式名)

2)        常量(包括整數常量和浮點數常量)

3)        字串常量(使用“”括起來的字串)

4)        使用()括起來的表示式

“左值”——“右值”

左值:表示式代表某處的記憶體區域時

Hoge_p = &hoge;  *hoge_p = 10;//*hoge_p指向Hoge的記憶體區域

右值:表示式只是表達值時

運算子*將指標作為運算元,返回指標所指向的物件或者函式,只要不是返回函式,運算子*的結果都是左值

運算子&將一個左值作為運算元,返回指向該左值的指標。對左值的型別加上一個指標,就是&運算子的返回型別

運算子優先順序

運算子

連線規則

() [] -> .

從左往右

!  ~  ++  --  +  -  *  &  (type)  sizeof

從右往左

/  *  %

從左往右

+  -

從左往右

<<  >>

從左往右

<  <=  >  >=

從左往右

==  !=

從左往右

&

從左往右

^

從左往右

|

從左往右

&&

從左往右

||

從左往右

?:

從右往左

=  +=  -=  *=  /=  &=  ^=  |=  <<=  >>=

從右往左

從左往右

進行單目運算的+、-、*的優先順序高於進行雙目運算的。。

Const修飾符

Const修飾的是緊跟在它後面的單詞

Char * const src//src is read-only pointerto char//src是指向char的只讀的指標

Char const *src//src is pointer toread-only char//src是指向只讀的char的指標

Charconst *src====const char *src意思完全相同

Typedef

Typedef char *String;//String:指向char的指標

String hoge[10];

Hoge is array(元素個數為10) ofString//hoge是String的陣列(元素個數為10)

只有在宣告函式形參的情況下,int a[]和int *a才具有相同的意義

函式指標

Void (*func_p)()//變數func_p宣告為指向函式的指標,進行函式呼叫時,可寫成(*func_p)()

Int atextit(void(*func)(void))

Atextit是返回Int的函式(引數是,指向返回void沒有引數的函式的指標)

Void(*signal(int sig,void (*func)(int)))(int)

首先著眼於識別符號signal

Signal isa function(int sig,func is pointer to function(int) returning void) returningpointer to function(int) returning void

Signal是返回“指向返回void引數為int的函式的指標”的函式,它有兩個引數,一個是int,一個是“指向返回void引數為int的函式的指標”

陣列和指標的常用方法

以函式返回值之外的方式來返回值

若需要通過函式返回值之外的方式返回值,將“指向T的指標”(如果想要返回的值的型別為T)作為引數傳遞給函式

可變長陣列

使用malloc()在執行時為陣列申請必要的記憶體區域

標頭檔案的寫法

寫標頭檔案是必須遵守的原則:

1.        所有的標頭檔案中,必須要有防止重複#include的保護

2.        所有的標頭檔案只#include自己直接依賴的標頭檔案