C語言大世界 08指標型別 函式指標 上

2021-06-27 10:52:10 字數 4014 閱讀 2486

俗話說(當然是我說的哈):一zhi在手,要啥沒有?"zhi"當然不是博主小學文化出來賣弄拼音,只不過這個zhi還真不好確定是哪個,我說指吧,你說應該址,反之亦然。因此只好退而求其次,用zhi代替。有人要求來個函式指標的話題,雖說平常不怎麼涉及(或許是你接觸的不多),當我在看linux核心原始碼時候,兩字「頭疼」,既然是個大專案,肯定少不了眾多檔案,每個檔案中必然有很多函式,再然後就是函式的宣告可不像我們平常那樣過家家。因此,今天**下函式指標,只為充實下自己(為以後裝b鋪墊下)。內容正在編寫中。

博主申明:本人

學識淺薄不能面面俱到

#include "stdio.h"

int main(void)

以下給出幾個例子來簡單說明,我一直都強調誰是主角,一開始就應該讓她佔據

我們的眼球,因此你最應該看到的是函式名字。

例如:

01.void func(void){}

函式名func,函式傳入引數列表沒有,函式返回型別void,即沒有,這個沒有呢,

不是說我這個函式不幹事了,恰恰相反,或許她肩負著巨大的任務,只不過她

甚是低調,不對外返回資料。因此函式內容我們可以來意淫下,比如列印個

"hello world",比如我對乙個資料+ - * /,(喂!不是說沒有資料傳入嗎!),施主,

咱們可以來全域性變數嘛。

02.int func(int para1,char para2...){}

函式名func,函式傳入引數para1,char para2,那麼...可沒法實現,這裡我只不

過想告訴你,她心胸寬廣,可以容納多個引數。函式返回型別int,也許她對傳入的

para1和para2撮合下 ,誕生了乙個新產物,然後返回。

03.int* func(int *para1,char *para2...){}

函式名func,函式傳入引數 都是指標,函式返回型別,這個可就厲害了!指向int

型別的指標,別激動,我說的厲害是要通過對比才方能顯現,就好比秋香要在一堆

如花中才能襯托其傾國之容。這個先按下不表

*/ //demo1:

/* 主題是函式,主角是什麼? 指標!函式指標!

以下內容,為求正確性以及易懂性,能列印的盡量列印出來

首先搬出剛才那個"厲害的東西" 非常抱歉,函式定義只能放在主函式main後面了

*/ int *func(int a ,int b);

/* 嗯這宣告到底是函式指標呢,還是指標函式。這個確實是個傷腦筋的問題,你要知道

我在上講中提到了,指標可以指向其他型別,包括基本的int float char ...當然也包括

資料型別 例如int (*pt)[3]; 那麼現在要提出另外乙個型別,函式!那麼上面這個申明

是嗎?

想要回答這個問題,我們需要知道一些操作符的優先順序,該死的,有點印象,趕快去

查查。please 打住,難道你想把優先順序看幾遍,背熟了再來解決問題?時間不允許哦。

我來分析:

抓住主角: func

然後: 是 *func? 還是 func()?,()括號說:"抱歉 '*',雖然你我同為func的左右

,但是我優先順序高,我先和他一起結合了(請勿yy)"。那麼 func() 很熟悉不是嗎?

嗯,到現在我已經知道func 是個函式了.....

接著:好吧,'*'表示我終於可以和func在一起了,但是!對不起,func已經定了,來

不及了。因此,現在剩下的情況是這樣的 int *;

最後:int * ,這或許就是宿命,他們結合在了一起 作為了函式返回型別,是乙個指向

int型別的指標。你也知道,作為乙個有返回型別的函式,是有節操的,就如宣告的

時候一樣,int func() 必須要返回乙個int整數 char func()要函式乙個返回乙個

char字元,那麼int* func()就要返回乙個 int* 指標啦!

*/ printf("the func address is 0x%x\n",func);//0x401336

//要知道我們有cpu,但是沒有資料,cpu又能幹嘛呢,至於資料都是儲存在記憶體中,變數是,

//函式自然也是,就好比現在 函式從0x401336這裡開始存起,假如你有乙個指標指向了這裡

//而這個指標型別是這個函式的話,那麼恭喜你,你擁有了她。

//demo2:

/* 我想是時候開始扯我們的函式指標了(前面那個是指標函式 別搞錯了,注意修飾詞!!)

舉個例子哈

*/ int add(int a,int b);

int sub(int a,int b);

//hey 別鬧 說好的函式指標呢....怎麼來四則運算了? ok!函式指標駕到》

int (*operate)(int a,int b);

/* 這玩樣是函式指標? 和 int* operate(int a ,int b) 看著眼熟啊、也許吧.....

可是分析之後,你就不這麼認為了

首先主角: operate 是變數名。

其次:貌似這次()沒法和*爭寵了 因為這次她快了一步,和operate結合一起

也就是 *operate,這個簡單,是乙個指標,至於這是乙個指向什麼的指標,暫時

我無從得知。

在看下面:都說優先順序高了 右邊的(int a ,int b)看到嗎,忽略裡面的引數列表,

暫時當做純(),那麼和指標一結合,我們恍然大霧(*operate)();是乙個指向函式

的指標,至於這個函式是什麼型別,比如返回什麼型別啦,傳入的引數列表(這個知道

int a,int b); 等等那最前面的是int該怎麼解釋?我只想說int作為乙個函式的

返回型別只不過是函式的一部分,

好了 其實結果已經出來了 那就是operate 是乙個函式指標,她指向的函式型別是

int (*)(int a,int b) 也就是傳入的引數是int a,int b,返回的是乙個int整數。

*/ //請注意!函式指標,函式? 指標? 前者是修飾,我去掉修飾,指標是什麼?變數!那麼假如

/* int (*operate)(int a,int b)

*/ //你可以放到下面試試,這是乙個變數啊,絕逼會出現乙個錯誤 invalid function declaration

//不會再改變了 而函式指標是乙個變數,只要型別匹配我就可以指向那個add的地方

//先列印下函式位址

printf("the add function addr is 0x%x\n",add);

printf("the sub function addr is 0x%x\n",sub);

//現在該我們的函式指標出馬了 由於型別匹配 因此 可以那麼指!

operate = add;

printf("the operate addr is 0x%x\n",operate);

printf("use operate as add func the rst is %d\n",operate(1,2));

operate = sub;

printf("the operate addr is 0x%x\n",operate);

printf("use operate as sub func the rst is %d\n",operate(1,2));

//很好用嘛!位址呢 是一樣一樣的 操作呢是可以進行的

/* 函式指標呢 我想可以那麼用 比如製作乙個計算器! "+ - * / "4種操作符

我已經獲取到了操作符 以及兩個運算元x y

switch(operator)

operate(x,y); //呼叫操作

這樣 是不是有點意思 當然你絕逼可以直接在上面switch中就進行加減乘除操作、

*/ //全是基礎的東西 這只是上級 我馬上在中集給出乙個有趣的例子

} //demo1

int *func(int a ,int b)

//demo2

int add(int a,int b)

int sub(int a,int b)

C語言(九) 指標(3)指標與const

表示一旦得到了某個變數的位址,不能再指向其他變數 int i 0 int const q i q是 const q 20 ok q error表示不能通過指標去修改這個變數 int i 0 int j const int p i const int p 等同於 int const p p 20 er...

c語言010 指標

include int main 注意 p前面的型別決定了取位址的能力。如果是int型別的,就說明在32平台下可以取址能力是4個位元組。2 指標的本質就是儲存乙個位址,在32位的系統上,所有程式的記憶體位址都用4個位元組表示,所以不管是什麼型別的指標。指標大小都佔4個位元組。稱之為間接引用,表示根據...

2018 5 1指標c語言

是人類的,人類 肯定是給我隨便用,不然 抽他。include include pragma pack push,1 struct s1 a char ch pragma pack pop static void alloc void static void fill void p static vo...