文章程式碼顯示

2018年2月13日 星期二

《筆記》C語言 - 08_1:函式指標與 typedef

函式指標與 typedef

typedef 配合函式指標的使用可以大大的簡化程式碼,藉由創造出一個新的數據型態可以讓程式碼較為整潔

首先我們用以下的例子來進行說明

#include "stdio.h"

int add(int a, int b) {
  return a + b;
}

int mult(int a, int b) {
  return a * b;
}

int main() {

  // 宣告函式指標變數
  int (*FuncPtr)(int a, int b);

  FuncPtr = add;
  printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);

  FuncPtr = mult;
  printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);

  FuncPtr = add; //若又要再指向 add ,則要再把 FuncPtr 指向 add 一次
  printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
}



若我們在第 14 行宣告了一個函式指標變數,則我們要再次使用 add 函數時,就必須要重新指向 add 函數


#include "stdio.h"

int add(int a, int b) {
  return a + b;
}

int mult(int a, int b) {
  return a * b;
}

int main() {

  // 宣告函式指標變數
  int (*FuncPtr)(int a, int b);
  // 宣告另一個函式指標變數
  int (*FuncPtr_1)(int a, int b);

  FuncPtr = add;
  printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);

  FuncPtr_1 = mult;
  printf("FuncPtr_1(3,5) = %d, function address = %p \n", FuncPtr_1(3,5) ,FuncPtr_1);

  printf("FuncPtr(3,5) = %d, function address = %p \n", FuncPtr(3,5) ,FuncPtr);
}



當然,若我們再宣告一個函式指標變數 int (*FuncPtr_1)(int a, int b); 是可以解決必須重新指向的問題,但這樣的作法不甚好,若有很多不同的函數就必須要很多的函式指標變數。

使用 typedef 是更好的選擇

#include "stdio.h"

int add(int a, int b) {
  return a + b;
}

int mult(int a, int b) {
  return a * b;
}

int main() {

  // 創建一個新的數據型態
  typedef int (*FuncPtr)(int a, int b);

  FuncPtr FuncPtr_add = add;
  FuncPtr FuncPtr_mult = mult;


  printf("FuncPtr_add(3,5) = %d, function address = %p \n", FuncPtr_add(3,5) ,FuncPtr_add);

  printf("FuncPtr_mult(3,5) = %d, function address = %p \n", FuncPtr_mult(3,5) ,FuncPtr_mult);

  printf("FuncPtr_add(3,5) = %d, function address = %p \n", FuncPtr_add(3,5) ,FuncPtr_add);
}


我們在第 14 行使用 typedef 創建了一個新的數據型態。

該數據型態名為 FuncPtr ,本質上是一個指標,具有兩個輸入引數一個回傳値。

接著在 16 行(17行同理) 宣告了一個名為 FuncPtr_add 的 FuncPtr 型態 的函式指標變數

並賦予初使値使其指向函數 add


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引