亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言深入淺出分析函數指針

 更新時間:2022年08月22日 11:50:15   作者:敲代碼の流川楓  
函數指針是一個指針變量,它可以存儲函數的地址,然后使用函數指針,下面這篇文章主要給大家介紹了關于C語言進階教程之函數指針的相關資料,需要的朋友可以參考下

我們先看一個代碼:

#include<stdio.h>
void test()
{
	printf("haha\n");
}
int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);		
	return 0;
}

輸出的是兩個地址,函數名就是函數的地址

將函數的地址存起來:

#include<stdio.h>
void test()
{
	printf("haha\n");
}
int main()
{
	//函數指針
	int (*pf)(const char*) = test;
	(*pf)("abc");
	pf("abc");
	test("abc");
	return 0;
}

函數指針也是一種指針,是指向函數的指針

int (*pf)(const char*) = test

pf先和*結合,是指針,指向test函數,無參數,返回值類型為void

《C陷阱和缺陷》中的一段代碼:

( *(void (*)())0 )();

void(*)()是函數指針類型

( void (*)() )0 是強制類型轉換,結果是函數的地址,0地址中存放一個函數,無參數,無返回值

以上代碼總體是一次函數調用,調用的是0作為地址處的函數,首先把0強制轉換為無參,返回類型是void的函數的地址,其次是調用0地址處的這個函數

再觀察這段代碼:

void (*signal(int , void(*)(int)))(int);

代碼可以化簡:

把void(*)(int)重命名為pfun_t

typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);

signal 與后面的括號結合,是函數名

( int , void(*)(int) ) 是兩個參數類型

以上代碼是一次函數聲明 ,signal函數的第一個參數的類型是int,第二個參數類型是函數指針,該指針指向的是一個參數類型為int,返回值為空的函數,signal函數的返回類型也是一個指針函數,該函數指針也指向的是一個參數類型為int,返回值為空的函數

使用函數指針簡化代碼:

當功能近似的函數中有較多相同的代碼時,可以用函數指針來簡化代碼

void calc( int(*pf) (int, int) )

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
	printf("*****************\n");
	printf("***1.sum 2.sub***\n");
	printf("***3.mul 4.div***\n");
	printf("*****0.退出*****\n");
	printf("*********\n");
 
}
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 calc(int(*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("輸入兩個操作數:");
	scanf("%d%d", &x, &y);
	ret = pf(x, y);
	printf("%d\n", ret);
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				calc(add);
				break;
			case 2:
				calc(sub);
				break;
			case 3:
				calc(mul);
				break;
			case 4:
				calc(div);
				break;
			case 0:
				printf("退出計算器!\n");
				break;
			default:
				printf("選擇錯誤!\n");
				break;
		}
	} while (input);
	return 0;
}

上述代碼使用了回調函數,回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數?;卣{函數不是由該函數的實現方直接調用,而是在特定的事件或條件發(fā)生時由另外的一方調用的,用于對該事件或條件進行響應。

到此這篇關于C語言深入淺出分析函數指針的文章就介紹到這了,更多相關C語言函數指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++使用boost::lexical_cast進行數值轉換

    C++使用boost::lexical_cast進行數值轉換

    這篇文章介紹了C++使用boost::lexical_cast進行數值轉換的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Qt通過圖片組繪制動態(tài)圖片

    Qt通過圖片組繪制動態(tài)圖片

    這篇文章主要為大家詳細介紹了Qt通過圖片組繪制動態(tài)圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++基本組件之內存池詳解

    C++基本組件之內存池詳解

    這篇文章主要為大家詳細介紹了C++中的基本組件——內存池的相關知識,文中的示例代碼講解詳細,對我們學習C++有一定的幫助,需要的可以參考一下
    2023-03-03
  • 對比C語言中execv相關的執(zhí)行文件的三個函數

    對比C語言中execv相關的執(zhí)行文件的三個函數

    這篇文章主要介紹了對比C語言中execv相關的執(zhí)行文件的三個函數,分別為execv()函數和execve()函數以及execvp()函數,需要的朋友可以參考下
    2015-08-08
  • C++基于遞歸和非遞歸算法求二叉樹鏡像的方法

    C++基于遞歸和非遞歸算法求二叉樹鏡像的方法

    這篇文章主要介紹了C++基于遞歸和非遞歸算法求二叉樹鏡像的方法,針對二叉樹遍歷結合實例形式分析了遞歸與非遞歸算法的實現與使用技巧,需要的朋友可以參考下
    2017-05-05
  • C++解析obj模型文件方法介紹

    C++解析obj模型文件方法介紹

    由于本人打算使用Assimp來加載模型,這里記錄一下tinyobjloader庫的使用。之前也研究過fbxsdk,除了骨骼動畫暫未讀取外,代碼自認為還算可靠
    2022-09-09
  • C語言實現數字游戲

    C語言實現數字游戲

    這篇文章主要為大家詳細介紹了C語言實現數字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C語言實現維吉尼亞密碼的示例代碼

    C語言實現維吉尼亞密碼的示例代碼

    維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡單形式。本文將用C語言實現維吉尼亞密碼,需要的可以參考一下
    2022-11-11
  • C++ 中循環(huán)鏈表和約瑟夫環(huán)

    C++ 中循環(huán)鏈表和約瑟夫環(huán)

    這篇文章主要介紹了C++ 中循環(huán)鏈表和約瑟夫環(huán)的相關資料,需要的朋友可以參考下
    2017-06-06
  • C語言入門的一些基本資源推薦和程序語法概覽

    C語言入門的一些基本資源推薦和程序語法概覽

    這篇文章主要介紹了C語言入門的一些基本資源推薦和程序語法概覽,C語言是很多現代高級編程語言的基礎,需要的朋友可以參考下
    2015-12-12

最新評論