day3 函数的定义和调用,练习编写简单的程序(记录1)

一、函数的定义

可以分为以下两种:

1、函数声明和函数定义分离

这种方法将函数声明和函数定义分开,通常在头文件中先声明函数原型,然后在源文件中实现函数定义。

例如,头文件 example.h 中声明了一个函数 add:

#ifndef EXAMPLE_H
#define EXAMPLE_H

int add(int a, int b);  // 声明函数原型

#endif //EXAMPLE_H 

然后在源文件 example.c 中实现函数定义:

#include "example.h"
int add(int a, int b) {  // 实现函数定义
    return a + b;
}

这种方法可以使得代码更加模块化,便于维护和重用。

函数声明和函数定义结合在一起

这种方法将函数声明和函数定义结合在一起,通常在源文件中直接实现函数定义。

int sub(int a, int b) {  // 函数声明和定义结合在一起
    return a - b;
}

这种方法比较简单,但是当函数需要在多个源文件中使用时,需要在每个源文件中都复制一份函数定义。

总之,不管是哪一种方法,函数的定义都包含函数名、参数列表和函数体三部分,通过定义函数来实现特定的功能。在编写函数时,需要考虑函数的输入、输出以及具体实现逻辑,保证程序的正确性和效率。

二、函数的调用

可以分为以下两种方式:

普通函数调用

普通函数调用是指通过函数名加括号的方式来调用函数,例如:

int a = 10, b = 5;
int result = add(a, b);  // 调用 add 函数计算 a + b 的值,并将结果赋值给变量 result

在这个例子中,我们使用 add(a, b) 的方式来调用 add 函数,并将计算结果赋值给变量 result。

通过函数指针调用函数(法1)

另一种方式是通过函数指针来调用函数。函数指针是一个指向函数的指针变量,可以存储函数的入口地址。

例如,假设有以下函数:

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

我们可以定义一个函数指针变量 pfunc,并将其赋值为 add 函数的入口地址:

//int (*pfunc)(int, int);  // 定义函数指针变量
//int* pfunc(int, int)     //我的理解定义一个函数指针
pfunc = add;  // 将函数指针赋值为 add 函数的入口地址

然后,我们可以通过 (*pfunc)(a, b) 的方式来调用 add 函数,例如:

int a = 10, b = 5;
//我的理解的通过*pfunc解引用
int result = (*pfunc)(a, b);  // 通过函数指针调用 add 函数计算 a + b 的值,并将结果赋值给变量 result

在这个例子中,我们首先定义了一个函数指针变量 pfunc,然后将其赋值为 add 函数的入口地址。接着,我们使用 (*pfunc)(a, b) 的方式来调用 add 函数,并将计算结果赋值给变量 result。

通过函数指针调用函数(法2)

通过函数指针调用函数的另一种写法是使用 typedef 关键字来定义函数指针类型。具体步骤如下:

使用 typedef 定义函数指针类型。

typedef int (*pfunc)(int, int);

上述语句定义了一个名为 pfunc 的函数指针类型,它表示一个接收两个 int 类型参数并返回 int 类型值的函数。

声明函数指针变量并赋值。

pfunc ptr = add;

这行代码声明了一个名为 ptr 的函数指针变量,并将其赋值为 add 函数的地址。

通过函数指针调用函数。

int result = ptr(a, b);

这行代码通过函数指针 ptr 调用 add 函数,并将计算结果赋值给 result 变量。

完整的代码示例如下:

#include <iostream>
using namespace std;

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

typedef int (*pfunc)(int, int);

int main() {
    int a = 10, b = 5;
    pfunc ptr = add;
    int result = ptr(a, b);
    cout << result << endl;  // 输出 15
    return 0;
}

通过使用 typedef 关键字可以定义函数指针类型,从而使得函数指针的声明和使用更加方便。

总之,不管是哪一种方式,都可以实现对函数的调用。但是需要注意的是,当函数的参数列表较长时,使用函数指针来调用函数可能会比较繁琐,此时应该使用普通函数调用来简化代码。

原文链接:https://www.cnblogs.com/share0956/p/17277123.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:day3 函数的定义和调用,练习编写简单的程序(记录1) - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Qt-FFmpeg开发-音频解码为PCM文件(9)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 1、概述 2、实现效果 3、主要代码 4、完整源代码 更多精彩内容 ?个人内容分类汇总 ? ?音视频开发 ? 1、…

    C++ 2023年4月17日
    00
  • 非常可乐

    题目描述 大家一定觉得运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为\(S (S < 101)\)毫升 (正好装满一瓶) ,它们三个之间可…

    C++ 2023年4月27日
    00
  • 【Visual Leak Detector】核心源码剖析(VLD 1.0)

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇对 VLD 1.0 源码做内存泄漏检测的思路进行剖析。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 源码获取 2. 源码文件概览 3. 源码剖析 3.1 注册自定义 AllocHook 函数 3.2 存储调用堆栈信息 3.3 生成泄漏检测报告 4. 其他问题 4.1 如何区分…

    C++ 2023年4月27日
    00
  • C++的拓扑排序实现

    template<typename T = CString, typename _Data = CString> struct Union_node//!< 节点 { Union_node() :nColor(0) {} std::vector<Union_node*> vecNodeSon; T key;//!< 关键数…

    C++ 2023年4月22日
    00
  • Qt-FFmpeg开发-视频播放(5)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-视频播放【软/硬解码 + OpenGL显示YUV/NV12】 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-视频播放【软/硬解码 + OpenGL显示YUV/NV12】 1、概述 2、实现效果 3、FFmpeg硬解码流程 4、优化av_hwframe_transfer_data()性能低问题…

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】配置项 StackWalkMethod

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 StackWalkMethod 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置调用堆栈的跟踪方法 2.1 测试代码 2.2 StackWalkMethod = fast 时的输出 2.3 StackWal…

    C++ 2023年4月18日
    00
  • 2023团队天梯模拟赛 L2-3 智能护理中心统计 and L3-1 塔防游戏(23分)

    L2-3 智能护理中心统计 智能护理中心系统将辖下的护理点分属若干个大区,例如华东区、华北区等;每个大区又分若干个省来进行管理;省又分市,等等。我们将所有这些有管理或护理功能的单位称为“管理结点”。现在已知每位老人由唯一的一个管理结点负责,每个管理结点属于唯一的上级管理结点管辖。你需要实现一个功能,来统计任何一个管理结点所负责照看的老人的数量。 注意这是一个…

    C++ 2023年4月19日
    00
  • LeetCode 力扣 205. 同构字符串

    给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。 示例 1: 输入:s = “egg”, t = “add”输出:true示例…

    C++ 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部