概念
1 指標也是乙個變數,做為指標變數的值是另乙個變數的位址。指標存放的內容是乙個位址,該位址指向一塊記憶體空間
其一般形式為:
型別說明符 *變數名;其中,*表示這是乙個指標變數,變數名即為定義的指標變數名,型別說明符表示本指標變數所指向的變數的資料型別。
例如: int *p1;
表示p1是乙個指標變數,它的值是某個整型變數的位址。或者說p1指向乙個整型變數。至於p1究竟指向哪乙個整型變數,應由向p1賦予的位址來決定。
2 圖例解釋
int i = 10;//乙個int變數,名字叫i
int *p;//
定義了乙個指向整數的指標變數
注意:
//切記,指標變數只能存放位址,不能將乙個int型變數直接賦值給乙個指標。在以下中
int i = 10;//
乙個int變數,名字叫i
int *p;//
定義了乙個指向整數的指標變數
//p = 10;
//錯誤,不可以把乙個整數直接賦值給指標變數.
//c語言當中每個變數都有自己的記憶體位址。&符號就是取變數位址操作符.
printf("%x
",&i); //
輸出i的16進製制位址
printf("
%d",*p); //
輸出i的值
printf("
%x",&*p); //
輸出i的16進製制位址
printf("
%x",&p); //
輸出p的位址,注意,指標也有自己的記憶體位址
printf("
%x",p); //
輸出i的16進製制位址
3 指標變數的引用
指標變數同普通變數一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指標變數不能使用,否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予位址, 決不能賦予任何其它資料,否則將引起錯誤。在c語言中,變數的位址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體位址。
兩個有關的運算子:
1) &:取位址運算子。
2) *:指標運算子(或稱「間接訪問」 運算子)。
c語言中提供了位址運算子&來表示變數的位址。
其一般形式為:
&變數名;
如&a表示變數a的位址,&b表示變數b的位址。變數本身必須預先說明。
(1) 指標變數初始化的方法
int a;
int *p=&a;
(2) 賦值語句的方法
int a;
int *p;
p=&a;
不允許把乙個數賦予指標變數,故下面的賦值是錯誤的:
int *p;
p=1000;
4 野指標
定義了乙個指向int的指標變數;沒有賦初值,就是個野指標,指向什麼記憶體位址不知道
int *p3;* 野指標的危害只是程式本身,不會影響到作業系統。* 如果你做的是乙個驅動程式或者核心**,那麼可能是致命的,作業系統崩潰
* 野指標也叫懸空指標,不能給野指標指向的記憶體區域賦值。
注意:乙個指向null的指標,我們稱之為空指標(也就是說野指標),意味著這個指標不指向任何乙個變數。
5 無型別指標
定義乙個指標變數,但不指定它指向具體哪種資料型別。可以通過強制轉化將void *轉化為其他型別指標,也可以用(void *)將其他型別指標強制轉化為void型別指標。
void *p在c語言當中,可以將任何一種位址賦值給void *指標例如:
void *p4;//6 指標變數作為函式引數函式的引數不僅可以是整型、實型、字元型等資料,還可以是指標型別。它的作用是將乙個變數的位址傳送到另乙個函式中。定義了乙個無型別的指標。
p4 = &i;//
可以將任意型別的位址賦值給void *
//p1 = p4;
//(在c語言中可以將void *賦給任意型別的指標變數).但c++這個語句是非法的
例:輸入的兩個整數按大小順序輸出
swap(int *p1,int *p2)說明:swap是使用者定義的函式,它的作用是交換兩個變數(a和b)的值。swap函式的形參p1、p2是指標變數。程式執行時,先執行main函式,輸入a和b的值。然後將a和b的位址分別賦給指標變數pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。main()
7 陣列指標
乙個變數有位址,乙個陣列包含若干個元素,每個元素在記憶體中都有位址。
int a[10在c語言當中陣列的名稱代表陣列的首位址,如果取陣列名稱的位址,c語言認為就是取陣列的首位址。];int *p =a;
p和&a[0]的位址是否相同?
相同
int array[10] = ;//8 通過指標引用陣列元素如果指標變數p已指向陣列中的乙個元素,則p+1指向同一陣列中的下乙個元素。array[0]的值是6
int *p = &array[0];//
p指向了陣列的第乙個元素的位址
int *p1 = array;//
p1指向了陣列的首位址.
//*p和*p1是一樣的。
如果p的初值為&a[0],則:
1) p+i和a+i就是a[i]的位址,或者說它們指向a陣列的第i個元素。
2) *(p+i)或*(a+i)就是p+i或a+i所指向的陣列元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。
3) 指向陣列的指標變數也可以帶下標,如p[i]與*(p+i)等價。
根據以上敘述,引用乙個陣列元素可以用:
1) 下標法,即用a[i]形式訪問陣列元素。在前面介紹陣列時都是採用這種方法。
2) 指標法,即採用*(a+i)或*(p+i)形式,用間接訪問的方法來訪問陣列元素,其中a是陣列名,p是指向陣列的指標變數,其處值p=a。
例:輸出陣列中的全部元素。(下標法)
main()輸出陣列中的全部元素。(通過陣列名計算元素的位址,找出元素的值)main()輸出陣列中的全部元素。(用指標變數指向元素)main()main()注意:1) 指標變數可以實現本身的值的改變。如p++是合法的;而a++是錯誤的。因為a是陣列名,它是陣列的首位址,是常量。}
【感謝譚浩強老師的《c語言》】
c 語言溫故
1 編譯指令 cc c 檔名 批量編譯 cc c 檔名1 檔名2 cc 檔名.o 生成.out執行檔案 3 將.out檔案用終端開啟 c語言常見檔案的副檔名 1 c是c語言原始檔,在編寫 的時候建立 2 o是目標檔案,在編譯成功的時候產生 總結clang指令 1 編譯 cc c c 檢查語法是否正確...
C 溫故知新 之 指標 函式指標變數 指標型函式
猛一看還真有點糊糊 注意區別 1 函式型指標 指函式返回 值的型別。指標型函式 返回值是乙個 指標 即位址 2 int p 和int p 是一樣嗎?為什麼?int p 是乙個變數說明,說明 p 是乙個指向函式入口的指標變數,該函式的返回值是整型量,p 的兩邊的括號不能少。函式型指標 int p 則不...
C 溫故知新 之 指標 函式指標變數 指標型函式
猛一看還真有點糊糊 注意區別 1 函式型指標 指函式返回 值的型別。指標型函式 返回值是乙個 指標 即位址 2 int p 和int p 是一樣嗎?為什麼?int p 是乙個變數說明,說明 p 是乙個指向函式入口的指標變數,該函式的返回值是整型量,p 的兩邊的括號不能少。函式型指標 int p 則不...