先看一个程序:
#include <iostream>
using namespace std;
typedef int (* minPtr)(int,int);
int min(int x,int y)
{
printf("min=%d\n",(x<y?x:y));
return (x<y?x:y);
}
void printArrayAddress(int *a){
cout<<"Array 地址:"<<a<<endl;
}
void main()
{
int intA=0;
cout<<"栈中地址:&intA:"<<&intA<<endl;
minPtr p1=0;//函数指针只能通过同类型函数或函数指针或0值常量进行初始化,函数指针初始化为0时表示该指针不指向任何函数。
p1=min;
p1(2,4); //implicity dereferenced
p1=&min;
(*p1)(2,4); //explicity dereferenced
p1=*min;
(p1)(2,4);
//(&p1)(2,4);//term does not evaluate to a function
cout<<"代码区地址:min:"<<min<<endl;
cout<<"代码区地址:*min:"<<*min<<endl;
cout<<"代码区地址:&min:"<<&min<<endl;
min(2,4);
int a[]={1,2,3};
cout<<"栈中地址:a"<<a<<endl;
cout<<"栈中地址:&a"<<&a<<endl;
printArrayAddress(a);
cout<<"*a:"<<*a<<endl;
//printArray(&a); //cannot convert parameter 1 from 'int (*)[3]' to 'int *'
}
执行结果为:
栈中地址:&intA:0012FF7C
min=2
min=2
min=2
代码区地址:min:004011D6
代码区地址:*min:004011D6
代码区地址:&min:004011D6
min=2
栈中地址:a0012FF6C
栈中地址:&a0012FF6C
Array 地址:0012FF6C
*a:1
疑问:
1.
cout<<"代码区地址:min:"<<min<<endl;
cout<<"代码区地址:*min:"<<*min<<endl;
cout<<"代码区地址:&min:"<<&min<<endl;
输出结果一样。
2.
cout<<"栈中地址:a"<<a<<endl;
cout<<"栈中地址:&a"<<&a<<endl;
输出结果一样。
解答:
这是语法特殊规定:
1.函数名=函数首址,&X也表示函数首址。
2.如果是函数名,那么自动转为函数指针(在引用函数名但没有调用该函数时,函数名自动解释为指向函数的指针)。
3.如果取地址,对函数取地址,也是函数指针。
4.C++ 函数指针是语法规定很复杂平时多多积累它的用法。