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自己直接依賴的標頭檔案