深?理解指針(7)

1.函數指針變量的創建

在x86環境下:

我們發現:以函數是有地址的,函數名就是函數的地址,當然也可以通過& 函數名 的?式獲得函數的地址。

如果我們要將函數的地址存放起來,就得創建函數指針變量咯,函數指針變量的寫法其實和數組指針?常類似。如下:

函數指針類型解析:?

?

再加上一組:

發現pf的前面可以不帶*

2.兩段有趣的代碼

?
?? ?(*(void (*)())0)();
?? ?//解釋一下
?? ?// void (*)()—— 是函數指針類型
?? ?//(void (*)()) —— 括弧里面放類型就是強制轉換
?? ?//(void (*)())0 —— 將0強制轉換為 void (*)() 的函數指針類型
?? ?//這就意味著我們假設 0 地址處放著無參,返回類型是 void 的函數
?? ?//最終是調用 0 地址處放的這個函數

?void (* signal( int, void(*)(int) ) )(int);
// signal —— 函數名
// int —— 參數1
// void(*)(int) —— 參數2
// signal( int, void(*)(int) ) —— 其中少函數值的返回類型
// 而剩下的void ( )(int); —— 這就是返回類型
// 所以這段代碼本質是一個函數聲明
// 想表達的意思是:
// void (*)(int)signal( int, void(*)(int) )
// 注意像上一行這樣寫是會報錯的
// 只是想要表達這個意思而已

3.typedef關鍵字

typedef 是?來類型重命名的,可以將復雜的類型,簡單化。?如,你覺得unsigned int 寫起來不?便,如果能寫成 uint 就?便多了,那么我們可以使?:

如果是指針類型,能否重命名呢?其實也是可以的,?如,將int* 重命名為 ptr_t ,這樣寫:

但是對于數組指針和函數指針稍微有點區別:

?如我們有數組指針類型?int(*)[5]?,需要重命名為 parr_t ,那可以這樣寫:

注意:

// 新的類型名必須在 * 的右邊

函數指針類型的重命名也是?樣的,?如,將 void(*)(int)? 類型重命名為? pf_t? ,就可以這樣寫:

那么要簡化上述的代碼2,可以這樣寫:

typedef void(*pfun_t)(int);

pfun_t signal(int, pfun_t);

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

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	printf("%p\n", Add);
//	printf("%p\n", &Add);
//	return 0;
//}//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	//回憶一下數組指針
//	//int arr[10] = { 0 };
//	//int (*pa)[10] = &arr;
//	//函數與數組類似
//	int (* pf)(int, int) = &Add;
//	//(int, int) 是因為(int x, int y)
//	// int (* pf)是因為int Add
//	//pf是專門用來存放函數地址的,pf 就是函數指針變量
//	return 0;
//}//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int(*pf)(int, int) = Add;
//
//	int c = Add(2, 3);
//	//函數名調用
//	printf("%d\n", c);
//
//	int d = (*pf)(3, 4);
//	//函數指針變量調用
//	printf("%d\n", d);
//
//	int e = (pf)(4, 5);
//	//函數指針變量調用
//	printf("%d\n", e);
//
//	return 0;
//}看看有趣的代碼
//int main()
//{
//	(*(void (*)())0)();
//	//解釋一下
//	// void (*)()—— 是函數指針類型
//	//(void (*)()) —— 括弧里面放類型就是強制轉換
//	//(void (*)())0 —— 將0強制轉換為 void (*)() 的函數指針類型
//	//這就意味著我們假設 0 地址處放著無參,返回類型是 void 的函數
//	//最終是調用 0 地址處放的這個函數
//	return 0;
//}//void (* signal( int, void(*)(int) ) )(int);signal —— 函數名int —— 參數1void(*)(int) —— 參數2signal( int, void(*)(int) ) —— 其中少函數值的返回類型而剩下的void ( )(int); —— 這就是返回類型所以這段代碼本質是一個函數聲明想表達的意思是:void (*)(int)signal( int, void(*)(int) )注意像上一行這樣寫是會報錯的只是想要表達這個意思而已
//
//int main()
//{
//
//	return 0;
//}

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

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

相關文章

AdaBoost算法的原理及Python實現

一、概述 AdaBoost&#xff08;Adaptive Boosting&#xff0c;自適應提升&#xff09;是一種迭代式的集成學習算法&#xff0c;通過不斷調整樣本權重&#xff0c;提升弱學習器性能&#xff0c;最終集成為一個強學習器。它繼承了 Boosting 的基本思想和關鍵機制&#xff0c;但在…

《PyTorch documentation》(PyTorch 文檔)

PyTorch documentation(PyTorch 文檔) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一個優化的張量庫,用于使用GPU和CPU進行深度學習。) Features described in this documentation are classified by release status: (此…

Android學習總結之算法篇六(數組和棧)

括號匹配 public static boolean isValid(String s) {// 創建一個棧用于存儲左括號Stack<Character> stack new Stack<>();// 遍歷字符串中的每個字符for (char c : s.toCharArray()) {if (c ( || c [ || c {) {// 如果是左括號&#xff0c;將其壓入棧中stack…

遺傳算法(Genetic Algorithm,GA)

遺傳算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一種受生物進化理論啟發的優化算法&#xff0c;通過模擬自然選擇和遺傳機制來搜索復雜問題的最優解。 ??核心原理?? ??自然選擇與適者生存??&#xff1a;適應度高的個體更有可能繁殖&#xff0c;將…

消防應急物資智能調用立庫:豪越科技助力消防“速戰速決”

在消防救援的戰場上&#xff0c;時間就是生命&#xff0c;每一秒都關乎著人民群眾的生命財產安全。然而&#xff0c;在過去的緊急救援中&#xff0c;應急物資無法及時到位的情況時有發生&#xff0c;成為制約救援效率的關鍵難題&#xff0c;給救援工作帶來了巨大的困境。 想象一…

【MySQL】數據類型和表的操作

目錄 一. 常用的數據類型 1.數值類型 1.1 整形類型 1.2 浮點型類型 2.字符串類型 char和varchar的區別 如何選擇char和varchar 3.日期類型 4.二進制類型 二. 表的操作 1.查看所有表 2.表的創建 3.查看表的結構 4.表的修改 4.1 添加新的列 4.2 修改表中現有的列 4…

漲薪技術|0到1學會性能測試第43課-apache status模塊監控

前面的推文我們認識了apache目錄結構與配置知識,今天我們繼續來看下apache監控技術,究竟是怎么做性能監控的。后續文章都會系統分享干貨,帶大家從0到1學會性能測試。 Apache監控技術 關于apache監控通常會有兩種方法: 一是:使用apache自帶的status監控模塊進行監控; 二是…

關于 MCP 的理論知識學習

文章目錄 1. 寫在最前面2. 基本概念2.1 Why MCP2.1.1 大模型訪問的局限2.1.2 過渡階段—Function Call2.1.3 當前階段— MCP 3. 碎碎念4. 參考資料 1. 寫在最前面 最近有一項任務是寫舊版本遷移到新版本的支持文檔&#xff0c;文檔的編寫是借助于 cursor 幫忙寫的。但是實現的…

C++學習之路,從0到精通的征途:List類的模擬實現

目錄 一.list的介紹 二.list的接口實現 1.結點 2.list結構 3.迭代器 &#xff08;1&#xff09;begin &#xff08;2&#xff09;end 4.修改 &#xff08;1&#xff09;insert &#xff08;2&#xff09;push_back &#xff08;3&#xff09;push_front &#xff0…

【游戲ai】從強化學習開始自學游戲ai-2 使用IPPO自博弈對抗pongv3環境

文章目錄 前言一、環境設計二、動作設計三、狀態設計四、神經網路設計五、效果展示其他問題總結 前言 本學期的大作業&#xff0c;要求完成多智能體PPO的乒乓球對抗環境&#xff0c;這里我使用IPPO的方法來實現。 正好之前做過這個單個PPO與pong環境內置的ai對抗的訓練&#…

計算機考研精煉 操作系統

第 14 章 操作系統概述 14.1 基本概念 14.1.1 操作系統的基本概念 如圖 14 - 1 所示&#xff0c;操作系統是計算機系統中的一個重要組成部分&#xff0c;它位于計算機硬件和用戶程序&#xff08;用戶&#xff09;之間&#xff0c;負責管理計算機的硬件資源&#xff0c;為用戶和…

什么是基爾霍夫第一定律

基爾霍夫第一定律&#xff08;Kirchhoffs First Law&#xff09;&#xff0c;也稱為基爾霍夫電流定律&#xff08;Kirchhoffs Current Law&#xff0c;簡稱 KCL&#xff09;&#xff0c;是電路分析中最基礎的定律之一。它描述了電路中電流的守恒特性&#xff0c;適用于任何集總…

解決 RN Switch 組件在安卓端樣式很丑的問題

解決此種問題的方式有很多 可以導入原生庫react-native-switch 切圖 (會缺少動畫) 使用 js 組件 這里使用 js 繪制組件&#xff08;原生體驗&#xff09;解決此類問題 Switch.tsx import React, { useEffect, useRef, useState } from react; import { Animated, Pressabl…

【AI】【MCP】搭建私人王炸MCP自動化工作流

目錄 一、什么是MCP 二、MCP大集合 三、準備工作 3.1 安裝node.js 3.2 安裝vscode 3.3 安裝cline插件 3.3.1 安裝 3.3.2 配置Cline 四、配置MCP服務 4.1 Search-mcp服務 4.2 playwright-mcp 服務 前言&#xff1a;夢想組合&#xff0c;輕松辦公&#xff0c;告別手動&a…

Git 實操:如何使用交互式 Rebase 移除指定提交(真實案例分享)

在日常開發中&#xff0c;有時候我們提交了一些不想保留的記錄&#xff0c;比如測試代碼、錯誤的功能提交等。 ?? 在操作 4. 強制推送到遠程倉庫前的注意事項 強制推送&#xff08;git push --force 或 git push -f&#xff09;確實很強大但也危險&#xff0c;因為它會重寫…

11.Excel:函數

一 函數是什么 函數是定義好的公式。 單元格內輸入sum然后tab&#xff0c;框選要求和的范圍&#xff0c;然后回車鍵。 補充&#xff1a;公式。 公式以開頭&#xff0c;可以用于計算&#xff0c;返回數值。 分別點擊各個數值&#xff0c;中間用加號連接。這樣很不方便&#xff…

Springboot使用ThreadLocal提供線程局部變量,傳遞登錄用戶名

文章目錄 概述使用創建ThreadLocalUtil工具類在登錄攔截器中使用ThreadLocal存儲登錄用戶名在/userInfo接口中獲取登錄用戶名 注意事項參考視頻 概述 使用 創建ThreadLocalUtil工具類 utils/ThreadLocalUtil.java package org.example.utils;/*** ThreadLocal 工具類*/ Supp…

1399. 統計最大組的數目

1399. 統計最大組的數目 題目鏈接&#xff1a;1399. 統計最大組的數目 代碼如下&#xff1a; class Solution { public:int countLargestGroup(int n) {int res 0;unordered_map<int, int> um;int maxValue 0;for (int i 1;i < n;i) {string value to_string(i);…

VS Code 插件Git History Diff 使用

右上角 查看單個文件記錄

數學建模論文手的學習日常01

目錄 一.要寫的內容&#xff1a; 二.文章標題&#xff1a; 三.摘要&#xff08;非常非常非常重要&#xff09; 四、關鍵詞&#xff1a; 五、問題重述 六、模型假設 七、符號說明 八、模型的建立與求解 九、模型的分析與檢驗 十、模型的評價、改進與推廣 十一、參考…