【C语言入门】函数指针:定义与使用(指向函数的指针变量)

什么是函数指针?如何使用函数指针? 在C语言中,函数被视为存储在内存中的一段可执行代码,每个函数都有一个唯一的地址。函数指针是一个指针变量,它存储了一个函数的地址。你可以将函数指针用来调用函数,就像你可以使用普通指针来访问变量一样。是函数返回值的类型。是函数指针的名称。是函数的参数类型。返回值类型:指定了函数指针所指向的函数的返回值类型。:指定了指针变量的名称和表示这是一个函数指针的星号。:指定了函数指针所指向的函数的参数类型。函数指针的语法可能看起来有点复杂,但理解它的核心思想是关键。 阅读详情
AI摘要

本文围绕C语言函数指针展开,先介绍指针与函数基础,阐述函数有地址。接着说明函数指针的定义、声明、初始化、调用及类型匹配规则,还介绍其高级用法,如函数指针数组等。最后列举常见错误、注意事项及实际应用场景,强调其能让函数像变量一样传递和调用。

0. 前置知识:指针与函数的基础

要理解函数指针,需要先回顾两个基础概念:指针和函数。

(1)指针的本质

指针是一个变量,它存储的是内存地址。例如:

 

int a = 10;    // 变量a存储整数10,位于内存地址0x1000
int* p = &a;   // 指针p存储a的地址(0x1000),p的类型是“int*”(指向int的指针)

 

通过指针 p,可以访问或修改 a 的值(*p = 20; 等价于 a = 20;)。

(2)函数的本质

函数是一段有特定功能的代码块。例如:

int add(int a, int b) {  // 函数add的功能是计算a+b
    return a + b;
}

 

当程序运行到 add(3, 5) 时,计算机会跳转到 add 函数的代码位置,执行相加操作,然后返回结果。

(3)关键问题:函数有地址吗?

是的!函数的代码在内存中也有固定的存储位置,这个位置的 “门牌号” 就是函数的地址。可以用 & 运算符获取函数的地址(和取变量地址类似)。


1. 函数指针的定义与声明

(1)函数指针的语法格式

函数指针的声明需要明确三个信息:

  • 返回值类型:函数的返回值类型(如 int、void 等)。
  • 参数类型列表:函数的参数类型和数量(如 int a, int b)。
  • 指针变量名:函数指针变量的名称(如 p_add)。

语法格式:

返回值类型 (*指针变量名)(参数类型列表);

 

示例:
声明一个指向 add 函数的指针:

int add(int a, int b) { return a + b; }  // 原函数

// 声明函数指针:返回值为int,参数为两个int的函数指针
int (*p_add)(int, int);  

(2)关键注意点

  • 函数指针的类型由 “返回值类型” 和 “参数类型列表” 共同决定。例如:
    int (*p1)(int, int) 和 int (*p2)(int) 是两种不同类型的函数指针(参数数量不同)。
  • 函数指针的名称是 *指针变量名 中的变量名(如 p_add),* 表示这是一个指针。

(3)如何初始化函数指针?

函数指针需要指向一个具体的函数,初始化方式有两种:

  • 直接赋值函数名(推荐):p_add = add;
  • 显式取函数地址:p_add = &add;

原因:在 C 语言中,函数名本身就代表函数的地址(类似数组名代表数组首地址),因此 add 和 &add 是等价的。

示例代码:

#include <stdio.h>

// 原函数
int add(int a, int b) {
    return a + b;
}

int main() {
    // 声明函数指针
    int (*p_add)(int, int);  

    // 初始化:指向add函数(两种方式等价)
    p_add = add;       // 方式1:直接赋值函数名
    // p_add = &add;  // 方式2:显式取地址(效果相同)

    // 验证:打印函数地址(结果相同)
    printf("add的地址:%p\n", add);       // 输出:0x1000(示例地址)
    printf("&add的地址:%p\n", &add);     // 输出:0x1000(与add相同)
    printf("p_add的地址:%p\n", p_add);   // 输出:0x1000(与add相同)

    return 0;
}

2. 如何通过函数指针调用函数?

通过函数指针调用函数时,有两种语法形式:

  • 直接使用指针变量名:p_add(3, 5);
  • 解引用指针后调用:(*p_add)(3, 5);

原因:C 语言编译器对这两种写法做了等价处理,本质上都是通过函数指针存储的地址找到函数并执行。

示例代码:

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*p_add)(int, int) = add;  // 声明并初始化函数指针

    // 方式1:直接调用
    int result1 = p_add(3, 5);     // 等价于 add(3,5)
    printf("result1: %d\n", result1);  // 输出:8

    // 方式2:解引用后调用
    int result2 = (*p_add)(3, 5);  // 等价于 add(3,5)
    printf("result2: %d\n", result2);  // 输出:8

    return 0;
}

关键结论

两种调用方式完全等价,推荐直接使用指针变量名调用(更简洁)。


3. 函数指针的类型匹配规则

函数指针的类型必须与所指向的函数的类型完全一致(包括返回值类型和参数类型列表),否则会导致编译错误。

(1)返回值类型必须匹配

如果函数指针声明的返回值类型与目标函数的返回值类型不同,会报错。

错误示例:

// 目标函数返回值为int
int add(int a, int b) { return a + b; }

// 错误:函数指针声明的返回值为void(不匹配)
void (*p_add)(int, int) = add;  // 编译错误!

(2)参数类型和数量必须匹配

函数指针的参数类型列表必须与目标函数的参数类型列表完全一致(顺序、类型、数量)。

错误示例:

// 目标函数有2个int参数
int add(int a, int b) { return a + b; }

// 错误1:参数数量不匹配(声明1个参数)
int (*p_add1)(int) = add;  // 编译错误!

// 错误2:参数类型不匹配(声明double参数)
int (*p_add2)(double, double) = add;  // 编译错误!

(3)严格匹配的意义

函数指针的类型匹配规则是 C 语言的 “类型安全” 要求。如果类型不匹配,编译器无法保证函数调用时的参数传递和返回值处理是正确的,可能导致程序崩溃或错误结果。


4. 函数指针的高级用法

(1)函数指针数组

函数指针数组是一个数组,数组的每个元素都是一个函数指针。它的作用是批量管理多个同类型的函数。

语法格式:

返回值类型 (*数组名[数组大小])(参数类型列表);

 

示例:

#include <stdio.h>

// 三个同类型的函数
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }

int main() {
    // 声明函数指针数组(3个元素,每个元素是“int (*)(int, int)”类型)
    int (*funcs[3])(int, int) = {add, sub, mul};

    // 通过数组下标调用函数
    int result1 = funcs[0](3, 5);  // 调用add(3,5) → 8
    int result2 = funcs[1](3, 5);  // 调用sub(3,5) → -2
    int result3 = funcs[2](3, 5);  // 调用mul(3,5) → 15

    printf("加法结果: %d\n", result1);
    printf("减法结果: %d\n", result2);
    printf("乘法结果: %d\n", result3);

    return 0;
}

(2)指向函数指针的指针(二级函数指针)

二级函数指针是指向 “函数指针” 的指针,它存储的是函数指针的地址。

语法格式:

返回值类型 (**二级指针名)(参数类型列表);

 

示例:

#include <stdio.h>

int add(int a, int b) { return a + b; }

int main() {
    int (*p_add)(int, int) = add;    // 一级函数指针(指向add)
    int (**pp_add)(int, int) = &p_add;  // 二级函数指针(指向p_add的地址)

    // 通过二级指针调用函数
    int result = (**pp_add)(3, 5);  // 等价于 (*p_add)(3,5) → 8
    printf("结果: %d\n", result);

    return 0;
}

(3)函数指针作为函数参数(回调函数)

函数指针最强大的用途之一是作为函数的参数,实现 “回调机制”。回调函数允许我们在一个函数中动态指定另一个函数的行为。

典型场景:

  • 排序算法(如 C 标准库的 qsort 函数需要传递比较函数)。
  • 事件处理(如 GUI 程序中点击按钮触发自定义回调函数)。

示例:用函数指针实现通用计算器

#include <stdio.h>

// 定义函数指针类型(方便后续使用)
typedef int (*CalcFunc)(int, int);

// 加法函数
int add(int a, int b) { return a + b; }

// 减法函数
int sub(int a, int b) { return a - b; }

// 通用计算器函数(接收函数指针作为参数)
int calculate(int a, int b, CalcFunc func) {
    return func(a, b);  // 调用传入的函数
}

int main() {
    int a = 10, b = 5;

    // 用加法函数作为回调
    int sum = calculate(a, b, add);
    printf("加法结果: %d\n", sum);  // 输出:15

    // 用减法函数作为回调
    int diff = calculate(a, b, sub);
    printf("减法结果: %d\n", diff);  // 输出:5

    return 0;
}

 

关键价值:通过函数指针作为参数,calculate 函数不再固定实现一种计算逻辑,而是可以动态接收不同的计算函数(加法、减法、乘法等),大大提高了代码的灵活性和复用性。


5. 函数指针与普通指针的区别

特性普通指针(指向变量)函数指针(指向函数)
指向的内容变量的内存地址(存储数据)函数的内存地址(存储代码)
解引用操作*p 访问变量的值(*p)(...) 调用函数
类型决定因素指向的数据类型(如 int*)函数的返回值类型和参数列表
算术运算支持指针加减(如 p++ 移动到下一个变量)不支持指针加减(函数地址是连续的代码块)
用途动态访问或修改变量值动态调用函数、实现回调机制

6. 常见错误与注意事项

(1)未初始化的函数指针

函数指针未初始化时,其值是随机的(野指针),直接调用会导致程序崩溃。

错误示例:

int (*p_add)(int, int);  // 未初始化
p_add(3, 5);  // 崩溃!p_add指向未知地址

 

解决方案:必须先初始化函数指针,使其指向一个有效的函数。

(2)类型不匹配的函数指针赋值

函数指针的类型必须与目标函数完全一致,否则编译报错。

错误示例:

void print(int a) { printf("%d\n", a); }

// 错误:函数指针声明的返回值是int,而目标函数返回void
int (*p_print)(int) = print;  // 编译错误!

(3)误将函数名作为普通变量使用

函数名代表函数的地址,但不能像普通变量一样修改其值(函数地址是只读的)。

错误示例:

int add(int a, int b) { return a + b; }
add = 0x1000;  // 错误!函数名是常量,不能赋值

(4)函数指针数组的越界访问

函数指针数组的下标不能超过数组大小,否则会访问到非法内存。

错误示例:

int (*funcs[2])(int, int) = {add, sub};
funcs[2](3, 5);  // 错误!数组大小为2,下标最大是1

7. 实际应用场景

(1)C 标准库中的 qsort 函数

qsort 是 C 语言标准库的排序函数,它需要接收一个比较函数指针,用于定义排序规则(升序或降序)。

函数原型:

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));

 

参数说明:

  • base:待排序数组的起始地址。
  • nitems:数组元素个数。
  • size:单个元素的大小(字节)。
  • compar:比较函数指针(返回值为 int,参数为两个 const void* 类型)。

示例:用 qsort 排序整数数组

#include <stdio.h>
#include <stdlib.h>

// 比较函数:升序排序(a < b 返回-1,a == b 返回0,a > b 返回1)
int compare_asc(const void *a, const void *b) {
    int num1 = *(const int *)a;
    int num2 = *(const int *)b;
    return (num1 > num2) - (num1 < num2);  // 等价于 num1 - num2(但更安全)
}

// 比较函数:降序排序
int compare_desc(const void *a, const void *b) {
    int num1 = *(const int *)a;
    int num2 = *(const int *)b;
    return (num2 > num1) - (num2 < num1);  // 等价于 num2 - num1
}

int main() {
    int arr[] = {3, 1, 4, 2, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 升序排序(传递compare_asc函数指针)
    qsort(arr, n, sizeof(int), compare_asc);
    printf("升序结果: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);  // 输出:1 2 3 4 5
    }
    printf("\n");

    // 降序排序(传递compare_desc函数指针)
    qsort(arr, n, sizeof(int), compare_desc);
    printf("降序结果: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);  // 输出:5 4 3 2 1
    }
    printf("\n");

    return 0;
}

(2)嵌入式系统中的中断处理

在嵌入式系统中,硬件中断(如定时器中断、串口中断)需要注册中断处理函数。通过函数指针可以动态绑定不同的中断处理逻辑。

示例伪代码:

// 定义中断处理函数指针类型
typedef void (*InterruptHandler)(void);

// 注册中断处理函数的函数(接收函数指针)
void register_interrupt_handler(InterruptHandler handler) {
    // 将handler存储到中断向量表中
    interrupt_vector_table[TIMER_IRQ] = handler;
}

// 自定义的中断处理函数
void timer_irq_handler(void) {
    printf("定时器中断触发!\n");
}

int main() {
    // 注册中断处理函数(传递函数指针)
    register_interrupt_handler(timer_irq_handler);

    // 启动定时器,触发中断...
    return 0;
}

(3)动态插件系统

函数指针可以实现 “插件化” 架构:主程序定义接口(函数指针类型),插件实现具体功能并注册到主程序中。

示例:

#include <stdio.h>

// 定义插件函数指针类型(返回字符串描述)
typedef const char* (*PluginFunc)(void);

// 主程序:存储插件的数组
PluginFunc plugins[10] = {0};
int plugin_count = 0;

// 注册插件的函数(接收函数指针)
void register_plugin(PluginFunc plugin) {
    if (plugin_count < 10) {
        plugins[plugin_count++] = plugin;
    }
}

// 运行所有插件
void run_plugins() {
    for (int i = 0; i < plugin_count; i++) {
        printf("插件%d: %s\n", i+1, plugins[i]());
    }
}

// 插件1:实现具体功能
const char* plugin1_info(void) {
    return "我是插件1,功能:数据统计";
}

// 插件2:实现具体功能
const char* plugin2_info(void) {
    return "我是插件2,功能:图表绘制";
}

int main() {
    // 注册插件(传递函数指针)
    register_plugin(plugin1_info);
    register_plugin(plugin2_info);

    // 运行插件
    run_plugins();
    /* 输出:
       插件1: 我是插件1,功能:数据统计
       插件2: 我是插件2,功能:图表绘制
    */

    return 0;
}

8. 总结

函数指针是 C 语言中最灵活、最强大的特性之一,它的核心价值是让函数可以像变量一样被传递和调用。通过函数指针,我们可以实现回调函数、动态功能切换、插件系统等高级功能。

对于初学者,掌握函数指针的关键是:

  1. 理解函数指针的类型由 “返回值类型 + 参数列表” 决定。
  2. 掌握函数指针的声明、初始化和调用语法。
  3. 学会在实际场景中应用函数指针(如回调函数)。

 

 

 

 

用 “电影票” 类比,轻松理解函数指针

你可以把函数指针想象成一张 “电影票”—— 它的核心作用是“指向一个函数”,就像电影票上的 “座位号” 指向电影院里的一个具体座位。我们一步步拆解这个类比:

1. 先理解 “函数” 是什么?

函数是一段有特定功能的代码块。比如你写了一个函数 int add(int a, int b) { return a + b; },它的功能是 “计算两个数的和”。
这就像电影院里的 “放映厅”—— 每个放映厅(函数)有固定的 “功能”(放特定电影),比如 1 号厅放《流浪地球》,2 号厅放《星际穿越》。

2. 什么是 “函数的地址”?

当你在代码中写一个函数时,编译器会把这段代码翻译成机器指令,并把这些指令存放在内存的某个位置。这个内存位置的 “门牌号” 就是函数的地址。
就像每个放映厅(函数)在电影院(内存)里有一个唯一的 “房间号”(地址),比如 1 号厅在 3 楼 501 室,2 号厅在 3 楼 502 室。

3. 函数指针:指向函数地址的 “电影票”

函数指针是一个变量,它的作用是存储函数的地址。你可以把它想象成一张 “电影票”—— 票上印着 “3 楼 502 室”(函数地址),拿着这张票(函数指针),你就能找到对应的放映厅(函数),并 “看电影”(调用函数)。

4. 如何 “用函数指针调用函数”?

假设你有一张电影票(函数指针)指向 2 号厅(函数 add),那么 “用票看电影” 的过程就是:通过票上的地址找到放映厅,然后触发放映(调用函数)。
对应到代码里,就是通过函数指针存储的地址,找到函数的机器指令,然后执行这些指令(计算两个数的和)。

总结:函数指针的本质

函数指针 = 存储函数地址的变量 = 指向 “代码块位置” 的指针。
它的核心价值是:让函数像变量一样被传递和调用,这为 C 语言实现 “灵活的代码逻辑”(比如回调函数、动态功能切换)提供了可能。

 

【数据结构基础】指向函数的指针 指向函数的指针这一部分内容在学习数据结构的过程是有些必要的,因为在严蔚敏老师的《数据结构(C语言版)》一书中多次出现了这部分的内容。想要看懂具体的算法,这部分内容是不可或缺的。... 阅读详情

相关推荐

C语言函数指针详解

C语言函数指针 一、什么是函数指针 1.理解函数指针 ​ 函数指针,首先根据他的名称我们就大概可以了解到他是一个指针,是什么样的指针呢?是和函数有关的一种特殊的指针。 ​ 我们知道 int*p 是指向int型变量的指针,char*p是指向char型变量的指针,那么不难理解,函数指针就是一个指向函数的指针。 int arr[10]={0}; int *p = arr; ​ 我们知道,在数组中数组名就是首元素的地址。 ​ 那么试着猜猜看,函数的地址是什么样的情况呢。 ​ 我们不妨打印一下看看结果是什

gjr2333的博客 4358

函数指针定义与使用

函数指针定义与使用学习/复习

qq_58550520的博客 9453

【C语言】函数指针(指向函数的指针)

一、函数指针的定义 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,即指针指向该函数的内存首地址,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。 这种指针就是函数指针。 p=函数名;//p为指针变量 二、函数指针的定义形式 returnTy...

chengwei1128的博客 3227

函数指针和指针函数用法和区别

前言 函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。 今天这里只...

luoyayun361的专栏 31万+

C语言中的函数指针定义以及使用函数指针的示例

语言中,函数指针是一个指向函数的指针。这意味着你可以通过函数指针来调用函数,就像通过指针来访问数据一样。函数指针在需要动态地选择和执行函数时特别有用,例如在回调函数、函数表或动态链接库中。这个函数指针类型指向没有参数且返回类型为void的函数。定义两个函数,我们将通过函数指针来调用它们。使用while循环输出从10到0的数字。在这个例子中,我们首先定义了两个函数。使用printf函数输出两个数的和。头文件,它包含了标准输入输出函数(如。,并输出了相应的结果。在这个例程中,我们首先包含了。

2402_84885073的博客 1200

[RK3588从入门到精通] 专栏目录及介绍

[RK3588从入门到精通] 专栏目录及介绍

nb124667390的博客 6498

C语言-指针函数与函数指针

本文详细介绍了C语言中的指针函数和函数指针的概念及区别。指针函数是一个返回指针的函数,而函数指针是一个指向函数的指针变量。文中通过实例代码解释了两者的定义、用法和如何通过它们调用函数。此外,还探讨了指针的指针和指向指针数组的指针的应用,帮助读者深入理解C语言中指针的高级用法。

让你爱上电路设计 2万+

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 265

详解C语言指针函数、函数指针、函数指针数组

在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数...

一只大笨猫的博客 2万+

从MRF8P9040N数据手册到ADS仿真:手把手教你搞定LDMOS功放设计(附完整模型下载)

本文详细解析了MRF8P9040N LDMOS功率放大器的数据手册关键参数,并提供了在ADS中进行仿真的完整指南。从模型导入、直流工作点验证到负载牵引与阻抗匹配设计,逐步指导工程师完成高效功放设计。文章还包含调试技巧和常见问题解决方案,帮助优化射频功放性能。

weixin_27015733的博客 489

从零到一:EHB-电机复合制动系统的Simulink仿真实战指南

本文详细介绍了EHB-电机复合制动系统在纯电动汽车中的Simulink仿真实战指南。通过系统概述、建模核心模块解析、控制策略开发及典型问题排查,帮助读者掌握从零到一的开发流程。重点讲解了液压子系统建模、电机再生制动模型及整车动力学集成,为开发者提供了一套完整的解决方案。

hh234的博客 1007

掌握指针进阶:一篇带你玩转函数指针、函数指针数组及指向函数指针数组的指针!!

数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组//数组的每个元素是int*那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?答案是:parr1parr1先和[]结合,说明parr1是数组,数组的内容是什么呢?是int (*)()类型的函数指针。转移表总之,函数指针数组实际上是一个数组,其元素都是指向函数的指针。这使得我们可以将不同的函数存储在数组中,并通过索引来调用特定的函数。

深入解析C/C++编程技巧,带你探索高效开发之路 1408

C++ 核电站

问题描述 一个核电站有n个放核物质的坑,排列在一条直线上。如果连续m个坑中放入核物质就会发生爆炸,所以某些坑中不能放核物质。 本题的任务:对于给定的n和m,求不发生爆炸的放置核物质的方案总数。 输入格式 第一行两个正整数n和m,之间用一个空格隔开。2≤n≤50,2≤m≤5。 输出格式 一行一个正整数,表示方案总数。 输入样例 4 3 输出样例 13 数据规模与约定 2≤n≤50,2≤m≤5 CODE #include<bits/stdc++.h> using namespace

HybridCOW_HORSE的博客 1803

(使用C语言详解)指针数组、数组指针、函数指针、函数指针的数组、指向函数指针数组的指针

本文主要讲解了C语言中的五种指针类型:指针数组、数组指针、函数指针、函数指针的数组以及指向函数指针数组的指针。这些指针类型在C语言编程中有着广泛的应用,掌握它们对于深入理解C语言以及进行高效的C语言编程都具有重要意义。指针数组是一种数组,其元素为指针;数组指针则是一个指向数组的指针,它可以指向数组的首地址,也可以指向数组的任一元素。函数指针则是指向函数的指针,通过它我们可以调用函数。函数指针的数组则是一个数组,其元素为函数指针;指向函数指针数组的指针则是一个指针,它指向函数指针数组。

StarPrayers.的博客 6326

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 764

保姆级教程:用Adams/Car和Simulink搞定你的第一个整车联合仿真(附模型文件)

本文提供了一份详尽的Adams/Car与Simulink联合仿真教程,涵盖从环境配置到模型导出的全流程。通过实战案例解析,帮助工程师快速掌握多体动力学仿真与控制算法开发的集成技术,特别适合汽车工程领域的初学者。文章还包含常见问题解决方案和性能优化建议,助您高效完成整车联合仿真项目。

weixin_29663861的博客 337

C语言指针进阶之三——函数指针、函数指针数组、指向函数指针数组的指针

平常我们说这样一个类型比如:unsigned int这个类型,我们觉得每次书写都太长了很麻烦,那我们就可以进行类型重定义:那么下次我们书写的时候就可以使用uint来代替unsigned int,使得类型简化。同样的,对于指针类型也可以重定义,比如将int *重定义那么原来的:int * p1就可以改写为: ptr p1同理,也可以对我们的数组指针或者函数指针类型进行重定义,但是稍微不同的是,重定义的类型名要和*在一起。比如:这是一个数组指针类型:int (*)[10];如何进行类型重定义?

m0_71503225的博客 6628

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4136

C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

文章目录1. 函数指针1)函数指针的例题2. 指针函数3. 函数指针数组1)函数指针数组的用途4. 指向函数指针数组的指针5. 一些后话 1. 函数指针 函数指针就是指向函数的指针;本质上还是一个指针 首先我们要知道函数的地址就是函数名,取地址函数名也是函数的地址;这两个方式事等价的 类如: int Add(int x, int y) { return x + y; } # include<stdio.h> int main() { int(*p)(int, int) = Add; //这里

呋喃吖的博客 2124

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【C语言 | 指针】函数指针详解

👉本文介绍C语言的函数指针,函数指针的定义、函数指针的使用、函数指针数组、函数指针数组的指针。

wkd_007的博客 3266

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C语言:函数指针与指针函数

C语言:函数指针与指针函数

嵌入式学习记录站点 7499

C语言函数指针详解:指向函数的指针

函数指针是一种特殊类型的指针,它指向程序中的函数而不是变量。函数指针允许我们在运行时动态地选择调用哪个函数。本文将深入讨论函数指针的用法,通过示例代码详细说明其应用。: 定义一个求两数和的函数。: 定义一个打印字符串的函数。

2302_78381559的博客 3234

C语言——函数指针——函数指针变量(详解)

函数指针是指向函数的指针变量。它可以用来存储函数的地址,从而可以通过指针调用函数。返回类型 (*指针变量名)(参数列表);其中,返回值类型是函数的返回值类型,指针变量名是函数指针的名称,参数列表是函数的参数类型和个数。例如,我们有一个函数 add,它接受两个整数参数并返回它们的和。我们可以声明一个函数指针 p 来指向该函数:// 声明一个函数指针变量pp = add;// 将函数add的地址赋值给p// 通过函数指针调用add函数。

Jason_from_China的博客 2361

c语言-函数指针

本篇文章介绍c语言中的函数指针以及函数指针的应用。

pyc68的博客 3611

【C语言】:详解函数指针变量,函数指针数组及转移表

什么是函数指针变量呢? 前面我们已经了解了整型指针与函数指针,通过类比我们可以知道:函数指针变量是用来存放函数的地址的,未来通过地址能够调用函数。那么函数是否有地址呢?并且通过类比数组,函数名与&函数名的值是否有区别呢? 我们来测试一下: 输出结果:我们发现两者的值是一模一样的。 我们知道数组名一般表示首元素地址,&数组名表示整个数组的地址,两者的值虽然一样,但是意义是完全不同的。 而函数名和&函数名表示的都是函数的地址,两者的意义完全相同,没有区别。如果我们要将函数的地址存放起来,就必须要创建函数指针变量

2301_77900444的博客 1263

C 语言 —— 函数指针

复习一下 C 语言的指针中的 函数指针 ...... 矜辰所致

不浮夸,不将就,认真对待学知识的我们 1375
上一篇: 【C语言入门】可变参数函数:stdarg.h头文件(va_list, va_start, va_arg, va_end)
下一篇: 【C语言入门】自定义函数的模块化设计原则
Mr_-G
Mr_-G 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄6年 7917粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值