深?理解指針(8)

1.對上一篇的補充內容

typedef int* ptr_t

#define PTR_T int*

這兩種寫法都是可以的

ptr_t p1, p2;

//p1, p2 都是指針變量

PTR_T p3, p4;

//p3 是指針變量, p4是整型變量

為什么p3 是指針變量, p4是整型變量呢?

因為PTR_T 真的被改為了 int*?

在編譯器中是這樣解讀的

替換后int *?p3, p4;中 * 給 p3 用了

2.函數指針數組

int * arr [5];

//arr是指針數組 —— 存放的是指針

如果我們有4個函數的地址,要把函數的地址存到?個數組中,那這個數組就叫函數指針數組,那函數指針的數組如何定義呢?

現在有四組函數,如圖:

定義如下圖代碼所示:

3.函數指針數組的小練習

對上述的代碼進行應用:

4組函數部分不變,對代碼進行如下補充:

運行結果如下:

進行8 , 4 的 4 種函數運算

4.用途:轉移表

函數指針數組的?途:轉移表

首先我們編寫一段簡易的計算器代碼,如下圖所示:

?

?

運行結果如下:

以上是兩個整數的運算,完成的加減乘除運算

但是!

如果要計算其他運算,就要對現在的代碼進行補充 case 的語句會越來越長,那么我們有沒有辦法簡化代碼呢?

如下所示:

函數與菜單部分一樣

修改部分如下所示:

當增加算法時:

增加函數、修改菜單、再在函數指針數組種加入函數名、再修改循環中的數據即可。

本篇文章中所有用到的代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
int (*)(int,int)
//
//int main()
//{
//	int (*pf1)(int,int) = Add;
//	//pf1是函數指針變量
//	int (*pfarr[4])(int, int) = {Add,Sub,Mul,Div};
//	//pfarr是函數指針數組
//	//8 4 
//	int i = 0;
//	for (i = 0; i < 4; i++)
//	{
//		int r = pfarr[i](8, 4);
//		printf("%d\n", r);
//	}
//	return 0;
//}//計算器
//完成整數的加減乘除運算//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void menu()
//{
//	printf("************************************\n");
//	printf("***********    1.add    ************\n");
//	printf("***********    2.sub    ************\n");
//	printf("***********    3.mul    ************\n");
//	printf("***********    4.div    ************\n");
//	printf("***********    0.exit   ************\n");
//	printf("************************************\n");
//}
//
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int z = 0;
//	do
//	{
//		menu();
//		printf("請選擇:");
//		scanf("%d ", &input);
//		switch (input)
//		{
//		case 1:
//			printf("請輸入兩個操作數:");
//			scanf("%d %d", &x, &y);
//			z = Add(x, y);
//			printf("%d\n", z);
//			break;
//		case 2:
//			printf("請輸入兩個操作數:");
//			scanf("%d %d", &x, &y);
//			z = Sub(x, y);
//			printf("%d\n", z);
//			break;
//		case 3:
//			printf("請輸入兩個操作數:");
//			scanf("%d %d", &x, &y);
//			z = Mul(x, y);
//			printf("%d\n", z);
//			break;
//		case 4:
//			printf("請輸入兩個操作數:");
//			scanf("%d %d", &x, &y);
//			z = Div(x, y);
//			printf("%d\n", z);
//			break;
//		case 0:
//			printf("退出計算器\n");
//			break;
//		default:
//			printf("選擇錯誤\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}//簡化代碼
int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}int Mul(int x, int y)
{return x * y;
}int Div(int x, int y)
{return x / y;
}void menu()
{printf("************************************\n");printf("***********    1.add    ************\n");printf("***********    2.sub    ************\n");printf("***********    3.mul    ************\n");printf("***********    4.div    ************\n");printf("***********    0.exit   ************\n");printf("************************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;int z = 0;//再這里創建一個函數指針的數組//int (*pfArr[4])(int, int) = { Add, Sub, Mul, Div };//                  下標:      0    1    2    3//和菜單不匹配int (*pfArr[5])(int, int) = { 0, Add, Sub, Mul, Div };//                  下標:    0    1    2    3    4do{menu();printf("請選擇:");scanf("%d ", &input);//3if (input >= 1 && input <= 4){printf("請輸入兩個操作數:");scanf("%d %d", &x, &y);z = pfArr[input](x, y);printf("%d\n", z);}else if (input == 0){printf("退出計算器\n");}else{printf("選擇錯誤\n");}} while (input);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903728.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903728.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903728.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

neo4j暴露公網ip接口——給大模型聯通知識圖譜

特別鳴謝 我的領導&#xff0c;我的腦子&#xff0c;我的學習能力&#xff0c;感動了 1. 搭建知識圖譜數據庫&#xff08;見上一章博客&#xff09; 這里不加贅述了&#xff0c;請參考上一篇博客搭建 2. FastApi包裝接口 這里注意&#xff1a;NEO4J_URI不得寫http:,只能寫…

AI編程新選擇!VSCode + RooCode,超越Cursor?

在當今快節奏的開發環境中&#xff0c;AI編程助手已經成為提升開發效率的關鍵工具。然而&#xff0c;面對眾多選擇&#xff0c;開發者往往陷入糾結&#xff1a;如何在眾多AI編程工具中找到最適合自己的方案&#xff1f;尤其是當VSCode搭配RooCode時&#xff0c;相比Cursor&…

電子病歷高質量語料庫構建方法與架構項目(環境聆聽與自動化文檔生成篇)

電子病歷高質量語料庫的構建是一個復雜而系統的工程,涉及數據收集、清洗、標注、驗證等多個環節。在項目實施過程中,"環境聆聽"和"自動化文檔生成"是兩個關鍵支撐要素,前者確保項目能夠適應不斷變化的技術和業務環境,后者則保障項目過程的可追溯性和知…

Python協程入門指北

一、什么是協程&#xff1f; 協程&#xff08;Coroutine&#xff09;就像可以暫停執行的函數&#xff0c;能夠在執行過程中主動讓出控制權&#xff0c;等準備好后再繼續執行。 生活小例子 想象你在咖啡店排隊&#xff1a; 普通函數&#xff1a;必須一直排到取餐&#xff08…

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下載安裝和使用

資源獲取鏈接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用說明資源-CSDN文庫 詳細作用 數據庫服務器的核心文件&#xff1a; 這是一個壓縮包&#xff0c;解壓后包含 MySQL 數據庫服務器的可執行文件、庫文件、配置文件模板等。 它用于在 Linux 系統上安裝…

C++筆記-繼承(下)(包含派生類的默認成員函數,菱形繼承等)

一.派生類的默認成員函數 1.14個常見默認成員函數 默認成員函數&#xff0c;默認的意思就是指我們不寫&#xff0c;編譯器會自動為我們生成一個&#xff0c;那么在派生類中&#xff0c;這幾個成員函數是如何生成的呢&#xff1f; 1.派生類的構造函數必須調用基類的構造函數初…

C++中指針使用詳解(3)數組、指針和函數參數傳遞的底層 ABI實現

要深入理解 數組、指針和函數參數傳遞 的底層 ABI&#xff08;Application Binary Interface&#xff09;實現&#xff0c;需要從以下幾個維度出發進行學習&#xff1a; 一、什么是 ABI&#xff1f; ABI 是編譯器和操作系統之間的協定&#xff0c;規定了&#xff1a; 函數如何…

【RustDesk 】中繼1:壓力測試 Python 版 RustDesk 中繼服務器

測試 Python 版 RustDesk 中繼服務器 測試我們實現的中繼服務器有幾種方法,從簡單到復雜依次如下: 1. 基本連接測試客戶端 創建一個簡單的測試客戶端來驗證中繼服務器的基本功能: 2. 用兩個測試客戶端測試中繼功能 要測試完整的中繼功能,你需要運行兩個客戶端實例來模擬…

Spring Boot集成Spring Cloud 2024(不使用Feign)

本文介紹Spring Boot集成Spring Cloud 2024&#xff0c;且不使用Feign&#xff0c;而是采用Spring 6自帶的HttpExchange方式進行服務調用的詳細步驟&#xff1a; 環境準備 Spring Boot版本&#xff1a;推薦使用Spring Boot 3.4.1及以上版本&#xff0c;以更好地與Spring Clou…

vue中$set原理

Vue 中的 $set 方法&#xff08;Vue.set&#xff09;主要用于 向響應式對象中添加一個新的屬性&#xff0c;并確保這個新屬性是響應式的&#xff0c;能夠觸發視圖更新。 &#x1f4cc; 背景問題&#xff1a;為什么需要 $set&#xff1f; 在 Vue 2 中&#xff0c;直接給對象新增…

Superset二次開發之深度解讀系列:1.概述

Apache Superset 是一款現代化的企業級商業智能 Web 應用程序&#xff0c;專為數據探索和可視化而設計。本概述介紹了 Superset 的架構、核心組件和主要功能&#xff0c;以幫助開發人員了解該系統的工作原理。 What is Apache Superset? Apache Superset 是一個開源數據探索…

Linux系統之elfedit詳解

elfedit 是一個用于修改 ELF&#xff08;可執行與可鏈接格式&#xff09;文件頭的工具。它允許用戶根據指定的條件&#xff08;如機器類型、文件類型、操作系統/ABI&#xff09;匹配并更新 ELF 文件的頭部信息。支持 32 位和 64 位 ELF 文件&#xff0c;以及包含 ELF 文件的歸檔…

前端HTML基礎知識

1.HTML介紹 HTML(HyperText Markup Language&#xff0c;超文本標記語言)是構成網頁的基本元素&#xff0c;是一種用于創建網頁的標準化標記語言。HTML不是一種編程語言&#xff0c;而是一種標記語言&#xff0c;通過標簽來描述網頁的結構和內容。 超文本&#xff1a;超文本是…

【IP101】圖像濾波技術詳解:從均值濾波到高斯濾波的完整指南

&#x1f31f; 圖像濾波魔法指南 &#x1f3a8; 在圖像處理的世界里&#xff0c;濾波就像是給圖片"美顏"的魔法工具。讓我們一起來探索這些神奇的濾波術吧&#xff01; &#x1f4d1; 目錄 1. 均值濾波&#xff1a;圖像的"磨皮"大法2. 中值濾波&#xff1…

LINE FRIENDS 正式與 Walrus 合作,全新 AI 驅動的游戲即將上線

風靡全球的 LINE FRIENDS 角色即將以“minini”迷你造型登陸 Walrus&#xff0c;雖然尺寸更小&#xff0c;但承諾帶來“大”動作。IPX&#xff08;LINE FRIENDS 背后的公司&#xff09;打造了《minini universe: ROOM》游戲&#xff0c;這是一款基于其 minini 系列角色的多鏈游…

2025年信息素養大賽C++算法創意實踐挑戰賽初賽樣題及答案解析(小學組)

一、選擇題 1、下列代碼&#xff0c;能夠輸出 hello world 的是_____ A. cout (hello world) B. cout << hello world C. cout:hello world D. cout << "hello world"; 答案&#xff1a;D 解析&#xff1a;cout輸出的文本內容要用雙引號引起來 2、…

[c語言日寄]檢查環形鏈表

【作者主頁】siy2333 【專欄介紹】?c語言日寄?&#xff1a;這是一個專注于C語言刷題的專欄&#xff0c;精選題目&#xff0c;搭配詳細題解、拓展算法。從基礎語法到復雜算法&#xff0c;題目涉及的知識點全面覆蓋&#xff0c;助力你系統提升。無論你是初學者&#xff0c;還是…

黃雀在后:外賣大戰新變局,淘寶+餓了么開啟電商大零售時代

當所有人以為美團和京東的“口水戰”硝煙漸散&#xff0c;外賣大戰告一段落時&#xff0c;“螳螂捕蟬&#xff0c;黃雀在后”&#xff0c;淘寶閃購聯合餓了么“閃現”外賣戰場&#xff0c;外賣烽火再度燃起。 4 月30日&#xff0c;淘寶天貓旗下即時零售業務“小時達”正式升級…

如何在uni-app中自定義輸入框placeholder的樣式

在開發uni-app應用時&#xff0c;我們經常需要自定義輸入框&#xff08;<input>&#xff09;的樣式以匹配應用的整體設計。默認情況下&#xff0c;uni-app的輸入框提供了一些基本的樣式選項&#xff0c;但有時候我們需要更細致地控制輸入框的每個部分&#xff0c;例如pla…

使用Node編寫輕量級后端快速入門

使用Node編寫輕量級后端快速入門 node 要作為輕量級后端需要下載一些對應模塊可以參考下面命令。你可以借助 npm&#xff08;Node Package Manager&#xff09;來下載它們。 模塊下載 express&#xff1a;這是一個廣受歡迎的 Node.js Web 應用框架&#xff0c;能用于構建 Web…