首页 > 其他分享 >C语言 | C语言中的四种特殊函数

C语言 | C语言中的四种特殊函数

时间:2023-03-27 15:02:51浏览次数:48  
标签:__ fly addr int value C语言 四种 函数


目录

1.递归函数

2.变参函数

3.回调函数

4.内联函数

5.拓展


1.递归函数

与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段。
递推阶段----终止条件----》回归阶段

/*******************************************************************
 *   > File Name: recursive.c
 *   > Author: fly
 *   > Create Time: 2021-06-15  2/24  12:33:32 +0800
 *================================================================*/
#include <stdio.h>

void recursive_func(int n)
{
    printf("----> n = %d\n", n);
    n --;
    if (n > 0)
    {
        recursive_func(n);
    }
}

int main(int argc, char* argv[])
{
    recursive_func(5);

    return 0;
}

编译、运行:

[fly@fly-vm test]$ make recursive
gcc -o recursive recursive.c -g -Wall
[fly@fly-vm test]$ ./recursive
----> n = 5
----> n = 4
----> n = 3
----> n = 2
----> n = 1

分析执行过程如下:

C语言 | C语言中的四种特殊函数_c语言

2.变参函数

与普通函数比较,定义形式不同,例如: int printf(const char *format, ...);
 

/*******************************************************************
 *   > File Name: myprintf.c
 *   > Author: fly
 *   > Create Time: 2021-06-15  2/24  13:38:19 +0800
 *================================================================*/

#include <stdio.h>
#include <stdarg.h>

void myprintf(int n, ...)
{
    va_list p;
    int i;

    va_start(p, n);
    for(i = 0; i< n; i++)
    {
        printf("%d\t", va_arg(p, int));
    }
    printf("\n");
    va_end(p);
}

int main(int argc, char* argv[])
{
    myprintf(5, 10, 11, 12, 13, 14);

    return 0;
}

编译、运行:

[fly@fly-vm test]$ make myprintf
gcc -o myprintf myprintf.c -g -Wall
[fly@fly-vm test]$ ./myprintf
10      11      12      13      14

3.回调函数

与普通函数比较,调用过程不同,所谓的回调函数,指的是不直接在程序中显式地调用,而是通
过调用其他函数返过来调用的函数,例如:
 

/*******************************************************************
 *   > File Name: callback.c
 *   > Author: fly
 *   > Create Time: 2021-06-15  2/24  13:44:23 +0800
 *================================================================*/

#include <stdio.h>

void callback(void)
{
    printf("Hello, world.\n");
}

void print(void (*p)(void))
{
    p();
}

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

编译、运行:

[fly@fly-vm test]$ make callback
gcc -o callback callback.c -g -Wall
[fly@fly-vm test]$ ./callback
Hello, world.

4.内联函数

与普通函数比较,调用过程不同,定义的位置不同,例如:
1》调用为复制的过程
2》结合了普通函数和带参宏的优点的一种函数。
 

#ifndef __IO_H__
#define __IO_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <types.h>

/*
 * read a byte value from address.
 */
static inline u8_t __readb(ptrdiff_t addr)
{
	return( *((volatile u8_t *)(addr)) );
}

/*
 * read a word value from address.
 */
static inline u16_t __readw(ptrdiff_t addr)
{
	return( *((volatile u16_t *)(addr)) );
}

/*
 * read a long value from address.
 */
static inline u32_t __readl(ptrdiff_t addr)
{
	return( *((volatile u32_t *)(addr)) );
}

/*
 * write a byte value to address.
 */
static inline void __writeb(ptrdiff_t addr, u8_t value)
{
	*((volatile u8_t *)(addr)) = value;
}

/*
 * write a word value to address.
 */
static inline void __writew(ptrdiff_t addr, u16_t value)
{
	*((volatile u16_t *)(addr)) = value;
}

/*
 * write a long value to address.
 */
static inline void __writel(ptrdiff_t addr, u32_t value)
{
	*((volatile u32_t *)(addr)) = value;
}

#define readb(a)		__readb(a)
#define readw(a)		__readw(a)
#define readl(a)		__readl(a)

#define writeb(a, v)	__writeb(a, v)
#define writew(a, v)	__writew(a, v)
#define writel(a, v)	__writel(a, v)

#ifdef __cplusplus
}
#endif

#endif /* __IO_H__ */

内联函数 —— C 中关键字 inline 用法解析

5.拓展

1.C 语言回调函数详解

2.C语言 | 编程技巧-跳转表

3.C语言 | 回调函数实践实例

标签:__,fly,addr,int,value,C语言,四种,函数
From: https://blog.51cto.com/u_13472468/6152136

相关文章

  • mysql 省事方便的函数
    1、group_concat在我们平常的工作中,使用groupby进行分组的场景,是非常多的。比如想统计出用户表中,名称不同的用户的具体名称有哪些?sql:  select name from `user`......
  • 如何编写一个arrange 函数
    /***@description链式调用的方法*@param{*}taskIs*@example*arrange('arrage').waitFirst(2).do('吃西瓜').do('吃西瓜2').execute()*@returns{exec......
  • C语言学习记录(七)
    C语言学习记录(七)一、知识要点(函数)一、函数的作用在一个应用程序中的若干个功能相互独立,可单独操作的程序单元叫做模块。在C语言中用函数实现模块的功能,将这些模块构成......
  • Oracle-nvl函数的使用(及其相似函数)
    Oracle中的nvl函数使用//SQL实例selectNVL("字段名称",指定常量)from"表名";//结构拆解NVL("数据1","数据2");代码解释上述SQL的含义是指,从指定表中查出指定字段......
  • Oracle中nvl()与nvl2()函数详解
    1.nvl:根据参数1是否为null返回参数1或参数2的值【函数格式】:nvl(expression1,expression2)【函数说明】:若expression1值为null,则该函数返回expression2;若expression1......
  • python 类的方法与普通函数的区别
    引用菜鸟教程中所说:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,按照惯例它的名称是self。下面我就写了个类的构造方法和类的方法,......
  • Delphi Locate函数[1] - 查询、定位
     DelphiTDataSet.Locate函数-查询、定位使用ADO等数据控件的时候,经常会用到 locate函数,在结果数据集中查询和定位,下面介绍一下:原型:1function Locat......
  • Linux函数之lseek、stat、lstat
    Linux函数之lseek、stat、lstat的简单介绍lseek函数在Linux终端下输入命令:man2lseek,可以查看具体函数信息#include<sys/types.h>#include<unistd.h>......
  • C#:C#终结器(析构函数)
    C#终结器是一种特殊的方法,它在对象被垃圾回收之前被调用。它可以用来释放非托管资源,如文件句柄、数据库连接等。在C#中,终结器是通过在类的定义中添加一个名为“~类名”的......
  • css-6个可以在css属性中使用的函数
    1-calc计算结果div{width:calc(100vm-50px);}2-var它可以将CSS变量的值赋予属性:root{--main-bg-color:coral;--main-padding:15px;}div{backgro......