函数声明:
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的指针,所以指针函数一定存在返回值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)