注意:函数指针与指针函数的区别
函数指针:T (*p)(parameter……)
指针函数:T* p(parameter……)
/*
*指针与函数、函数指针
* 函数也是在内存中执行的,因此也有地址,函数的大小不是由函数返回类型决定的,
*函数地址不允许其做数学运算,但可以对函数地址赋值和调用函数。
* 函数名就是函数的地址,也是函数开始执行的地方。
*/
#include <iostream>
using namespace std;
int Max(int a, int b)
{
if(a < b)
return b;
else
return a;
}
void print(int* p){ cout << *p << ' '; }
void clear(int* p){ *p = 0; }
void mul(int* p) { *p *= 10; }
void add(int* p) { *p += 16;}
void fill(int* p)
{
static int n = 0;
*p = ++n;
}
void foreach(int* arr, int n, void (*fp)(int* p))
{//通过函数的指针变量调用函数
for(int i = 0; i != n; i++)
(*fp)(arr+i);
//cout << endl;
}
int main(int argc,char* argv[])
{
//用指向函数的指针变量调用函数
/*其实函数它也是有地址的,一个函数在编译时,
系统会分配给它一个入口地址,而这个入口地址就是函数的指针*/
/*if(argc < 1) return 0;
int (*p)(int , char* arr[]);
p = &main;
cout << "主函数的地址:" << main << endl;
(*p)(argc-1,argv);*/
//用函数指针调用判断两个数最大值的函数
/*int a,b;
cout << "输入两个整数a,b:";
cin >> a >> b;
int (*p)(int , int ); //p就是所谓的函数指针
p = Max;
cout << p(a,b) << endl;*/
int arr[5];
int i;
foreach(arr,5,print); //for(i = 0; i != 5; i++) print(arr+i);
cout << endl;
foreach(arr,5,fill); //for(i = 0; i != 5; i++) fill(arr+i);
foreach(arr,5,print); //for(i = 0; i != 5; i++) print(arr+i);
cout << endl;
foreach(arr,5,add); //for(i = 0; i != 5; i++) add(arr+i);
foreach(arr,5,print); //for(i = 0; i != 5; i++) print(arr+i);
cout << endl;
foreach(arr,5,clear); //for(i = 0; i != 5; i++) clear(arr+i);
foreach(arr,5,print); //for(i = 0; i != 5; i++) print(arr+i);
cout << endl;
return 0;
}