C語言基礎學習 9 指標

2021-10-08 12:11:49 字數 3605 閱讀 8894

指標全稱是指標變數,其實質是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 ...