函数名与函数指针解惑

先看一个程序:

#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++ 函数指针是语法规定很复杂平时多多积累它的用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值