C語言超詳細講解函數指針的運用
前言
前面我們學習了各種各樣的指針類型,有些指針可以說是稀奇百怪,特別是函數指針,有些朋友可能覺得,函數指針有些多余,調用函數為什么要用指針調用,直接調用不好嗎?
接下來我們從具體的實例來回答同學們的問題,加深對函數指針的理解。
計算器的例子
接下來我們寫一個簡單的計算器程序,完成不同的計算功能比如加減乘除:
#include <stdio.h> //相加函數 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; } int main() { int x, y; int input = 1; int ret = 0; do { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("請選擇:"); scanf("%d", &input); switch (input) { case 1: printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = add(x, y); printf("ret = %d\n", ret); break; case 2: printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = sub(x, y); printf("ret = %d\n", ret); break; case 3: printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = mul(x, y); printf("ret = %d\n", ret); break; case 4: printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret); break; case 0: printf("退出程序\n"); break; default: printf("選擇錯誤\n"); break; } } while (input); return 0; }
我們很明顯地感覺到,是不是代碼實在是有些繁瑣,不同的功能之間有著高度的相似性,比如說進去之后都需要對x和y賦值,最后又都需要打印一個返回值,但在當前的框架下似乎又很難進行簡化。
這時,我們就進入了今天的主題,如何使用函數指針來給程序瘦瘦身。
回調函數
我們先來看看使用回調函數修改之后的程序。
首先我們在原來的基礎上構造了一個新的函數,函數的形參就是一個函數指針的形式:
//使用回調函數 void cumulate_numbers(int (*cumulate)(int, int)) { int x, y; int ret = 0; printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = cumulate(x, y); printf("ret = %d\n", ret); }
然后我們來看看調用函數方面有什么改變:
scanf("%d", &input); switch (input) { case 1: cumulate_numbers(add); break; case 2: cumulate_numbers(sub); break; case 3: cumulate_numbers(mul); break; case 4: cumulate_numbers(div); break; case 0: printf("退出程序\n"); break; default: printf("選擇錯誤\n"); break; } } while (input);
我們可以清楚地認識到每次實現(xiàn)功能,通過函數指針使一開始的
printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret);
轉變?yōu)橹灰{用一個函數,一行代碼就搞定了。我們這些功能比較簡單,功能的數量也不多,使四行代碼變成了一行,如果功能復雜一些,功能的數量再多一些,對于代碼的簡化量還是非??捎^的。
那么接下來能否讓我們更進一步呢?
轉移表
我們再來看看更加簡潔的代碼:
int (*p[5])(int, int) = { 0, add, sub, mul, div }; do { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("請選擇:"); scanf("%d", &input); if ((input <= 4 && input >= 1)) { printf("輸入操作數:"); scanf("%d %d", &x, &y); ret = (*p[input])(x, y); printf("ret = %d\n", ret); } else if(input != 0) printf("輸入有誤\n"); } while (input);
運用了指針數組,這個方法叫做轉移表。
到此這篇關于C語言超詳細講解函數指針的運用的文章就介紹到這了,更多相關C語言函數指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(67.二進制數相加)
這篇文章主要介紹了C++實現(xiàn)LeetCode(67.二進制數相加),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07