1. 程式人生 > >C語言之指向函式的指標

C語言之指向函式的指標

這裡介紹了關於指向一維陣列的指標, 相關內容可以參考該文.
本文將簡要介紹指向函式的指標.

  • 如何宣告一個指向函式的指標?
void print(int num); // 宣告函式
void (*funptr)(int) = print; // 宣告指向函式的指標, 該函式接受一個int引數, 返回void, 並用print函式的地址初始化
  • 函式指標型別的通用形式: 返回型別 (* 可選限定符) (形參列表)
    比如 funptr 的型別是 void (*) (int) , 其中可選的限定符有 constvolatile

  • 函式名是什麼?
    函式名被使用時總是由編譯器將它轉換為該函式型別的函式指標, 比如 print

    的型別就是 void () (int) 所以可以用 print 初始化 funptr. 當使用 & 時只是顯示的說明了編譯器的轉換操作, 所以 print&print 都是 void () (int) 型別.

    注意: 函式名與陣列名在這點上的區別.

  • 如何通過指向函式的指標呼叫函式?
    事實上有三種呼叫方式可選:

print(10); // (1) 使用函式名呼叫print函式
(*funptr)(10); // (2) 使用指向函式指標解引呼叫print函式`
funptr(10); // (3) 使用指向函式指標直接呼叫print函式

(1)的執行過程是函式名print首先被轉換成一個指向函式的指標, 該指標指向print函式在記憶體中的位置, 然後呼叫操作符呼叫print函式, 執行開始於這個位置的程式碼.
(2)的執行過程是解引操作將funptr轉換為函式名, 然後執行(1)的操作, 顯然解引操作不是必需的, 函式呼叫操作符需要的是一個指向函式的指標.
(3)的執行過程是函式呼叫操作符直接呼叫函式.

  • 宣告 “指向函式的指標” 的指標
    指向函式的指標本質上仍然是一種指標, 我們可以按照二級指標宣告指向它的指標.
void print(int num); // 宣告函式
void (*funptr)(int) = &print; // 宣告指向函式的指標
void (**funpptr)(int) = &funptr; // 宣告 "指向函式的指標" 的指標
(**funpptr)(10); // 通過二級指標呼叫print
  • 宣告元素型別為 “指向函式的指標” 的陣列
    同樣, 如果具有多個型別一樣的指向函式的指標, 我們可以將它們放在一個數組中.
void print(int
num); // 宣告函式 void (*funptr)(int) = &print; // 宣告指向函式的指標 void (*funptrarray[])(int) = funptr; // 宣告元素型別為"指向函式的指標"的陣列, 陣列大小為1, funptrarray[0]用funptr初始化 (*funptrarray[0])(10); // 呼叫print (**funptrarray)(10); // 等價的呼叫print

這種技巧也稱為轉移表.

相關推薦

C語言指向函式指標

這裡介紹了關於指向一維陣列的指標, 相關內容可以參考該文. 本文將簡要介紹指向函式的指標. 如何宣告一個指向函式的指標? void print(int num); // 宣告函式 voi

嵌入式開發C語言指向陣列的指標

一維陣列和指標: 對於一位陣列和指標是很好理解的: 一維陣列名: 對於這樣的一維陣列:int a[5]; a作為陣列名就是我們陣列的首地址, a是一個地址常量 . 首先說說常量和變數的關係, 對於變數來說, 用箱子去比喻再好不過了, 宣告一個

C語言指向一維陣列的指標

int array[5] = {1, 2, 3, 4, 5}; // 定義陣列 int *intptr = array; // 定義指向陣列元素的指標 int (*arrayptr)[5] = &array; // 定義指向陣列的指標 上述三條語句分別

C語言指向函式指標

1 定義和呼叫程式在編譯後,每個函式都有一個首地址(也就是函式第一條指令的地址),這個地址稱為函式的指標。可以定義指向函式的指標變數,使用指標變數間接呼叫函式。下面通過一個簡單的例子來說明:float max(float x,float y){return x>y?x:y;}float min(f

C語言通過函式引數修改實參

#include <stdio.h> int x = 1; int y = 2; int *p = &x; void modify_1(int a) { a = 11;

C語言:理解函式指標陣列和定義

函式指標陣列和定義 陣列是一個存放相同型別資料的儲存空間,那我們已經學習了指標陣列,比如:     int *arr[10];//陣列的每個元素是int* 那要把函式的地址存到一個數組中,那這個陣列就叫函式指標陣列,那函式指標的陣列如何定義呢?   int (

C語言strrchr函式

【FROM MSDN && 百科】 原型:char *strrchr(const char *str, char c); #include<string.h> 找一個字元c在另一個字串str中末次出現的位置(也就是從str的右側開始查詢字

C語言陣列型函式指標,替代switch case結構

#include <stdio.h> typedef void (*KeyEvent)(void); KeyEvent pKey_Func[100]; void pFunc0(void) { printf(“Hello Kitty\n”); } void pFun

C語言:通過函式指標和引數來呼叫函式

C語言可以通過函式指標來呼叫函式,可以將要呼叫的函式名儲存到陣列中。這樣我們可以通過引數來直接呼叫函數了。 #include <stdio.h> #define FUNCTIONSIZE 2 typedef unsigned char uint8_t;

C語言利用函式交換兩個數的值

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> void Swap(int *px,int *py) { int tmp = *p

C語言中的函式指標

Q:函式指標是什麼意思? A:例如一個指標指向int變數,那麼這個指標就是儲存這個int變數在記憶體中儲存的地址。同理,函式指標就是指向一個函式的指標,那麼這個指標就是儲存這個函式在記憶體中儲存的起始

C語言memcpy函式

【FROM MSDN && 百科】 原型:  void *memcpy(void *dest, const void *src, size_t n); #include<string.h> 功能:從源src所指的記憶體地址的起始位置開始拷

C語言隨機數函式( rand() )的使用方法

在程式設計中,難免會使用到隨機值函式,其原理與語法大多類似,接下來以C語言為例介紹其隨機值函式 rand() 用法。 原理 引用百度百科,首先,需要包含標頭檔案: #include <stdlib.h> rand()函式是按

C語言--umask()函式

此函式的主要作用是在建立檔案時設定或者遮蔽掉檔案的一些許可權。一般與open()函式配合使用。 umask(設定建立新檔案時的許可權遮罩) 相關函式 creat,open 表頭檔案: sys/types.h s

C語言strcat函式

【FROM MSDN && 百科】 原型:char *strcat(char *dest,const char *src); #include<string.h> Append a string. 把src所指字串新增到dest結尾處(

C語言strstr函式

【FROM MSDN && 百科】 原型:char *strstr(const char *str1, const char *str2); #include<string.h> 找出str2字串在str1字串中第一次出現的位置(不包括

C語言函式的模擬與使用

  C語言之庫函式的模擬與使用   在我們學習C語言的過程中,難免會遇到這樣的一種情況: 我們通常實現一個功能的時候,費盡心血的寫出來,卻有著滿滿的錯,這時卻有人來告訴你說:這個功能可以用相應的庫函式來實現。 這時你的心裡充滿著***。但這並不算壞事,至少加深了你對它的認識與記憶。 &nb

c語言指向指標(函式)的指標學習

1.指向指標指標的指標 定義形式:[儲存型別] 型別名 **指標名; int **p1; int *p2; int i=3; p2=&i; p1=&p2; **p1=5; 解析圖 把i的地址賦給p2,再把p2的地址賦給p1,p1---->p2------

C語言函式指標陣列和指向函式指標陣列的指標

一、函式指標陣列1.1函式指標陣列的宣告      函式指標陣列的宣告如下,所謂函式指標陣列就是在之前的函式指標的基礎上增加了[],由於[]的優先順序高於*,故 pf先與[]結合,說明它是一個數組,再與*結合說明陣列中的元素的型別是指標,再看後面的引數列表,說明每一個指標都指

C語言指標指標陣列、陣列指標函式指標、二重指標、泛型函式

指標陣列:數組裡面的每個元素都是指標;char*  array[]={"hello","world","ooo"};理解:陣列中有三個元素,每個元素都是char*型別,陣列中儲存的是三個字串的首地址;64位的作業系統中指標佔8個位元組;32位作業系統指標佔4個位元組;注意:指