變數的本質是一段儲存空間的別名,指標的本質是一種特殊型別的變數,這種變數的儲存空間中儲存的是另乙個變數的位址。
*號的意義:
*號代表所申明的變數是指標;*號表示取指標所指向記憶體空間的值。
該使用傳值呼叫還是傳址呼叫:
當函式內部需要改變實參的值,則需要使用傳址呼叫;
如果函式需要傳入的引數型別複雜,體積巨大,又不希望引數在函式體內部被改變,應該使用const指標。
const datatype* p;
//p可以被改變,*p不能改變
datatype const
* p;
//p可以被改變,*p不能改變
datatype*
const p;
//p不可以改變,*p可以改變
const datatype*
const p;
//p和*p均不能改變
指標加法的運算規則:
指標與整數相加:p + n = (unsigned datatype)p + n * sizeof(datatype);
指標與指標相加:p + q = ((unsigned datatype)p + (unsigned datatype)q) / sizeof(datatype);
指標減法的運算規則:
指標與整數相加:p – n = (unsigned datatype)p + n * sizeof(datatype);
指標與指標相加:p – q = ((unsigned datatype)p – (unsigned datatype)q) / sizeof(datatype);
指標之間可以進行關係運算(<,<=,>,>=)。
指標之間可以進行比較運算(==,!=);
為什麼需要多維指標?
指標的本質是變數,對指標也存在傳值呼叫和傳址呼叫的問題
陣列是相同變數的有序集合。
陣列的個數可以顯式指定或隱式指定(即初始化時不說明陣列大小)。
陣列名代表陣列首元素的位址;
陣列的位址需要用取位址符&得到,陣列首元素的位址與陣列的位址值相同;
陣列的位址與陣列首元素的位址不是同一概念;
陣列的位址包含起始位址與長度;
陣列名可以看做指向陣列第乙個元素的常量指標。
指標以固定增量在陣列中移動時,效率遠高於下標訪問
現代編譯器的生成**優化率已大大提高,在固定增量時,下標形式的效率已經和指標形式相當,考慮到**可讀性和維護的角度,更推薦使用下標形式。
陣列的型別:
陣列的型別由元素型別和陣列大小共同決定。
例如:int array[5]的型別為int[5]。
利用typedef為陣列型別重新命名:typedef type(name)[size]
。
例如:typedef int(aint5)[5]; aint5 array;
定義陣列指標:
type(*pointer)[size]
。
c語言中函式只會以值拷貝的方式傳遞引數,陣列引數必然退化為指標,多維陣列引數必須提供除第一維之外的所有維長度資訊
用a[i]這樣的形式對陣列進行訪問總是會被編譯器解釋為像*(a+i)這樣的指標形式
資料會在什麼時間退化成指標:
c語言標準規定,當陣列名作為定義的識別符號(也就是定義或宣告陣列時)、sizeof或&的運算元時表示陣列本身,在其它的表示式中,陣列名會被轉換為指向第0個元素的指標。
c語言中的函式有自己特定的型別,函式的型別由返回值、引數型別和引數個數共同決定。
例如:int add(int i, int j)的型別為int(int, int);
乙個函式總是占用一段連續的記憶體區域,函式名在表示式中可能被轉換為該函式所在的記憶體區域的首位址。我們可以通過乙個指標變數指向該位址從而實現對該函式的訪問,這種指標就是函式指標。
函式指標的定義形式:returntype (*pointername)(param list)
;
例如:int (*pointer)(int, int)定義了乙個指向int(int, int)型別的函式指標pointer;
main函式一定是程式執行的第乙個函式嗎?
c語言標準規定,對於乙個符號的定義,編譯器總是從它的名字開始讀取,然後按照優先順序順序依次解析。
例如:int (* (*(*pfunc)(int *)) [5]) (int *)
;
先讀取(pfunc),可以確定pfunc是乙個指標,再讀取((pfunc)(int)),可以確定pfunc是乙個函式指標,引數型別為int*,返回值也是乙個指標,接著讀取(* ((pfunc)(int)) [5]),可以確定返回值指向了乙個有5個元素的陣列,陣列的每乙個元素也是乙個指標,最後讀取int ( (*(*pfunc)(int *)) [5])(int ),可以確定陣列中的每乙個指標元素指向了乙個int(int)型別的函式。
c指標陣列與陣列指標與指標函式與函式指標筆記
include include typedef struct t ooxx t ooxx,pt ooxx 測試陣列指標 void test ooxx arrayp t ooxx p int num 測試指標陣列 void test ooxx parray t ooxx p,int num 測試函式指...
函式指標與函式指標陣列
去看這篇文章,寫的非常好 void func 這是乙個函式指標宣告,定義的時候,要把真實的函式位址賦給 func func function 你已經寫好了function 函式,再把function這個函式位址賦給func,有啥用?沒啥 用吧。來看看函式指標陣列你就只知道了 void func 25...
高階指標與陣列 函式指標,函式指標陣列等
下面與大家一起討論一下高階版的指標與陣列,是建立在大家的一級指標和一維陣列的基礎上的。存放指標的陣列。因為 操作符的優先性要高於 操作符,所以下面的均為指標陣列 int arr1 10 表示指標陣列,強調的是陣列。陣列有十個元素,是指向int型別資料的指標。char arr2 4 表示指標陣列,強調...