函数指针与返回指针的函数

如下两个例子

 1. int* lpfun(int,int);

 2. int (*lpfun)(int,int);

第一种是我们熟悉的函数指针,即函数的返回值为int类型的指针

第二种一定要用括号把*号和lpfun括起来,这种类型与第一种不一样,是指向一种函数地址的指针。这个函数的返回类型是int型,实参也为int型。

复制代码
#include <stdio.h>

using namespace std;

int* lpfun1(int,int); //声明一个返回指针为int类型的函数
int lpfun2(int,int);  //普通函数
typedef
int (*lpfunPointer)(int,int); //声明一个函数指针类型,用于保存它要指向的函数地址
void main()
{
int *result=lpfun1(10,20);
printf(
"%d\n",*result);
delete result;  //删除堆中的指针
result
=0;     //使指针无效

lpfunPointer p
=lpfun2; //保存lpfun2函数的地址,函数名也是一种指针
printf(
"%d\n",p(12,60)); //调用带参的函数

}
/***********************************************************************************************
lpfun1过程说明:
    如果我们在此函数中这样写: int *p=NULL;
*p=x+y;
return p;
这样的写法是错误的,因为在函数中声明的变量在函数执行完后就不存了,即此是p不存了,是个无效指针,就不能得到这个返回值。
 而如果在堆中开辟一小内存来存放,并在完成后由手工来释放,则我们可以用int* p=new int;来创建,这样即使函数没了,但
这个p还是存在于堆中的,由此我们会看到在main()中用了一个int *result=lpfun1(10,20)把堆中的p指针指向result指针,再
手工释放。 这样就不会内存泄露了。

谨记:永远不要从函数中返回局部自动变量的地址。
******************************************/
int* lpfun1(int x,int y)
{
int *p=new int(0);
*p=x+y;
return p;
}

int lpfun2(int x,int y)
{
return x+y;
}
复制代码

posted on   天上星  阅读(16226)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
< 2011年8月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10

导航

统计

点击右上角即可分享
微信分享提示