指標全稱是指標變數,其實質是c語言的一種變數。這種變數比較特殊,通常它的值會被
賦值為某個變數的位址值(p = &a),然後我們可以使用*p這樣的方式去間接訪問p所
指向的那個變數。
指標存在的目的就是間接訪問。有了指標之後,我們訪問變數a不必只通過a這個變數名來
訪問。而可以通過p = &a; *p = ***;這樣的方式來間接訪問變數a。
&:取位址符,將它加在某個變數前面,則組合後的符號代表這個變數的位址值。
例如: int a; int *p; p = &a; 則將變數a的位址值賦值給p。
就在上面的例子中,有以下一些符號:
a 代表變數a本身
p 代表指標變數p本身
&a 代表變數a的位址值
*p 代表指標變數p所指向的那個變數,也就是變數a
&p 代表指標變數p本身的位址值。符號合法,但對題目無意義
*a 把a看作乙個指標,*a表示這個指標所指向的變數。該符號不合法
星號* :指標符號。指標符號在指標定義和指標操作的時候,解析方法是不同的。
int p; 定義指標變數p,這裡的p含義不是代表指標變數p所指向的那個變數,在定義時這裡的*含義是告訴編譯器p是乙個指標。
int p;
// p是乙個整形變數
int*p;
// p是乙個指標變數,該指標指向乙個整形數
使用指標的時候,*p則代表指標變數p所指向的那個變數。
指標既然是一種變數,那麼肯定也可以定義,也可以初始化
第一種:先定義再賦值
int *p; // 定義指標變數p
p = &a; // 給p賦值
第二種:定義的同時初始化
int *p = &a; // 效果等同於上面的兩句
指標變數本質上是乙個變數,指標變數的型別屬於指標型別。int *p;定義了乙個指標型別的
變數p,這個p所指向的那個變數是int型。
int
*pint;
// pint是指標變數,指向的變數是int型別
char
*pchar;
// pchar是指標型別,指向的變數是char型別
float
*pfloat;
double
*pdouble;
各種指標型別和它們所指向的變數型別必須匹配,否則結果不可預知。
int
*p;
第一種:首先看到p,這個是變數名;其次,p前面有個*,說明這個變數p是乙個指標變數;最後,*p前面有乙個int,說明這個指標變數p所指向的是乙個int型資料。
char*(
*(*pfunc)
)(char*,
char
*)類似的複雜表示式,可以用相同的分析方法得到
分析: pfunc 相當於 p ,他前面有乙個 * ,說明愛他就是一盒指標變數, 然後剩下的一堆都是修飾他的
第二種:首先看到p,這個是變數名;其次,看到p前面的int *,把int *作為乙個整體來理解,
int *是一種型別(復合型別),該型別表示一種指向int型資料的指標。
總結:第二種方法便於理解,但是不夠本質;建議用第一種方法來理解,因為這種思維過程可以幫我們理解更複雜的表示式。
陣列名:做右值時,陣列名表示陣列的首元素首位址,因此可以直接賦值給指標。
如果有 int a[5];
則 a和&a[0]都表示陣列首元素a[0]的首位址。
而&a則表示陣列的首位址。
根據以上,我們知道可以用乙個指標指向陣列的第乙個元素,這樣就可以用間接訪問的方式去逐個訪問陣列中各個元素。這樣訪問陣列就有了兩種方式。
有 int a[5]
;int
*p; p = a;
陣列的方式依次訪問:a[
0] a[
1] a[
2] a[
3] a[4]
指標的方式依次訪問:*p *
(p+1)*
(p+2)*
(p+3)*
(p+4
)
指標本身也是一種變數,因此也可以進行運算。但是因為指標變數本身存的是某個其他變數的位址值,因此該值進行* / %等運算是無意義的。兩個指標變數相加本身也無意義,相減有意義。指標變數+1,-1是有意義的。+1就代表指標所指向的格仔向後挪一格,-1代表指標所指向的格仔向前挪一格。
*p++就相當於*
(p++
),p先與++結合,然後p++整體再與*結合。
*p++
解析:++先跟p結合,但是因為++後置的時候,本身含義就是先運算後增加1(運算指的是p++整體與前面的進行運算;增加1指的是p+1),所以實際上p++符號整體對外表現的值是*p的值,運算完成後p再加1.
所以
*p++等同於:*p; p +=1
;*++p等同於 p +=1
;*p;
(
*p)++,使用(
)強制將*與p結合,只能先計算*p,然後對*p整體的值++。++(
*p),先*p取值,再前置++,該值+
1後作為整個表示式的值。
總結:++符號和指標結合,總共有以上4種情況。–與++的情況很類似。
int add(int a, int b) 函式傳參使用了int型數,本身是數值型別。實際呼叫該函式時,實參將自己拷貝乙份,並將拷貝傳遞給形參進行運算。 實參自己實際是不參與的。
所以,在函式中,是沒法改變實參本身的。
#include
intswap
(int a,
int b)
;int
main
(int argc,
char
**ar**)
intswap
(int a,
int b)
編譯結果:
before swap: x =
5, y =
3 after swap: x =
5, y =
3
#include
intmain
(void
) 要完成的功能:在函式內部,交換a和b的值
測試結果:交換成功。
原因:c語言函式呼叫時,一直都是傳值呼叫。也就是說實際傳遞的一直都是實參的拷貝
但是本函式中的形參和實參都並不是x和y,而是x和y的位址值。這樣,讓我們在函式中
通過間接訪問*p的方式,在函式內訪問到了函式外面呼叫時的實參。
intswap_pointer
(int
*p1,
int*p2)
編譯結果:
before swap: x =
5, y =
3 after swap: x =
3, y =
5
C語言基礎(9) 指標
指標與陣列 指標變數定義的一般形式 型別 指標變數名符號 在變數宣告語句中是指標型別說明符,前面的型別用於宣告指標可以指向哪種型別的變數,稱為指標的基型別。例如 int pt1 int pt2 int a 520 int pt a 用 運算子可以獲取指標變數所指向變數的內容,該運算子被稱為指標變數間...
C語言基礎學習(7) 指標
include void interchange2 int int void interchange1 int u,int v int main void void interchange1 int u,int v void interchange2 int u,int v 函式1只是在形參交換資料...
C語言基礎四 指標
指標表示乙個位址,什麼型別的指標就應該指向什麼型別的記憶體空間,例如int 型別的指標就應該指向乙個int型別的空間。int a 7 int p null 指標的定義 p a 指標的繫結 p 5 指標的解引用對於同型別指標p1,p2,一般有這幾種運算 p1 3,p1 3,p2 p1 int a 5 ...