C语言:指针(函数回调)

1.说实话:C语言的字符指针、数组指针、指针数组、数组传参和指针传参,多注意就可以搞定,实在不行C++也可以逃过去;但是函数指针,函数回调不行;尽管C++有仿函数可以逃过去,但是绝对跑不了,Linux也是如此;我从头开始学,学到C++最后,以及LInux也没跑了;还是得重新洗牌,重新来;望大家注意;

2.函数指针

#include <stdio.h>
void test(int,int)
{
 printf("hehe\n");
}
int main()
{
 printf("%p\n", test);
 printf("%p\n", &test);
 
 void      (*pf)        (int,int)=&test;
//返回类型; *pf是个指针;   参数  


 return 0;
}

//函数名是函数的地址;
//&函数名也是函数的地址;
如果我要把函数的地址存起来,那么应该怎样写

 2.1练习;

//练习

void test(char* pc,int arr[10])
{}

int main()
{
	void (*pf)(char*, int [10]) = test;

    void (*pf)(char*, int []) = test;//不写10也可以

    void (*pf)(char*, int*) = test;//数组的本质是指针

	return 0;
}

2.2调用

#include<iostream>

void test(int a,int b)
{
	printf("hello Linux\n");
}
int test1(int a)
{
	return a;
}
int main()
{
	void (*pf)(int,int) = test;
	int (*pf1)(int) = test1;
	pf(1, 2);

	int m = pf1(2);
	int n = (*pf1)(2);//这两种都可以,加*一定要带括号;

	printf("%d\n",pf1(2));

	return 0;
}

2.3练习

(*(void (*)())0)();

//void (*)()  ——指针类型
//()0   强转
//把0强转成该函数指针类型的指针,并调用0地址处的函数;
//调用0地址处的函数;
//signal是一个函数声明;
//signal函数有2个参数,第一个参数类型是int,第二个参数类型是void(*)(int)函数指针类型
//第二个函数指针指向的函数有一个int类型的参数,返回类型是void
//signal 返回类型也是 void(*)(int)函数指针类型,函数指针指向的函数有一个int类型的参数,返回类型是void
//signal返回的是一个函数指针;
int main()
{
	void (*signal(int, void(*)(int)))(int);

    //结合typedef的解释再变
    typedef void(*p)(int);
    p signal(int ,p);  //但是非常不好理解;

	return 0;
}

2.4 typedef

2.4.1重命名:这个很常见,将一个长的名字改成短的

typedef int datatype ;

2.4.2使用typedef 定义结构体

tepedef struct
{
int id;
}student;

2.4.3使用typedef 定义指针类型

typedef int (*p)[10] ;   //定义数组类型;p是数组类型;

typedef void(*pf)(int ,int);  //定义函数指针类型  pf是函数指针类型名

//本来是typedef void(*)(int ,int) pf; //把函数指针类型重定义为pf
                                    //这样写是错的,语法不允许,所以把pf放 * 后

2.5那么函数回调,就是在此基础上,把函数当成变量参数,输入到另一个函数中调用,叫做函数回调;

相关推荐

  1. C语言指针函数

    2024-06-09 21:34:02       17 阅读
  2. C语言函数指针函数

    2024-06-09 21:34:02       30 阅读
  3. C++ 函数指针函数

    2024-06-09 21:34:02       28 阅读
  4. C 函数指针函数

    2024-06-09 21:34:02       19 阅读
  5. C语言中的函数指针指针函数函数

    2024-06-09 21:34:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 21:34:02       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 21:34:02       5 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 21:34:02       4 阅读
  4. Python语言-面向对象

    2024-06-09 21:34:02       5 阅读

热门阅读

  1. 【人工智能】AI绘画工具基本介绍

    2024-06-09 21:34:02       16 阅读
  2. 通俗易懂分析Docker中镜像和容器

    2024-06-09 21:34:02       15 阅读
  3. C++单例模式

    2024-06-09 21:34:02       13 阅读
  4. 语音合成

    2024-06-09 21:34:02       15 阅读
  5. 单链表的实现

    2024-06-09 21:34:02       16 阅读
  6. Jupyter | 如何在Jupyter应用中添加、删除虚拟环境

    2024-06-09 21:34:02       13 阅读
  7. Apache Doris 2.0.11 版本正式发布

    2024-06-09 21:34:02       14 阅读
  8. IntelliJ IDEA安装

    2024-06-09 21:34:02       14 阅读
  9. OnlyOwner在Solidity中是一个修饰符,TypeError:

    2024-06-09 21:34:02       14 阅读
  10. 【C/C++】C语言实现std::move

    2024-06-09 21:34:02       15 阅读