函数名与函数指针解惑

来源:互联网 发布:金额均分算法 编辑:程序博客网 时间:2024/06/13 01:28

先看一个程序:

#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:0012FF7Cmin=2min=2min=2代码区地址:min:004011D6代码区地址:*min:004011D6代码区地址:&min:004011D6min=2栈中地址:a0012FF6C栈中地址:&a0012FF6CArray 地址: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++ 函数指针是语法规定很复杂平时多多积累它的用法。

原创粉丝点击