C零基础视频-38-函数指针与typedef

目录

  • 函数指针的定义
  • 函数指针的复杂性
  • typedef

函数指针的定义

函数在内存中也是有地址的:

#include <stdio.h>

void fun()
{
    printf("hello, world\r\n");
}

int main(int argc, char* argv[])
{
    printf("%p\r\n", fun);
    return 0;
}

既然有地址,就可以定义指针存储改地址,存储函数(首)地址的指针,称为函数指针

函数指针的定义有些特别,比如,定义一个可以指向返回值为int,有一个int参数的函数的指针,声明如下:

#include <stdio.h>

int fun(int arg)
{
    printf("hello, world\r\n");
}

int main(int argc, char* argv[])
{
    int(*pfn)(int) = NULL;
    pfn = fun;
    return 0;
}

函数指针的声明,可以按以下步骤完成:

  • 先写出目标函数的原型
  • 将目标函数的函数名改为函数指针变量名
  • 为“*”号和函数名加括号

函数指针的复杂性

想象一下,如果我们定义了一个函数,其参数是一个函数返回值也是一个函数,原型分别为:

  • 参数:无参数,无返回值
  • 返回值:有一个int参数,有一个int返回值

最终完成声明的代码类似如下:

#include <stdio.h>
#include <signal.h>

void FunArg()
{
    printf("我是没有参数没有返回值的函数\r\n");
}

int FunReturn(int arg)
{
    printf("我是int参数,int返回值的函数\r\n");
    return 0;
}

int(*MyFunction(void (* pArg)(void) ))(int)
{
    printf("我是参数及返回值都是函数的函数\r\n");
    return FunReturn;
}

int main(int argc, char* argv[])
{
    MyFunction(FunArg);
    return 0;
}

因为C语言中函数指针的变量名不处于最末尾,所以函数指针类型组合在一起,显得非常怪异。
为了简化,我们可以使用typedef语法。

typedef

typedef是声明别名的关键字,我们可以使用typedef,为类型起别名
基本语法是:

typedef <原类型名> <新别名>

新别名的效果与原类型名效果一样

typedef int MYINT;

int main(int argc, char* argv[])
{
    MYINT value = 5;
    return 0;
}

使用typedef可以增强代码的可读性。
特别是对于函数指针而言,函数指针起别名较为特殊,它没有所谓原类型名,typedef之后解的标识符就是新的别名,比如,使用typedef简化我们之前的代码:

#include <stdio.h>
#include <signal.h>

void FunArg()
{
    printf("我是没有参数没有返回值的函数\r\n");
}

int FunReturn(int arg)
{
    printf("我是int参数,int返回值的函数\r\n");
    return 0;
}

typedef void(*PFN_ARG)(void);
typedef int(*PFN_RETURN)(int);

PFN_RETURN MyFunction(PFN_ARG arg)
{
    printf("我是参数及返回值都是函数的函数\r\n");
    return FunReturn;
}

int main(int argc, char* argv[])
{
    MyFunction(FunArg);
    return 0;
}

代码的功能与之前完全一样,但是可读性增强了很多。

原文地址:https://www.cnblogs.com/shellmad/p/11695642.html

时间: 2024-08-30 14:49:57

C零基础视频-38-函数指针与typedef的相关文章

C零基础视频-34-通过指针实现函数交换两个变量的值

目录 回顾:函数的值传递 使用指针交换两个变量的值 回顾:函数的值传递 因为函数的调用过程中,实参到形参是值传递,因此,改变形参,是无法影响到实参的: #include <stdio.h> void FakeSwap(int nArg1, int nArg2) { int nTemp = nArg1; nArg1 = nArg2; nArg2 = nTemp; } int main(int argc, char* argv[]) { int nValue1 = 100; int nValue2

【C++ 基础 11】 函数指针总结

在家学习的效率真是惨不忍睹.. =========================== 1 指针函数 int* f(int a, int b); 返回一个指向int类型的指针. 2 函数指针 2.1 声明 返回类型 (*函数名)(参数列表); 2.2 示例 int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int (*f)(int, int); // 声

PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

<?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo "<br />"; echo "<hr />"; } say_hello();//函数调用 function say_helloS($some_name)//有参数 { echo "hello,".$some_name; echo

C/C++基础知识:函数指针和指针函数的基本概念

[函数指针] 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针. 1.函数指针定义 函数类型 (*指针变量名)(形参列表): “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表. 例如: int (*f)(int x); double (*pt

c语言定义函数指针和typedef简写

二种方法来定义函数指针 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 int add(int a, int b) 6 { 7 return a + b; 8 } 9 10 //void msg(char s[]) 11 //void (*p)(char s[]) 函数指针的定义方法 12 //void (*)(char *s) 函数指针的类型 13 14 void msg(char

结构体中函数指针与typedef关键用途(函数指针)

// 结构体函数指针.  #include<stdio.h> //为了代码的移植考虑,一般使用typedef定义函数指针类 ,另一个好处是,减少代码的书写量.  typedef void (*shout)(char *name,int age); typedef struct {  //用指针来存储字符串     char *name;    int age ;    shout personinfo; }person; //类似于c++中类方法的实现,在这里,是为结构体中指针函数提供实现.在

函数指针的typedef

1.定义函数的指针类型: 就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量. 一个自定义数据类型的例子. typedef int* PINT; //为int* 类型定义了一个PINT的别名 int main() { int x; PINT px=&x; //与int * px=&x;是等价的.PINT类型其实就是int * 类型 *px=10; //px就是int*类型的变量 return 0; } 看一下函数指针类型的定义及使用: void M

函数指针与typedef

#include<bits/stdc++.h> using namespace std; //定义一个函数指针 typedef int (*Fun)(int,int); 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 _div(int a,int b){return b?a/b:-1;} Fun fun(char op) { swi

C零基础视频-40-结构体指针

目录 结构体指针的定义 使用结构体指针引用结构体成员 结构体指针作为函数参数传递 结构体指针的定义 结构体指针的定义与基本数据结构的指针类似,使用"*"符号即可: #include <stdio.h> struct tagPetDog{ char szName[20]; char szColor[20]; char nWeight; }; int main(int argc, char* argv[]) { tagPetDog dog = { "旺财",