函数声明:
int* func(int a ,int b);
事实上,指针函数本质是从函数返回指针,即函数的返回值是指针类型,当然也就没有 void* func(int a , int b)的表达
void* funv(int a , int b);//错误表达,空返回值不能返回指针
例如:
#includeusing 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是声明的一个指针类型,未初始化的指针指向是不明确的,可能指向非法地址,而不可以访问的;也可能指向合法地址,是一个正在使用的值,则可能误操作而发生危险,因此一定要初始化。
正确的做法应该是:
#includeusing 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的指针,所以指针函数一定存在返回值。



