C primer plus 学习笔记 第9章 函数

简介: C primer plus 学习笔记 第9章 函数

    第9章 函数

函数是C语言程序的构件块。

这章书里举了很多例子,建议结合例子理解。

9.3 和 9.4 建议略读。


9.1 复习函数

函数(function)是完成特定任务的独立代码单元。

函数让程序更加模块化,提高代码可读性,方便修改。

9.1.1 创建并使用简单函数

函数原型指明了函数的返回值类型和函数接受的参数类型。这些信息称为该函数的签名(signature)

9.1.3 函数参数

 

9.1.4 定义带形式参数的函数

ANSI C风格的函数头:

void show_n_char(char ch, int num)

改行告知编译器本函数具有两个参数ch和num,类型分别是char和int。这两个参数被称为形式参数(formal parameter),简称形参。形式参数是局部变量。

注意每个变量前都要声明其类型,不能写成这样:void dibs(int x, y, z)

9.1.5 声明带形式参数函数的原型

函数原型一般是下面这种形式:

void show_n_char(char ch, int num)

也可以省略变量名:

void show_n_char(char,  num)

 

9.1.6 调用带实际参数的函数

函数调用中,实际参数(actual argument,简称实参)提供了ch和num的值。

show_n_char(SPACE,12)

调用时实参的值(SPACE,12)赋值给函数中相应的形式参数(ch,num)。

9.1.7 黑盒视角

 

9.1.8 使用return从函数中返回值

9.1.9 函数类型

声明函数时必须声明函数的类型,带返回值的函数类型和其返回值类型相同,

不带返回值的函数应该声明为void类型。

 

9.2 ANSI C函数原型

9.2.1 问题所在

9.2.2ANSI的解决方案

针对参数不匹配的问题,ANSI C要求函数声明时还要声明变量的类型,即 使用函数原型来声明函数的返回类型、参数的数量和每个参数的类型。有了这些信息,编译器可以检查函数调用是否和函数原型匹配。

9.2.3 无参数和未指定参数

为了表明函数没有参数,应该在圆括号内使用void

void print_name(void);

一些函数接受许多参数,ANSI C允许使用部分原型:

int printf(const char *, ...)

表明第一个参数是字符串,可能还有其他参数。

9.2.4 函数原型的优点

让编译器在第1次执行到该函数前就知道如何使用它。

将整个函数定义放在第1次调用该函数之前,也有同样的效果。

此时,函数定义也相当于函数原型。

 

9.3 递归(略)

C允许函数调用自己,这种调用称为递归(recursion)。

9.3.3 尾递归

最简单的递归形式是把递归调用置于函数的末尾,即return之前。这种形式的递归称为尾递归。

9.3.4 递归和倒序计算

9.3.5 递归的优缺点

 

9.4 编译多源代码文件的程序(略)

 

9.5 查找地址:&运算符

指针(pointer)是C语言最重要的概念之一,用于存储变量的地址。

&运算符给出变量的地址,pooh是变量,&pooh就是变量pooh的地址。

9.6更改主调函数中的变量

9.7 指针简介

指针(pointer)是一个值为内存地址的变量。

9.7.1 间接运算符:*

假设ptr指向bah:

ptr = &bah;

使用简介运算符* 可以找出bah中的值

val = *ptr;

9.7.2 声明指针

声明指针变量时必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间。

下面是一些指针的声明:

int * pi; //pi 是指向int变量的指针

float * pf, *pg

9.7.3 使用指针在函数间通信

使用指针的函数

void interchange(int * u, int * v)

调用:interchange(&a,&b);

相关文章
|
Oracle 关系型数据库 MySQL
MySQL中Sequence的使用
Oracle中Sequence可以使用,但在MySQL中没有序列实现,Oracle往MySQL迁移Sequence要怎么处理,是否有替代方案呢?
4410 0
|
8月前
|
存储 弹性计算 调度
基于Knative的LLM推理场景弹性伸缩方案
Knative的基于请求弹性配置与大语言模型(LLM)的推理场景高度契合。此外,它的资源降配特性可以显著帮助用户降低成本。本文详细介绍基于 Knative 的 LLM 推理场景弹性伸缩方案。
|
监控 安全 数据可视化
中间件应用日志记录和监控
【5月更文挑战第1天】中间件应用日志记录和监控
381 3
中间件应用日志记录和监控
|
网络协议 算法 安全
【网络协议基础】TCP/IP协议大全
TCP/IP协议是现代计算机网络通信的基础,是互联网及局域网广泛使用的一套协议。TCP/IP协议集采用分层模型,以便于网络的设计、实现和管理。
643 2
|
11月前
|
人工智能 前端开发 JavaScript
AI+脚本让我的效率翻倍,你也可以试试
本文分享了一名高级软件工程师如何利用 AI 工具(如 VSCode 插件 Codeium、通义灵码,及网页端的通义千问和 GPT-4)提升工作效率的经验。从代码生成、单元测试、脚本生成到文本润色,再到新框架学习,AI 工具在多个方面显著提高了开发效率和代码质量。文章还提供了具体示例和注意事项,帮助读者更好地应用这些工具。
419 1
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
1366 2
|
11月前
|
Linux 开发者 iOS开发
告别兼容烦恼!Python系统编程中的跨平台艺术大师🎨
【10月更文挑战第2天】Python 以其强大的跨平台能力成为系统编程领域的艺术大师,有效解决了不同操作系统间的兼容性问题,让开发者能专注于业务逻辑而非平台差异。通过内置的 `os`、`platform` 和 `subprocess` 模块,以及第三方库如 `pathlib`,Python 能轻松处理文件系统操作、执行外部命令等任务。此外,Python 还提供了 Tkinter、PyQt 等库支持跨平台 GUI 开发,确保应用程序在 Windows、macOS 和 Linux 上均能正常运行。Python 的强大工具链使其在跨平台编程领域中持续引领新潮流。
110 4
|
JavaScript
如何在 vscode 中配置自己的 vue 模板?
如何在 vscode 中配置自己的 vue 模板?
293 0
|
机器学习/深度学习 人工智能 算法
探索软件测试的未来:AI与自动化的融合
随着技术的迅猛发展和市场需求的不断升级,软件测试领域正经历着前所未有的变革。本文将深入探讨人工智能(AI)和自动化技术如何共同推动软件测试的发展,通过具体案例分析,展示这一趋势如何提高测试效率、准确性和灵活性。同时,文章还将讨论这些技术带来的挑战和机遇,以及它们对未来软件测试工程师角色的影响。
103 0