最主要区别:指针函数是函数,只不过最后retrurn返回的是指针,
函数指针是指针,指针指向函数,可用于回调函数
函数指针(Function Pointer)
1.基本函数指针
声明函数指针,然后指向即可
#include<stdio.h>
int add(int a, int b)
{
return a + b;
}
int subtract(int a, int b)
{
return a - b;
}
int multiply(int a, int b)
{
return a * b;
}
int main()
{
//定义 指针函数
int (*function)(int, int);
//指向add函数
function = add;
printf("10 + 5 = %d\n", operation(10, 5));
// 指向subtract函数
function = subtract;
printf("10 - 5 = %d\n", operation(10, 5));
// 指向multiply函数
function = multiply;
printf("10 * 5 = %d\n", operation(10, 5));
return 0;
}
2.函数指针作为参数(回调函数)
#include <stdio.h>
// 回调函数类型
typedef void (*Callback)(int); //返回值 void 函数名 Callback 参数int
// 数据处理函数,接受回调函数作为参数
void process_data(int data[], int size, Callback callback) {
printf("处理数据: ");
for (int i = 0; i < size; i++) {
callback(data[i]); // 调用回调函数
}
printf("\n");
}
// 不同的回调函数
void print_number(int num) {
printf("%d ", num);
}
void print_square(int num) {
printf("%d ", num * num);
}
void print_hex(int num) {
printf("0x%x ", num);
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int size = sizeof(numbers) / sizeof(numbers[0]);
printf("=== 函数指针作为回调函数 ===\n");
printf("1. 打印原始数据: ");
process_data(numbers, size, print_number);
printf("2. 打印平方数: ");
process_data(numbers, size, print_square);
printf("3. 打印十六进制: ");
process_data(numbers, size, print_hex);
return 0;
指针函数(Pointer Function)
1.返回字符串指针
类型 *函数名(参数列表)
#include <stdio.h>
#include <string.h>
// 指针函数:返回char指针
char *get_greeting(int hour) {
if (hour < 12) {
return "Good morning"; // 返回字符串常量的指针
} else if (hour < 18) {
return "Good afternoon";
} else {
return "Good evening";
}
}
int main() {
int time = 14;
char *greeting = get_greeting(time); // 接收返回的指针
printf("时间: %d:00\n", time);
printf("问候语: %s\n", greeting);
// 直接使用
printf("%s, Alice!\n", get_greeting(9));
printf("%s, Bob!\n", get_greeting(20));
return 0;
}
2.返回动态分配内存的指针
malloc + free
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 指针函数:返回动态分配内存的指针
char *create_full_name(const char *first, const char *last) {
// 动态分配内存
int length = strlen(first) + strlen(last) + 2; // +2: 空格和\0
char *full_name = (char *)malloc(length * sizeof(char));
if (full_name != NULL) {
strcpy(full_name, first);
strcat(full_name, " ");
strcat(full_name, last);
}
return full_name; // 返回指针
}
int main() {
char *name1 = create_full_name("张", "三");
char *name2 = create_full_name("Li", "Si");
if (name1 && name2) {
printf("姓名1: %s\n", name1);
printf("姓名2: %s\n", name2);
}
// 必须释放动态分配的内存
free(name1);
free(name2);
return 0;
}