函数指针之探秘

#include <stdio.h>

//演示函数指针的用法
int max (int x,int y)
{
	return x>y?x:y;
}
int min (int x,int y)
{
	return x<y?x:y;
} 

int main()
{
	int (*f)(int x,int y) ;
	f = max;
	printf("%d %d\n",max(2,6),(f)(8,4)); 

	f = &min;
	printf("%d %d\n",min(2,6),(*f)(8,4));
	/*
	由此可知:注意,将一个函数的地址初始化或赋值给一个指向函数的指针时,无需显式的取得函数地址,编译器知道隐式地获得函数的地址,
	因此在这种情况下&操作符是可有可无的,通常省略不用。

	类似的,为了调用函数指针所指向的函数而对指针进行解引用操作也是不必要的,因为编译器可以帮你解引用:
	(*fp)(12);   //显式地解引用
	fp(12);    //隐式地解引用,结果相同
	*/

	typedef int (*PTRFUN) (int x,int y);//关于typedef定义类型
	PTRFUN pf = max;
	printf("%d\n",(pf)(8,4));

	return 0;
} 
#include <stdio.h>

typedef int (*print) (int);
int fun1(int i)
{
	return 2*i;
}

void fun2(int j,print p)	//函数指针做形参
{
	for(int k=0;k<j;k++)
	printf("%d\t",p(k));
}

int main()
{
	int n = 10;
	fun2(n,fun1);
	return 0;
}
#include <stdio.h>

//演示函数指针数组的使用
int add(int x,int y)
{
	return x+y;
}

int subtract(int x,int y)
{
	return x-y;
}

int multiply(int x,int y)
{
	return x*y;
}

int divide(int x,int y)
{
	return x/y;
}
int main()
{
	int (*p[4])(int a,int b) = {add,subtract,multiply,divide};
	for(int i=0;i<4;i++)
	{
		printf("%d\n",p[i](10,2));
	}

	return 0;
}

时间: 2024-12-15 01:32:30

函数指针之探秘的相关文章

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

恼人的函数指针(一)

原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html 这篇是为了加深记忆所写.发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的. 1)  函数指针的初始化. 函数如下: int CompareString(const string& str1, const string& str2) { return str1.compare(str2); } 函数的初始化有两种方式: 第一种,也是最普遍的方式:

C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论

今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程中执行.最终目标是,继承的业务逻辑类外部调用时有两个接口可选,调用syncRun同步执行:调用由引擎自动生成的asyncRun就异步执行.最终自动生成asyncRun的模板基类没能实现,主要原因是mingw对this处理的太有问题了!!原本以为编译器问题,后来才知道成员函数指针和this指针如此特殊

深入浅出剖析C语言函数指针与回调函数(二)

上一篇博文的地址: http://blog.csdn.net/morixinguan/article/details/65494239 这节,我们来看看函数指针与回调函数在Linux内核中的应用. 从上节我们了解到,函数指针和回调函数在开发者和用户之间的一个例子,那么这节,我将引用Linux内核中文件操作结构体来详细的说明. 我们首先来看到这个结构体,这段代码位于linux内核的include/linux/fs.h中,由于代码众多,我只截取几个最基本的例子: File_operations文件操

C语言函数、函数指针解析

函数.函数指针的理解: 函数的定义: void myfunc(void) { } 函数的声明 void myfunc(void); 函数指针的定义.初始化.赋值: 定义:void (*funcp)(void); 初始化: void (*funcp)(void) = &myfunc; 赋值 void (*funcp)(void); funcp = &myfunc; 函数调用:(*funcp)(); funcp(); 也可以这样赋值:void (*funcp)(void); funcp = m

6.7 函数指针

函数指针重载:参数类型要匹配,指针类型必须精确匹配 使用decltype作用于某个函数时,要显示加上*以表示我们需要返回指针,而非函数本身 int func(int a, int b); using pFunc1 = decltype(func) *;typedef decltype(func) *pFunc2;using pFunc3 = int (*)(int a, int b);using pFunc4 = int(int a, int b);typedef int(*pFunc5)(in

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________

成员函数指针和指向静态成员函数的指针

#include <iostream> using namespace std; class Student{ public:     Student(const string& name):m_name(name){}     void who(void){         cout << m_name << endl;     }     string m_name;     static int s_add(int a,int b){         re