1. 程式人生 > >函式指標系列:用函式指標呼叫執行函式

函式指標系列:用函式指標呼叫執行函式

函式指標的定義

若在程式中定義了一個函式,在程式編譯的時候,編譯系統會給這段函式程式碼分配一段記憶體空間,這段記憶體空間的起始地址稱為這個函式的指標(函式名實質就是函式這段程式碼的起始地址)。

定義和使用指向函式的指標變數

定義指向函式的指標變數的一般形式:

型別名(*指標變數)(函式引數表列)

這裡的“型別名”是指函式返回值的型別;
由於優先順序的關係“ * 指標變數名”要用圓括號括起來,若不括起來則變成 “型別名 *指標變數(函式引數表列)”,這樣則定義了一個函式,該函式返回一個型別指標變數。

形式舉例:
int(*p)(int,int);
定義p是一個指向函式的指標變數,它指向含有兩個int型引數的函式,並且返回一個int型的值。

函式舉例:

 /* 
  * 模擬一個計算器,加減乘除
  * 返回值是int型別 
  */
#include<stdio.h>

/*函數宣告*/
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);

int (*p)(int,int);//宣告函式指標,指向返回值型別為int,有兩個引數型別都是int的函式  

int main(void)
{ 
    int a=0,b=0;
    int result=0;
    char c='0';
    printf
("輸入兩個整數;\n"); scanf("%d %d",&a,&b); printf("請輸入要進行的運算:+ - * /\n"); do { scanf("%c",&c); }while(c=='\n'); switch(c) { case '+': p=add;break; case '-': p=sub;break; case '*': p=mul;break; case '/'
: p=div;break; default: p=NULL;break; } result=(*p)(a,b); printf("%d %c %d = %d\n",a,c,b,result); return 0; } int add(int a,int b) { return a+b; } int sub(int a,int b) { return a-b; } int mul(int a,int b) { return a*b; } int div(int a,int b) { return a/b; }

執行結果如下圖所示:
這裡寫圖片描述

有時候,我們可以用到typedef,因為有時候自定義型別太長,使用typedef給自定義型別重新命名一個簡短的名字。
舉例:

    #include<stdio.h> 

    int max(int a, int b); 
    int min(int a, int b);

    typedef int (*f)(int, int); // 宣告函式指標,指向返回值型別為int,有兩個引數型別都是int的函式  

    int main(void)  
    {  
        int c=0; 
        int d=0; 
        f P1=NULL;
        f P2=NULL;

        P1=max; // 函式指標P1指向求最大值的函式max  
        c=(*P1)(1, 2);      
        printf("The max value is %d \n", c);  

        P2=min; // 函式指標P2指向求最小值的函式min  
        d=(*P2)(1, 2);      
        printf("The min value is %d \n", d); 

        return 0;  
    }  

    int max(int a, int b) 
    {  
        return a > b ? a : b;  
    }  

    int min(int a, int b)
    {  
        return a < b ? a : b;  
    }  

相關推薦

函式指標系列函式指標呼叫執行函式

函式指標的定義 若在程式中定義了一個函式,在程式編譯的時候,編譯系統會給這段函式程式碼分配一段記憶體空間,這段記憶體空間的起始地址稱為這個函式的指標(函式名實質就是函式這段程式碼的起始地址)。 定義和使用指向函式的指標變數 定義指向函式的指標變數的一般

cocos2d-js-v3.0-rc2js繫結呼叫c++函式 1

分享一種簡單的js呼叫c++程式碼的繫結方法、 首先用c++寫一個方法,為了簡便就在CCSprite裡面寫個一個sumTwonum(兩個數相加) 在CCSprite.h裡新增 public:     int sumTwonum(int a,int b); 在CCSprit

CVPR2018行人重識別系列GAN進行資料增強

1.前言 近年CVPR2018錄用了很多person re-id相關論文,本著學習和總結的原則,來對目前行人重識別上最新的方法進行一個總結,由於本人水平有限,對於文章的理解可能存在不全面的地方,我儘可能的對方法進行的歸類,在每個類別下面對相關文章進行簡單介紹,也便於以後自己查閱。 本文主要

PythonPython程式呼叫C/C++編譯的可執行檔案

[TODO] 用python程式呼叫C/C++編譯的可執行檔案 ************************華麗的分割線************************ step1:cppexec.cpp #include <iostream> int ad

指標什麼是指標指標型別,指標運算等等

1.什麼是指標 指標是一個變數,變數裡存的是地址,通過該地址可以找到一塊空間。因此也將該地址形象化稱為指標。 2.為什麼存在指標 (1)指標是為了存放地址,地址是為了標示一塊記憶體空間的。 (2)指標讓記憶體訪問更加方便。 (3)指標的大小在32平臺上是4位元組,在64位平

tornado系列cookie進行使用者驗證

在本節中,我們將建立一個應用,詢問訪客的名字,然後將其儲存在安全cookie中,以便之後取出。後續的請求將認出回客,並展示給她一個定製的頁面。你將學到login_url引數和tornado.web.authenticated裝飾器的相關知識,這將消除在類似應用中經常會涉及到

SpringBoot系列Spring Boot非同步呼叫@Async

在實際開發中,有時候為了及時處理請求和進行響應,我們可能會多工同時執行,或者先處理主任務,也就是非同步呼叫,非同步呼叫的實現有很多,例如多執行緒、定時任務、訊息佇列等, 這一章節,我們就來講講@Async非同步方法呼叫。 一、@Async使用演示 @Async是Spring內建註解,用來處理非同步任務,在Sp

高併發程式設計系列4種常用Java執行緒鎖的特點,效能比較、使用場景

高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景 http://youzhixueyuan.com/4-kinds-of-java-thread-locks.html   在Java併發程式設計中,經常遇到多個執行緒訪問同一個 共享資源 ,這時候作為開發者

Java併發包原始碼學習系列掛起與喚醒執行緒LockSupport工具類

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

Linux基礎IO(cIO庫函式詳細介紹)(IO系統呼叫介面詳細介紹)(兩者關係檔案描述符和檔案指標

目錄 c系統中的庫函式: fopen:開啟檔案 fclose:關閉檔案 fwrite:向檔案寫入一個數據塊 fread:讀寫 fprintf:格式化輸出到一個流/檔案中 fseek:移動/跳轉 到當前 讀取/寫入位置 fgets:獲取字串 fput:把字串寫入到指

C++基礎類與物件(物件呼叫成員函式 this指標)

1.一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候

C++中如果宣告一個物件指標時,會不會呼叫建構函式

C++中如果宣告一個物件指標時沒有分配記憶體,那麼不會呼叫建構函式 一個指標在記憶體中也是有記憶體空間的。 在現在大多數機器上指標都是32位的,也就是4個位元組。 如果你宣告指標。例如,假設A是一個類 A *pa; 這記憶體中會分配4個位元組的空間儲存一個地址。只不過地址是不可以用

指標在主函式中被賦值與在呼叫函式中被賦值的差別

# include <stdio.h> int main() { int a=10; int *p=&a; p=NULL; printf("%d\n",*p); return 0; } 在這個程式中因為將a的地址賦值給指標p

輸入5門學科的成績,編寫程式求其平均分。要求函式完成,科目存放在指標申請的動態空間中。

#include<iostream> using namespace std; double pj(double pa[]);//定義一個計算平均值的函式; int main() { double *pa=new double[5];//分配五個記憶體空間; int i; do

[C++]空的物件指標可以呼叫成員函式

include using namespace std; class A{ public: void func() { cout << "hahaha" << endl; } int m_num = 1; }; int main() { A* ptr = NULL; A obj;

this 指標的地址--呼叫成員函式的所在物件的起始地址

#include<iostream> using namespace std; class Test { int x; public: Test(int a){ x=a; } void get_this(); }; void Test:: get_this() { co

深入理解JavaScript系列(4)立即呼叫函式表示式

javascript 函式function前面的一元操作符, 感嘆號、小括號、一元操作符!()+-|| 看下面內容之前可以先看看上面的文章,總結的非常贊 前言 大家學JavaScript的時候,經常遇到自執行匿名函式的程式碼,今天我們主要就來想想說一下自執行 在詳細

筆記八靜態變數、靜態成員函式函式指標、靜態函式指標

靜態變數 1、靜態變數的儲存方式和生命週期:屬於靜態儲存方式,其儲存空間為記憶體中的靜態資料區,該區域的資料在整個程式的執行期間不會釋放,所以其生命週期為整個程式執行時間段。 2、靜態區域性變數:定義在函式體內的變數。當對靜態區域性變數進行初始化時,只

關於為什麼做一個交換函式指標

在C中函式有兩個引數,分別是形參和實參 形參是自定義的函式所擁有的引數,在自身中可以被使用,自身外不可用,也就是他的作用域是定義它的函式本身 實參是主調函式的引數,在被調函式中不可用 例如: int swap(int a,int b){.......}  int main

C/C++狀態轉移表聯合函式指標陣列實現狀態機FSM

狀態機在工程中使用非常的頻繁,有如下常見的三種實現方法: 1. switch-case 實現,適合簡單的狀態機; 2. 二維狀態表state-event實現,邏輯清晰,但是矩陣通常比較稀疏,而且維護麻煩; 3. 用狀態轉移表stateTransfer Ta