C++简析指针函数和函数指针

本文详细解析指针函数,包括其声明、内存管理与错误示例,同时探讨函数指针的概念,强调初始化的重要性,并揭示两者之间的区别。通过实例演示了如何正确使用和管理内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、指针函数

函数声明:

int* func(int a ,int b);

        事实上,指针函数本质是从函数返回指针,即函数的返回值是指针类型,当然也就没有 void* func(int a , int b)的表达

void* funv(int a , int b);//错误表达,空返回值不能返回指针

例如:

#include <iostream>
using namespace std;

//声明指针函数

int* func(int a , int b);

int main()
{
    //调用func()函数,创建指针接受func函数的返回值
    int* p = func(1,2);
    cout << "p = " << p << endl;
    cout << "*p = " << *p << endl;
    //在堆区开辟的内存,如果不及时释放可能会造成内存泄露的问题,
    //所以要及时释放
    free(p);
    return 0;
}

//函数实现
int* func(int a , int b)
{
    //在堆区开辟内存
    //注意返回值是指针,所以不能在函数体内定义变量然后返回其地址,
	//因为函数体内定义的变量存储在栈区,在函数调用结束后,自动销毁,
	//故而开辟堆区内存,但不要忘记程序结束前释放该内存。

    int* p = (int*)malloc(sizeof(int));

    //判断内存空间是否分配成功

    if (p == NULL)
        return 0;//程序结束
    else 
    {
        *p = a + b;
        return p;
    }
}

当然在堆区开辟内存还可以使用new/delete进行。

二、函数指针

首先函数指针指向一个实体函数,即指向一个已经声明过的函数。因为函数指针实质是一个指针,声明创建一个指针后需要初始化  ,否则单独创建一个函数指针而不将其指向特定函数(初始化)编译器将报错。

//声明创建一个指针函数但并不初始化
int (*text)(int a, int b)
{
	return a > b ? a : b;
}

系统会报错误。因为text是声明的一个指针类型,未初始化的指针指向是不明确的,可能指向非法地址,而不可以访问的;也可能指向合法地址,是一个正在使用的值,则可能误操作而发生危险,因此一定要初始化。

正确的做法应该是:

#include <iostream>
using namespace std;

//首先声明一个函数,后续用指针函数指向此函数
int max(int a, int b)
{
    return a > b? a : b; 
}

//声明一个函数指针
int (*text)(int a, int b);  //注意函数参数与指向的函数参数一致


int main()
{
    //用该指针指向此前声明创建的函数max,并且知道函数名本质是
    //函数代码段存储的首地址,故将其直接赋值给创建的指针text即可
    text = max;
    
    //然后就可以正常调用该函数指针了
    cout << max(1,2) << endl;
    cout << (*text)(1,2) << endl;
    return 0;
}

指针函数和函数指针本质是不同的,指针函数返回值是指针,而函数指针返回值应该与其所指向的函数返回值类型保持一致,也就可以返回void,即无返回值。而指针函数返回的是一个指针,自然不可能返回void的指针,所以指针函数一定存在返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满天星..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值