學過編程語言的童鞋們都知道指針是C語言的精髓,學好了指針就等於學好了C語言,它可以直接對物理地址進行訪問,具備雙重功能,是嵌入式設計中必不可少的一門語言。C語言功能強大的主要緣由就是具備指針結構。指針是一種特殊的數據類型,直接指向目標的存儲地址,實現直接訪問對象存儲空間功能。編程
計算機的內存被劃分爲多個存儲單元,這些存儲單元能夠以單個或者順序相連組成一個更大的方式被使用。每個單獨的存儲單元都是一個字節,它一般由8個位(bit)組成,每個位能夠表示的值只有0或1.每個存儲單元都被一個及其分配的標識惟一地表示,而這個標識就是地址(指針)。編程語言
在C語言中,定義一個普通的變量(如正整數),咱們這樣作:int i;而定義一個指針變量(指針)咱們須要這樣作:int *p; 當咱們作出int i;這樣一個定義時,編譯器就會分配一個地址並和i關聯起來,而int將限定編譯器把這個區域中的內容做爲整型看待。如今咱們又有了int *p這個定義,假設p是指向變量i的,p中存的是變量i的地址。*表示p是一個指針,而int表示p中所存在的地址對應的變量(即變量i)的類型是int.由此指針定義的通常形式以下:
基類型 *指針名;spa
指針變量:存放內存地址的變量。
指針變量要先初始化後纔可以使用,否則就會成爲野指針,致使程序崩潰。操作系統
#include <stdio.h> int main(int argc, const char * argv[]) { int num = 10; //定義一個變量 int *p; //定義一個指針變量 p = # //將變量num的地址賦值給指針變量p; *p = 30; //爲p所指向地址的變量賦值 printf("%p,-- %p; %d == %d", &num, p, num, *p); return 0; } 運行結果 0x7fff5fbff75c,-- 0x7fff5fbff75c; 30 == 30Program ended with exit code: 0
如下是錯誤的賦值: 設計
#include <stdio.h> int main(int argc, const char * argv[]) { int num = 10; //定義一個變量 int *p; //定義一個指針變量 //p = # //將變量num的地址賦值給指針變量p; *p = 30; //爲p所指向地址的變量賦值 printf("%p,-- %p; %d == %d", &num, p, num, *p); return 0; }
以上代碼指針變量未初始化就使用會出現野指針異常,致使程序崩潰。
野指針:沒有指向任何地址的指針。(不合法)
空指針:指向地址爲null的指針。(合法)指針
不能夠使用一個整型常量賦值給一個指針,由於內存是操做系統分配給咱們的,不是咱們隨便取的。以下:code
#include <stdio.h> int main(int argc, const char * argv[]) { int *p = 200; printf("%d", *p); return 0; } 運行結果 程序崩潰,出現野指針異常
二級指針對象
指向指針的指針。定義方式:int **pp; 代碼示例以下:內存
#include <stdio.h> void printString(char **str) { printf("%p\n",str); *str = "dqk"; } int main(int argc, const char * argv[]) { int num = 100; //定義一個變量 int *p; //定義一個指針變量 p = # //爲指針變量賦值 int **pp; //定義一個二級指針變量 pp = &p; //爲二級指針賦值 **pp = 10; //爲二級指針所指向的內存空間賦值 printf("num: %d\n", num); return 0; } 運行結果: num: 10 Program ended with exit code: 0