二、二級指標
三、指標函式和函式指標
四、和指標有關的傳參
區別:
指標可以申請一塊記憶體當作陣列使用相同點:陣列直接定義使用
#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 用 運算子可以獲取指標變數所指向變數的內容,該運算子被稱為指標變數間...