網(wǎng)站首頁 編程語言 正文
一、概念 ? ? ? ?
數(shù)組:一個存放相同類型數(shù)據(jù)的存儲空間。
int arr[10];
//數(shù)組arr的每個元素是int
指針數(shù)組:一個存放指針的數(shù)組。
int* arr[10];
//數(shù)組arr的每個元素是int*
函數(shù)指針:一個指向函數(shù)的指針,一般用函數(shù)名表示。
int Add(int x, int y)
{
return x + y;
}
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[10] = &arr;
//取出數(shù)組的地址,p就是指向數(shù)組arr的指針,數(shù)組中每個元素類型是int,p就是數(shù)組指針
//引出函數(shù)指針的問題
int (*pf)(int, int) = &Add;
//是一個指向函數(shù)的指針 - 存放函數(shù)的地址
需要注意的是,函數(shù)名是函數(shù)的地址,&函數(shù)名還是函數(shù)的地址,在visual stdio編譯環(huán)境下能打印出同一地址。這里的函數(shù)指針pf是指向函數(shù)Add,其中(int, int)表示函數(shù)需要的兩個形參類型是int,函數(shù)返回值類型是int。? ? ? ??
函數(shù)指針數(shù)組:一個存放指針的數(shù)組,其中的指針都指向各自的函數(shù)。
//函數(shù)指針
int (*p)(int, int) = Add;
int (*p)(int, int) = Sub;
//Add和Sub是函數(shù)名,需要傳入的兩個形參和返回值類型都是int
//將上面兩個同類型的函數(shù)指針放入數(shù)組中,得到函數(shù)指針數(shù)組
int (* arr[2]) (int, int) = {Add, Sub};
二、用途
函數(shù)指針數(shù)組的用途:轉(zhuǎn)移表
三、案例:計算器 ?????
(1)基礎(chǔ)代碼編譯:
#include <stdio.h>
//實現(xiàn)加減乘除
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int sub(int a, int b)
{
return a * b;
}
int sub(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("輸入操作數(shù): ");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("輸入操作數(shù): ");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("輸入操作數(shù): ");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("輸入操作數(shù): ");
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;
}
這里用到的switch循環(huán)語句,實現(xiàn)了數(shù)據(jù)的輸入、輸出和函數(shù)調(diào)用,結(jié)構(gòu)與功能簡單易懂,但主函數(shù)中代碼太過冗長,重復(fù)的代碼很多,這樣的結(jié)構(gòu)導(dǎo)致后期拓展函數(shù)功能需改動的地方非常多。
(2)使用函數(shù)指針數(shù)組的實現(xiàn):
#include <stdio.h>
//實現(xiàn)加減乘除
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int sub(int a, int b)
{
return a * b;
}
int sub(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int (*p[5])(int x, int y) = { 0, add, sub, mul, div };//轉(zhuǎn)移表
while (input)
{
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("輸入操作數(shù): ");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
{
printf( "輸入有誤\n" );
printf( "ret = %d\n", ret );
}
return 0;
}
敲重點!!!? ?? 敲重點!!!? 敲重點!!!
這里我們看到函數(shù)指針數(shù)組的用法是:數(shù)組內(nèi)容(函數(shù)指針)解引用得到函數(shù)地址,接著傳入?yún)?shù),進行函數(shù)調(diào)用,結(jié)果返回一個整形(int)數(shù)據(jù)由ret接收。
ret = (*p[input])(x, y);
在代碼中若出現(xiàn)許多函數(shù)同返回值類型,同參數(shù)類型時,使用函數(shù)指針數(shù)組是一個能大大簡化代碼,消除重復(fù)代碼,是結(jié)構(gòu)更加輕易易懂,為后期拓展更多功能函數(shù)提供便利。
原文鏈接:https://blog.csdn.net/qq_43460230/article/details/123884305
相關(guān)推薦
- 2022-07-11 SOC驗證環(huán)境的啟動方式
- 2023-10-17 淺記前端遇到的問題 input上傳文件屬性以及第三方組件庫上傳文件屬性
- 2024-01-29 在DOS或Windows環(huán)境中,使用工具Debug
- 2023-03-27 使用seaborn繪制強化學習中的圖片問題_python
- 2022-06-12 Centos系統(tǒng)搭建MongoDB數(shù)據(jù)庫_MongoDB
- 2022-09-24 C語言利用面試真題理解指針的使用_C 語言
- 2023-09-17 Could not initialize class net.sf.cglib.beans.Bean
- 2022-08-12 Python中深拷貝與淺拷貝的區(qū)別介紹_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支