俗話說(當然是我說的哈):一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...