C primer plus 读书笔记第九章

本章的标题是函数。C的设计原则是把函数作为程序的构成模块。

1.函数概述

  函数的定义:函数是用于完成特定任务的程序代码的自包含单元。

  使用函数的原因:1.函数的使用可以省去重复代码的编写。2.使得程序模块化,更有利于阅读、修改和完善。以这种方式看待函数有利于把精力投入到程序整体设计而不是实现其细节。

  函数同变量一样有多种类型。任何程序在使用函数之前都需要声明该函数类型。

  函数参数、函数类型没啥说的,其他语言都会讲到。

  PS:函数的结尾最好只使用一次return,这样更有利于阅读程序的人明白函数的执行流程。

2.递归

  递归一般可以代替循环语句使用。有些情况下使用循环语句比较好,有时候使用递归更有效。递归方法虽然使程序结构优美,但其执行效率却没有循环语句高。一般情况下,选择循环更好一点。首先,因为每次递归调用都有自己的变量集合,所以需要比较多的内存; 第二,每次函数调用需要花费一定的时间,所以执行速度慢。但是在某些情况下,我们不能用简单的循环语句代替递归,所以有必要学习递归。

#include "stdio.h"
void up_and_down (int);

int main (void) {
    up_and_down (1);
    return 0;
}

void up_and_down (int n)
{
    printf ("Level %d: n location %p\n", n, &n);
    if (n < 4)
        up_and_down (n+1);
    printf ("Level %d: n location %p\n", n, &n);
}

这个程序是典型的递归,运行结果如下,关键是理解堆栈的原理。

3.多源代码文件程序的编译

  一般可以把多个函数放到同一个文件,还可以使用头文件,把函数原型都放到一个头文件中。

4.地址运算符

  一元运算符&可以取得变量的存储地址。%p是输出地址的说明符。

  下面引入指针的概念。指针是一个其数值为地址的变量。间接运算符*能够得到指针指向的变量的数值。声明指针时候,需要指针所指向的变量的类型,例如

int * pi;

  pi的值是一个地址,在大多数系统中,pi的值是一个地址,在大多数系统中,它是由一个无符号整数表示,但是这并不表示可以把指针看作整数类型,因为指针是一种新的数据类型。

  如何理解变量名,地址和数值:一个变量一般有两个属性:变量名和数值。程序被编译和加载后,同一个变量在计算机中的两个属性是地址和数值。变量的地址可以被看作是在计算机中的变量名。在很多编程语言中,变量地址只由计算机处理,对于编程人员完全不可见,但在在C语言中,可以使用运算符&来对变量地址进行操作。

  编程练习比较简单,难度不超过书中的代码示例。

to be continued。。。

  

时间: 2024-12-24 03:32:00

C primer plus 读书笔记第九章的相关文章

读书笔记第九章

第九章HAL是建立在linux驱动之上的一套程序库.这套程序库并不属于linux内核,而是属于linux内核层之上的应用层.可以用来保护不想公开源代码的作者.HAL架构比较简单,其基本原理就是在安卓系统中使用程序库调用位于内核空间的linux驱动,然后安卓应用程序可以通过NDK程序访问HAL中的程序库,或直接在安卓应用程序中访问HAL中的程序库.编写一款支持HAL的linux驱动程序的步骤:1.编写linux驱动,linux驱动的代码要尽量简介,尽可能将业务逻辑放到HAL library中.2.

《C++ Primer Plus 6th》读书笔记 - 第九章 内存模型和名称空间

1. 单独编译 1.1 头文件中常包含的内容: 函数原型 使用#define或const定义的符号常量 结构声明 类声明 模板声明 内联声明 1.2 只需将源代码文件加入到项目中,而不用加入头文件.这是因为用#include管理头文件. 1.3 避免多次包含同一个头文件 1 #ifndef COORDIN_H_ 2 #define COORDIN_H_ 3 // place include file contents here 4 #endif 2. 存储持续性.作用域和链接性 1. 存储方案:

Redis Essentials 读书笔记 - 第九章: Redis Cluster and Redis Sentinel (Collective Intelligence)

Chapter 9. Redis Cluster and Redis Sentinel (Collective Intelligence) 上一章介绍了复制,一个master可以对应一个或多个slave(replica), 在以下的情况下是够用的: 1. master有足够内存容纳所有key 2. 通过slave可以扩展读,解决网络吞吐量的问题 3. 允许停止master的维护窗口时间 4. 通过slave做数据冗余 但复制解决不了自动failover和自动resharding的问题,在以下的情

《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算

对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生成透视表.groupby函数能高效处理数据,对数据进行切片.切块.摘要等操作.可以看出这跟SQL关系密切,但是可用的函数有很多.在本章中,可以学到: 根据一个或多个键(可以是函数.数组或DataFrame列名)拆分pandas对象 计算分组摘要统计,如计数.平均值.标准差.,或自定义函数 对DataFrame的列应用各种各样的函数 应用组内转换或其他运算,如规格化.线性回归.排名或选取子集等

《C++ Primer》读书笔记—第一章 开始

声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.一个函数的定义包含四个部分:返回类型(return type).函数名(function name).一个括号包围的形参列表(parameter list,允许为空)以及函数体(function body). 2.cin.cout的使用 1 #include<iostream> 2 int main() 3 { 4 std::cout <

C primer plus 读书笔记第二章

这章的标题是C语言概述,内容大概是介绍一些简单的示例程序,来了解和熟悉C语言的一些基本特征. 这是书里的第一段代码,敲敲找找感觉.推荐在linux环境下写代码. PS:倒腾sublime text一下午,想装个sumblimeClang插件,结果直接把sublime text整崩了,怒换atom,用着还不错. #include <stdio.h> int main(void) /*一个简单的C程序*/ { int num; /*定义为一个名为num的变量*/ num = 1; /*赋值*/ p

《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器(上)

构造方法 在Python中创建一个构造方法很容易.只要把init方法的名字从简单的init修改为魔法版本__init__即可: >>> class FooBar: ...     def __init__(self): ...         self.somevar=42 ... >>> f=FooBar() >>> f.somevar 42 给构造方法传几个参数 >>> class FooBar: ...     def __in

Android深度探索读书笔记 第九章

HAL是建立在linux驱动之上的一套程序库,这套程序库属于linux内核层之上的应用层.编写一款支持HAL的linux驱动程序:1.在为linux驱动添加HAL,要想尽量保护敏感数据.Linux驱动的代码就要尽量简洁,尽可能将业务逻辑放到HAL library中.2.HA类就是普通的linux Library文件 ,但这类库文件有一个接口.通过HAL_MODULE_INFO_SYM变量实现.3.service Library也是Linux Library,也就是说service Library

MYSQL必知必会读书笔记 第九章 使用正则表达式过滤数据

正则与LIKE的区别  Mysql的正则表达式仅仅使SQL语言的一个子集,可以匹配基本的字符.字符串. 例如:select * from wp_posts where post_name REGEXP'hello',可以检索出列post_name中所有包含hello的行   REGEXP'.og' .是正则表达式中里一个特殊的字符.它表示匹配一个字符,因此,dog,hog,mog等等都能匹配. 注意: 关于LIKE和REGEXP的区别:LIKE匹配整个列.如果被匹配的文本仅在列值中出现,LIKE