二級指標傳參的解釋和函式指標的理解

2021-07-28 23:43:23 字數 1724 閱讀 3959

根據《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 中,編譯器總是要為函式的每個引數製作臨時...