C语言——函数指针类型转换

这篇具有很好参考价值的文章主要介绍了C语言——函数指针类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  昨天为了避免跨层调用API搞了个回调函数,用了函数指针,因为参数类型的问题总是编译报错,今天就看了两篇博文学习学习,顺便做做笔记。

  其实正常来讲只要把函数指针的参数个数、类型和返回值这些函数指针的标签或者说是属性写对了的话就不会有社么问题,但我也不知道怎么着就会报错【擦汗】

  正好趁着这个机会好好了解一下函数的用时的栈空间和函数指针的使用。

1、函数指针

  函数名本就是一个常量指针常量,指向代码区的函数本体,带有一些属性(标签),就类似于“ int * ”带有的属性是“ int ”。

  函数指针是和某个函数带有相同属性的指针,函数指针被赋值后同样指向代码区的函数本体。

  更改函数指针的属性(参数、返回值)并不影响这个指针指向函数本体。

2、参数传递

  猜测在同一线程中所有函数传参使用的栈空间的起始地址都是同一个。

同一线程:

 1 #include <stdio.h>
 3 
 4 void fi3(int a, int b, int c)
 5 {
 6     printf("fi3:\t");
 7     printf("%d, %d, %d\n", &a, &b, &c);
 8 }
 9 
10 void mpp(int a, int b,int c)
11 {
12     printf("mpp:\t");
13     printf("%d, %d, %d\n", &a, &b, &c);
14 }
15 
16 
17 int main()
18 {
19     void (*I3)(void) = (void (*)(void))fi3;
20     I3();
21     mpp(7,8,9);
22     return 0;
23 }
24 
25 编译运行:
26 PS F:\tinyxml_2_6_2\tinyxml> gcc .\main.cpp -o pmain
27 PS F:\tinyxml_2_6_2\tinyxml> .\pmain.exe
28 
29 输出结果:
30 fi3:    6422272, 6422276, 6422280
31 mpp:    6422272, 6422276, 6422280

 

不同线程:

#include <stdio.h>
#include <pthread.h>

void mpp(int a, int b,int c)
{
    printf("mpp:\t");
    printf("%d, %d, %d\n", &a, &b, &c);
}

void *pthreadFun(void *arg)
{
    mpp(7,8,9);
}


int main()
{
    float val1 = 1.23;
    float val2 = 2.34;
    void *statRet = nullptr;
    pthread_t tid[2] = {0};
    pthread_create(&tid[0], nullptr, pthreadFun, (void *)&val1);
    pthread_create(&tid[1], nullptr, pthreadFun, (void *)&val2);
    pthread_join(tid[0], &statRet);
    pthread_join(tid[1], &statRet);
    return 0;
}

编译运行:
PS F:\tinyxml_2_6_2\tinyxml> gcc .\main.cpp -o pmain -lpthread
PS F:\tinyxml_2_6_2\tinyxml> .\pmain.exe

输出:
mpp:    15597240, 15597244, 15597248
mpp:    17694392, 17694396, 17694400

此处贴图表示线程内函数参数栈空间(我用的是Windows的gcc的编译环境,地址):

C语言——函数指针类型转换

 3、函数调用

  调用函数时会先将函数形参复制到参数栈空间中,再执行代码区中的函数体。

  函数参数是存在最小传递单位的,这里是4字节,可能与进程4G地址空间或是32位CPU带宽是4byte有关系,这里先留个坑。

  每次调用函数参数栈空间中的数据不会被全部置位,而是用到那个单元格的空间就把那个单元格(最小单位)的空间用新的参数覆盖。

#include <stdio.h>

void fc3(char a, char b, char c)
{
    printf("fc3:\t");
    printf("%d, %d, %d\n", a, b, c);
}

void fi3(int a, int b, int c)
{
    printf("fi3:\t");
    printf("%d, %d, %d\n", a, b, c);
}

int main()
{
    fc3(1, 2, 3);
    void(*F3)(int) = (void (*)(int))fi3;
    F3(66);
    return 0;
}

编译运行:
PS F:\tinyxml_2_6_2\tinyxml> gcc .\main.cpp -o pmain
PS F:\tinyxml_2_6_2\tinyxml> .\pmain.exe

输出结果:
fc3:    1, 2, 3
fi3:    66, 2, 3

 

关于三篇大佬的博客:

函数栈帧(详细图解)_函数调用栈帧过程(带图详解)-CSDN博客

关于函数指针类型强制转换的一些摸索-CSDN博客

函数指针的强制类型转换与void指针_函数指针的强制转换-CSDN博客文章来源地址https://www.toymoban.com/news/detail-794373.html

到了这里,关于C语言——函数指针类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】异常+智能指针+特殊类和类型转换

    上天可能觉得我太孤独,派你来和我一起对抗虚无。 1. C语言传统处理错误的方式无非就是返回错误码或者直接是终止运行的程序。例如通过assert来断言,但assert会直接终止程序,用户对于这样的处理方式是难以接受的,比如用户误操作了一下,那app直接就终止退出了吗?这

    2024年02月08日
    浏览(32)
  • C++ 依赖类型 函数指针

    依赖类型是指在模板编程中,类型依赖于模板参数的一种特殊类型, 它是通过使用模板参数来定义的, 而不是显示地指定类型。由于模板参数可以是任何类型,编译器在实例化模板时无法确定依赖类型的具体定义和属性。当使用依赖类型的时候需要使用typename来告诉编

    2024年02月14日
    浏览(30)
  • Python类型转换,数据类型转换函数大全 与 strip()函数介绍

    虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换。 比如说,我们想通过使用 print() 函数输出信息“您的身高:”以及浮点类型 height 的值,如果在交互式解释器中执行如下代码: 会发

    2024年01月24日
    浏览(38)
  • 【C语言】初阶指针(指针及其类型以及野指针)

    简单不先于复杂,而是在复杂之后。 目录 1. 指针是什么? 2. 指针和指针类型  2.1  指针+-整数 2.2 指针的解引用  3. 野指针  3.1 野指针成因  3.2 如何规避野指针  指针理解的两个要点: 1. 指针是内存中最小单元的编号,也就是地址。 2. 平时口语中说的指针,通常指的是指

    2023年04月16日
    浏览(39)
  • 【进阶C语言】进阶指针--学会所有指针类型

     本节内容大致目录: 1.字符指针 2.指针数组(数组) 3.数组指针 (指针)--比较重要 4.函数指针--比较重要 5.函数指针数组--用的较少 6.指向函数指针数组的指针--只需要了解就可以 需要掌握每一种类型的符号和用处。 前言:字符指针是一种指针,是众多指针类型中的一种。

    2024年02月07日
    浏览(28)
  • 单片机中绝对地址转换为函数指针

    一、相关概念  函数指针 和 指针函数 是两个不同的概念。   函数指针是指可以指向函数的指针 ,它的类型与函数的返回值类型和参数类型相对应。通过函数指针,可以实现函数的回调和动态调用等功。   指针函数则是指返回指针类型的函数,它的返回值是一个指针,可以

    2024年02月12日
    浏览(21)
  • C语言指针2大问题:指针类型有什么用?指针如何运算?

    如题,本篇博客主要解决2个疑点:指针类型的用处,指针如何运算。 C语言中的指针类型,在X86环境下大小是4个字节,在X64环境下大小是8个字节。既然指针的大小和指针类型无关,那么指针类型究竟有什么用呢? 事实上,指针类型决定 看待内存的视角 ,具体是以下2点:

    2023年04月26日
    浏览(29)
  • C语言:指针类型的意义

    1.指针的类型决定了解引用时访问几个字节 2.指针的类型决定了指针+1、-1跳过几个字节 一、指针的类型决定指针解引用时访问几个字节 例如 int 型指针解引用时访问4个字节         char 型指针解引用时访问1个字节   详解代码如下: int b = 0x11223344(十六进制,小端存储,实

    2024年02月11日
    浏览(27)
  • C语言的函数指针、指针函数, 函数数组

    是指向函数的指针,它允许您在程序运行时动态选择要调用的函数。函数指针可以像普通变量一样传递、存储和使用,这使得它们在许多编程场景中非常有用,如回调函数、函数表、插件架构等。 以下是一个简单的例子来说明函数指针的概念: 函数数组是一个数组,其中的

    2024年02月09日
    浏览(30)
  • 【C语言】——认识指针变量和地址,以及指针变量类型的意义

    🎥 岁月失语唯石能言的个人主页         🔥 个人栏专: 秒懂C语言 ⭐ 若在许我少年时,一两黄金一两风      目录 前言 一、指针变量和地址 1.1 取地址操作符() 1.2 指针变量和解引用操作符(*) 1.2.1 指针变量 1.2.2 如何拆解指针类型 1.2.3 解引用操作符 1.3 指针变量

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包