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

C++简析指针函数和函数指针,第1张

一、指针函数

函数声明:

int* func(int a ,int b);

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

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

例如:

#include 
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 
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的指针,所以指针函数一定存在返回值。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/733443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存