指標是 c 語言中的精華,正確靈活的運用指標,可以表示複雜的資料結構,動態分配記憶體,方便使用字串和陣列,呼叫函式返回多結果,直接處理記憶體單元等等。
位址就是記憶體的編號,如果拿旅店作為記憶體,那麼每個房間號其實就相當於位址了。
當程式編譯時,就會對變數分配記憶體單元,分配時按變數型別分配大小。經過編譯後,程式中的變數都轉換為其對應的記憶體位址,以後對變數的訪問都是通過位址進行的,這種方式稱為「直接方式」。
乙個變數的位址就稱為該變數的指標。
存放位址的變數,也就是存放指標的變數,就稱為指標變數。指標是乙個位址,而指標變數是乙個變數,它也有自己的位址(指標)。
將乙個變數的位址存放在另乙個變數中,也就是指標變數中,通過指標變數來訪問原變數的方式,稱作「間接方式」。
形式:基型別 * 指標變數名;
c 語言規定所有變數使用前必需先定義,也就是指定其型別,好根據型別分配記憶體單元的大小。指標型別也不例外,必需定義其型別為指標型別,用「*」表示,但指定為指標型別還不夠,需根據所要指向的變數型別定義其基型別,編譯時按基型別分配記憶體空間。
舉例:
int * p1, * p2;
int a=100, b=200;
p1=&a;
p2=&b;
那麼,
*p1為100,也就是a
*p2為200,也就是b
& * p1為&a
* &a為a
(* p1)++為a++
在函式呼叫時,將實參變數的值傳送給形參變數,依然是「值傳遞」方式。由於是單向的值傳遞,指標變數作為引數也得守這一規矩。不可能通過呼叫函式改變實參指標變數的值,但可以改變實參指標變數所指向的變數值。
陣列元素的指標就是陣列元素的位址。
引用陣列元素可以用下標法,也可以用指標法,但指標法占用記憶體少,執行速度快,即目標程式質量很高。
c 語言規定陣列名代表該陣列首元素的位址,它是乙個指標常量,在程式執行期間是固定不變的。
輸出陣列中的元素有三種方法,分別是下標法、通過陣列名找到元素位址並找出值、指標變數指向陣列元素。前兩種方法的執行效率是相同的,費時較多,第三種方法最快。
函式名作函式引數時,編譯時都是將形參陣列名作為指標變數來處理。
形參陣列名實際上是乙個指標變數,可以不指定陣列元素的個數,並不真正開闢陣列空間。但定義陣列就需要指定陣列大小,因為要開闢空間。
指向二維陣列的指標變數中,在指向行的指標前面加乙個 「*」,就轉換為指向列的指標。反之,在指向列的指標前面加 「&」,就成為指向行的指標。
字串的訪問可以有兩種形式,一種是用字元陣列存放乙個字串,另一種就是用字元指標指向乙個字串。
字串在記憶體中存放時,會在末尾自動加乙個『\0』來表示字串的終止位置。
指向陣列的指標是個變數,可以進行自增運算。雖然陣列名也可以表示陣列的首位址,但它是個常量,不能進行自增運算。
任何函式在編譯時會被分配給乙個入口位址,這個位址就稱為函式的指標。
每乙個函式都占用一段記憶體單元,都有乙個起始位址,而函式名就代表該函式的起始位址,即入口位址。
指向函式的指標變數的定義形式:
資料型別 (* 指標變數名)(函式引數表列)
在程式中,乙個指標變數可以先後指向同型別的不同函式。
給函式指標賦值時,只需給出函式名而不必給出函式引數。
在用函式指標呼叫函式時,只需將原來呼叫方式中的函式名換成 (* p) 即可。
對指向函式的指標變數,不能進行運算,無意義!
指向函式的指標作為形參用於在函式中呼叫的函式是不固定的情況下。
定義形式:型別名 * 函式名(參數列列)
定義形式:型別名 * 陣列名[陣列長度]
在定義乙個二維的字串陣列時,用指標陣列可以節省記憶體單元,因為不需要按最長的字串定義陣列列數。另外,移動指標變數的值,也就是位址時要比移動字串所花的時間少的多。
指標陣列做main函式的形參
一般寫成:void main()
帶引數時:void main(int argc, char * argv)
main函式是由作業系統呼叫的,當處於操作命令狀態下時,輸入main所在的檔名,作業系統就會呼叫main函式。引數值是和命令一起給出的,命令列的一般形式為:
命令名 引數1 引數2 … 引數n
argc 指命令列中引數的個數,需要注意的是檔名也算做乙個引數。
argv 是乙個指向字串的指標陣列,命令列引數應當都是字串,這些字串的首位址構成這個指標陣列。
main函式中的形參名不一定命名為argc和argv,可以任意,只是已經習慣用這兩個名而已。
int i; //定義整形變數i
int * p; //p為指向整形資料的指標變數
int a[n]; //定義整形陣列a,它有n個元素
int * p[n]; //定義指標陣列p,塔由n個指向整形資料的指標元素組成
int (*p)[n]; //p為包含n個元素的一維陣列的指標變數
int f(); //f為返回整形函式值的函式
int * p(); //p為返回乙個指標的函式,該指標指向整形資料
int (*p)(); //p為指向函式的指標,該函式返回乙個整型值
int **p; //p是乙個指標變數,它指向乙個指向整形資料的指標變數
——摘自《c語言程式設計》 C語言中的指標
隨著程式語言的越來越多,但c語言在程式語言中的地位似乎始終沒有改變,其中得益於c語言中的指標,可以直接去操作記憶體位址與暫存器,執行效率也高,在嵌入式領域運用得尤其廣泛。對於初學者來說指標是c語言中很難翻越的一座大山,指標的掌握程度直接關係到c語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...
C語言中的指標
指標是c語言中非常重要的東西,書本上寫了好多來解釋裡面的原理,當年老師也跟我們講了好多這方面的東西,一直就是感覺沒有聽明白。直到我看到了指向指標的指標,我建立了自己的理解,不知道是否正確,但是基本能解決遇到的問題。int p p i p。type p,宣告指標變數,type 例如int 告訴計算機p...
C語言中的 指標
讓你不再害怕指標 要了解指標,或多或少會有一些複雜的型別,讓人思緒萬千。其實要理解複雜型別其實很簡單,乙個型別裡會出現很多運算子,但他們和普通的表示式一樣,也有優先順序。所以 從變數名處起,與運算子優先順序結合,一步一步分析。先從簡單的型別開始分析 int p 這是乙個普通的整型變數 int p 從...