根據《c語言深度解析》
二級指標
void getmemory(char** p,intnum)
int main()
注意main函式傳參是傳的&str,傳入到函式的是str的位址,是乙個值,不是str的拷貝,而
*p就相當於*(&str)也就是str本身,所以經過這個函式,str的值被改變了,那麼*str指向的就是新申請的堆記憶體的位址空間。
函式指標:
#include
#include
char* fun(char* p1,char* p2)
else
}int main()
pf不是乙個函式名,而是乙個指標,這個指標指向的是返回值為char*的函式,使用的時候,需要通過
*pf來使用。
注意差別:
a),char* (*fun1)(char* p1,char* p2);//fun1函式指標
b),char* *fun2(char* p1,char* p2);//fun2位函式名,返回值為二級指標
c),char* fun3(char* p1,char* p2);//fun3也是函式名,返回的是一級指標
理解*(int *)&p:
void function()
int main()
這是在幹什麼?*(int*)&p=(int)function;表示什麼意思?
先看void (*p)();
意思是定義了乙個指標,指向乙個返回值和引數都為void 型別的函式。
那麼&p就是取這個指標變數本身所在的位址,
(int*)&p 表示將位址強制轉換成指向 int 型別資料的指標
(int )function表示將function()函式的入口位址轉化為int型資料
那麼*(int*)&p=(int)function;這句話的意思就是將function()函式的位址賦給指標變數p,
(*p)();表示呼叫這個函式。
使用函式指標的好處在於, 可以將實現同一功能的多個模組統一起來標識, 這樣一來更
容易後期的維護,系統結構更加清晰。或者歸納為:便於分層設計、利於系統抽象、降低耦
合度以及使介面與實現分開。
不成魔不能活:
(*(void(*) ())0)();檢視這個例子
按照結合的優先順序:
void(*)()是乙個函式指標,指向的是乙個引數和返回值都為void型別的函式,
void(*)()0,表示將位址0強制轉換為函式指標型別,0就是乙個位址,也就是說有乙個函式存在以0開頭的一段位址中。
(*(void(*) ())0)();意思就是呼叫存放在0位址處的返回值和引數都為void型別的函式。
那麼下面這句話也好理解:
(*(char**(*)(char**,char**))0)( char**,char**);
函式指標陣列:存放指向函式的指標的陣列
char* (*pf[3])(char* p);
那麼這裡面的pf不是指標,而是乙個陣列名,如果想要陣列,那麼就需要在整體加上*,也就是
char* (*(*pf)[3])(char* p);這個稱為
函式指標陣列的指標
經典指定程式的執行位置的方法,函式指標法
typedef void (lpfuntion*)();
lpfunction lpreset = (lpfunction)0xff0000f0;
lpreset();
二級指標和指標引用函式傳參(C )
在函式的使用過程中,我們都明白傳值和傳引用會使實參的值發生改變。那麼能夠通過傳指標改變指標所指向的位址嗎?在解決這個問題之前,也許我們應該先了解指標非常容易混淆的三個屬性 指標變數位址 p 指標變數指向的位址 p,儲存資料的位址 指標變數指向的位址的值 p 當我們將指標變數與其它變數比較之後就會發現...
二級指標和指標引用函式傳參(C )
在函式的使用過程中,我們都明白傳值和傳引用會使實參的值發生改變。那麼能夠通過傳指標改變指標所指向的位址嗎?在解決這個問題之前,也許我們應該先了解指標非常容易混淆的三個屬性 指標變數位址 p 指標變數指向的位址 p,儲存資料的位址 指標變數指向的位址的值 p 當我們將指標變數與其它變數比較之後就會發現...
二級指標,指向指標的指標
test 函式的語句getmemory str,200 並沒有使str 獲得期望的記憶體,str 依舊是null,為什麼?指標傳遞 void getmemory char p,int num void test void 解釋 毛病出在函式getmemory 中,編譯器總是要為函式的每個引數製作臨時...