C語言基礎 七 指標(二)

2021-10-01 03:49:33 字數 4390 閱讀 2380

二、二級指標

三、指標函式和函式指標

四、和指標有關的傳參

區別:

指標可以申請一塊記憶體當作陣列使用

陣列直接定義使用

相同點

#include

intmain()

;int

*temp = arr;

//arr[1]和*(arr+1)等效

printf

("arr[1]:%d\n*(temp+1):%d",*

(arr +1)

,temp[1]

);return0;

}

不同點

注意

在解釋指標陣列和陣列指標之前先來解釋下陣列的儲存結構

//定義乙個二維陣列

int a[3]

[4]=

,,};

那麼它的儲存結構如下圖:

a[0]是a[ 0 ] [ 0 ]的位址,也是a陣列的首位址

同理,

,a[2]是a[ 2 ] [ 0 ]的位址

指標陣列

指標陣列:存放指標的陣列本質是陣列,陣列元素是指標

int

* arr[3]

;//指標陣列 10個int*

#include

intmain()

,,};

int*p[3]

;for

(int i=

0;i<

3;i++

)//輸出指標陣列指向的陣列

for(

int i =

0; i <

3; i++

)return0;

}

陣列指標
也稱行指標表示方法:*int(p)[n]

陣列指標:指向乙個整型的一維陣列,這個一維陣列的長度是n

#include

intmain()

,,};

int(

*p)[4]

= arr;

//指標陣列指向陣列arr

//列印指標陣列指向的值

for(

int i =

0; i <

3; i++

)getchar()

;return0;

}

在這裡我想解釋下為什麼 *(*

(p + i)

+ j)

) 和 p[i]

[j] 等價;

指標陣列的表示方法:int

(*p)

[n]p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n;

n也可以說是p的步長,也就是說執行p+

1時,p要跨過n個整型資料的長度。

*(p+i)

== p[i]

==&p[i][0

]== arr[i]

==&arr[i][0

](==是等價的意思)*(

*(p + i)

+ j)==*

(p[i]

+ j)

== p[i]

[j]在陣列的儲存結構裡就是第i行的第j個元素

指向指標的指標,稱為二級指標

任何資料都有位址,一級指標的值雖然是位址,但是這個位址做為乙個資料也需要空間來存放,而二級指標就是就是來儲存這個位址的。

二級指標定義和使用

#include

intmain()

列印結果:

&a:

000000b0cb1ef964

p:000000b0cb1ef964

*pp:

000000b0cb1ef964

**pp:

10

二級指標的一次解引用 *pp    得到所指向一級指標的位址,也就是p的值

二級指標的兩次解引用 *

*pp 得到所指向一級指標指向的值 也就是a的值

二級指標和指標陣列

二級指標可以直接訪問二維陣列嗎?答案當然是不行的,那麼如何訪問二維陣列呢?

通過指標陣列間接訪問陣列

#include

intmain()

,,};

int*p[3]

;for

(int i =

0; i <

3; i++

)int

**pp = p;

//二級指標指向指標p

for(

int i =

0; i <

3; i++

)return0;

}

指標函式
返回值為指標的函式,本質是乙個函式,而該函式的返回值是乙個指標

例如malloc() 函式,或者自定義的函式如:

int

*add

(int x,

int y)

;

所謂的指標函式也沒什麼特別的,和普通函式相比就是指標函式返回乙個指標

函式指標

指向函式的指標

int

(*p)

(int x,

int y)

;

#include

intadd

(int x,

int y)

intmain()

根據傳參型別分類

//函式原型

void

fun(

int x)

;//函式呼叫

fun(a)

;

//函式原型

void

fun(

int* p)

;//函式呼叫

fun(

&a);

一維陣列:int arr[3];

//函式原型

void

fun(

int* p)

;void

fun(

int arr)

;//推薦這種,讓人一看就知道你要傳的是陣列

//函式呼叫

fun(arr)

;

二維陣列:int arr[3] [3];

//函式原型

void

fun(

int(

*p)[3]

);void

fun(

int[

3]);

//行省略,列不能省略

//函式呼叫

fun(arr)

;

指標陣列:int*p[3];

//函式原型

void

fun(

int* p[3]

);void

fun(

int*

* p)

;//函式呼叫

fun(p)

;

函式名:

#include

void

add(

)void

fun(

void

(*p)()

)int

main()

可以思考下為什麼要把乙個函式的位址作為引數傳遞給另乙個函式,要知道在c語言中,乙個函式內部是可以直接呼叫其他函式的,既然可以直接呼叫,為什麼還要用這麼麻煩的辦法去把函式當做引數來傳遞呢。

c語言基礎(二)指標篇

定義乙個int型別的變數i int i 10 定義乙個int型別的一級指標變數 int p 把i對應的位址賦給p變數 p i 指標取值 p 把p變數對應的位址的值取出來 printf p d p 首先我們定義的指標變數p,其實p就是用來存放位址的,我們把i的位址賦給p,那麼p的值其實就是i的位址,p...

C語言基礎四 指標

指標表示乙個位址,什麼型別的指標就應該指向什麼型別的記憶體空間,例如int 型別的指標就應該指向乙個int型別的空間。int a 7 int p null 指標的定義 p a 指標的繫結 p 5 指標的解引用對於同型別指標p1,p2,一般有這幾種運算 p1 3,p1 3,p2 p1 int a 5 ...

C語言基礎(9) 指標

指標與陣列 指標變數定義的一般形式 型別 指標變數名符號 在變數宣告語句中是指標型別說明符,前面的型別用於宣告指標可以指向哪種型別的變數,稱為指標的基型別。例如 int pt1 int pt2 int a 520 int pt a 用 運算子可以獲取指標變數所指向變數的內容,該運算子被稱為指標變數間...