1、指针函数
指针函数,简单理解就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式如下:
*类型标识符 函数名(参数表)
例如,
int *myfun(int x,int y);
注意:在函数名前面多了一个*
号,而这个函数就是一个指针函数。其返回值是一个 int
类型的指针。
指针函数的写法可以有以下几种:
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);
*
靠近返回值类型的写法更容易理解。
指针函数使用示例如下,
#include <iostream>
using namespace std;
#include<string.h>
int *newAdd(int a, int b); // 声明指针函数
int main() {
int *p1 = NULL;
p1 = newAdd(1, 2);
printf("p1 = 0x%x \n", p1);
printf("*p1 = %d \n", *p1);
getchar();
return 0;
}
int *newAdd(int a, int b) {
int *p = (int *)malloc(sizeof(int));
memset(p, 0, sizeof(int));
printf("函数内:p = 0x%x \n", p);
*p = a + b;
printf("函数内:*p = %d \n", *p);
return p;
}
注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。
也可以将其返回值定义为 void*
类型,调用时强制转换返回值为想要的类型。
2、函数指针
函数指针,其本质是一个指针变量,该指针指向这个函数。函数指针就是指向函数的指针。声明格式如下:
类型说明符 (*函数名) (参数)
例如,
int (*myfun)(int x,int y);
把一个函数的地址赋值给函数指针变量有两种写法:
myfun = &Function;
myfun = Function;
注意:&
不是必需的,因为一个函数标识符就表示了它的地址。
调用函数指针的方式也有两种:
x = (*myfun)();
x = myfun();
函数指针使用示例如下,
#include <iostream>
using namespace std;
int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
//函数指针
int (*myfun)(int x,int y);
int main(int argc, char *argv[])
{
//第一种写法
myfun = add;
cout << "(*myfun)(1,2) = " << (*myfun)(1,2) << endl;
//第二种写法
myfun = ⊂
cout << "(*myfun)(5,3) = " << myfun(5,3) << endl;
return 0;
}
3、函数指针和指针函数的区别
函数指针是指向函数的指针,存储的是函数的地址,用于间接调用函数。指针函数是一个返回指针的函数,它的返回值是一个指针。
特性 | 函数指针 | 指针函数 |
---|---|---|
本质 | 是一个指向函数的指针变量 | 是一个返回指针的函数 |
定义 | int (*myfun)(int x,int y); | int *myfun(int x,int y); |
用途 | 用来存储函数地址, 可以通过它调用函数 | 用来返回一个指针 |
返回 | 没有直接返回值, 它本身指向一个函数 | 返回一个指针 |
调用 | funcPtr(参数列表) | 函数名(参数列表) 返回一个指针 |
使用 | 在回调机制中广泛使用 | 用于返回 动态分配的内存地址等 |
1)定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
2)写法不同
指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);
函数名带括号的就是函数指针,否则就是指针函数。
3)用法不同
一个是函数,一个是变量。
#include <iostream>
using namespace std;
// 普通函数
int multiply(int a, int b) {
return a * b;
}
// 指针函数,返回一个指向函数的指针
int (*getFunctionPointer())(int, int) {
return multiply;
}
int main() {
// 函数指针
int (*funcPtr)(int, int) = multiply;
cout << "Using function pointer: " << funcPtr(3, 4) << endl;
// 调用指针函数,获取一个函数指针
int (*retrievedPtr)(int, int) = getFunctionPointer();
cout << "Using pointer function: " << retrievedPtr(5, 6) << endl;
return 0;
}