指標高階詳解2

2021-10-14 07:56:26 字數 2007 閱讀 1492

一.函式指標

首先看一段**

#include

void

test()

intmain()

輸出的是兩個位址,這兩個位址是test函式的位址,那我們的函式位址想要儲存起來,怎麼儲存?

首先,能夠儲存位址,就需要乙個指向函式的指標變數,即函式指標

void

(*fun1)()

;

fun1先與指標結合,說明fun1是指標,指標指向的函式無引數,返回值型別為void

下面看兩段有趣的**

(*(

void(*

)())

0)()

把0強制轉換成void(*)()型別的函式指標,0就是乙個函式的位址,解引用後呼叫0位址處的函式

void(*

signal

(int

,void(*

)(int)))

(int

)

首先signal是乙個函式宣告,函式有兩個引數,乙個是整型,乙個函式指標型別

函式的返回值型別是將函式名以及引數去掉,剩下的就是返回值型別,該函式的返回值型別也是乙個函式指標型別

這段**有些複雜,我們可以將其簡化

typedef

void

(* pfun_t)

(int);

pfun_t signal

(int

,pfun_t)

;

函式指標的使用

#include

intadd

(int x,

int y)

intmain()

二.函式指標陣列我們已經學習過了指標陣列,比如int*arr[10] .

如果把乙個函式的位址存到陣列裡,這個陣列就叫做函式指標陣列,定義方式如下:

int

(*pa[10]

)(int,

int)

;

pa先與結合,說明pa是個陣列,陣列的內容是什麼呢?是int(*)(int ,int)型別的函式指標

思考:

char

*my_strcpy

(char

*dest,

const

char

*src)

;

1 . 寫乙個函式指標,能夠指向my_strcpy

2 . 寫乙個函式指標陣列,能夠存放4個my_strcpy函式的位址

char*(

*p)(

char*,

const

char*)

;

char*(

*p[4])

(char*,

const

char*)

;

函式指標陣列用途:轉移表例:計算器

#include

intadd

(int x,

int y)

intsub

(int x,

int y)

intmul

(int x,

int y)

intdiv

(int x,

int y)

intmain()

;while

(input)

else

printf

("輸入有誤\n");

printf

("ret=%d\n"

, ret);}

}

未完待續…

CSS高階詳解

css注意巢狀規則 補充 僅需要了解 初始化css 需要了解 雅虎工程師提供的css初始化示例 body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blo...

C高階 詳解編譯 鏈結

被隱藏了的過程 現如今在流行的整合開發環境下我們很少需要關注編譯和鏈結的過程,而隱藏在程式執行期間的過程可不簡單,即使使用命令列來編譯乙個源 檔案,簡單的一句 gcc hello.c 命令就包含了非常複雜的過程。1 include3 int main 4 在linux系統下使用gcc編譯程式時只須簡...

大小端詳解

前言 本篇文章介紹資料儲存的大小端模式,大小端模式起源於吃雞蛋的典故。首先,我們看一下資料在記憶體是怎麼儲存的 從上邊我們可以看出a b在計算機中儲存的是補碼,但是順序卻倒著的,這實際上就是小端儲存 大端儲存模式 是指資料的低位位元組序儲存在記憶體的高位址中,而資料的高位位元組序儲存在記憶體的低位址...