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<stdio.h> #include<stdlib.h> #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<stdio.h> 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; printf("(*myfun)(1,2) = %d\n" , (*myfun)(1,2)); //第二种写法 myfun = ⊂ printf("(*myfun)(5,3) = %d\n" , myfun(5,3)); return 0; }
3、函数指针和指针函数的区别
1)定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
2)写法不同
指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);
函数名带括号的就是函数指针,否则就是指针函数。
3)用法不同
一个是函数,一个是变量。
4)示例代码
#include <stdio.h> // 指针函数:返回指向较大整数的指针 int* findMax(int* a, int* b) { if (*a > *b) return a; else return b; } // 函数:用于计算两个整数的和 int add(int a, int b) { return a + b; } int main() { int x = 10, y = 20; // 使用指针函数 int* max = findMax(&x, &y); printf("Max value: %d\n", *max); // 输出:20 // 声明一个函数指针,指向返回值为 int,参数为两个 int 的函数 int (*func_ptr)(int, int) = &add; // 通过函数指针调用 add 函数 int result = func_ptr(5, 3); printf("Result of add function: %d\n", result); // 输出:8 return 0; }