第七章 函数
这一章对于有一定C的基础的人有一定优秀代码风格的人来说,并非非常虐。关于stdarg宏可能有些陌生。它负责可变參数列表的定义。

总结:
新式风格和旧式风格就不要提了。八百年前的事情。

函数常见的是把原型放在一个单独的文件中,当其它文件须要这个原型时,就用#include指令把这个文件包括进来,这个技巧能够使原型必需的拷贝份数降低到最低,有助于提高程序的可维护性。
return语句用于指定从一个函数返回的值,假设没有返回值,为void。

函数的參数是通过传值的方式进行转换,实际传递的实參的一份拷贝。因此,函数能够改动它的形參的拷贝,而不会改变參数原值。
数组名也是通过传值方式传递的。但它传给函数的是一个指针的拷贝。数组形參使用了下标引用操作,就会引发间接訪问操作,实际訪问的是数组元素。

抽象数据类型(ADT),又叫黑盒。

由接口和实现两部分组成。

接口是共同拥有。说明客户怎样使用ADT所使用的功能。
实现是私有,实际运行的部分。

递归函数直接或者间接的调用自身。

有些递归比方尾部递归能够用迭代来实现,效率会高非常多。尤其是斐波那契数列。
可变的參数数量和类型。他们能够用stdarg.h头文件所定义的宏来实现。可变參数能治从第一个到最后一个依次訪问。
以下会弄个样例来说明可变參数。

警告:
1、错误地在其它函数的作用域内编写函数原型。

恩,注意函数的链接属性。

假设在其它函数的代码块里就无法使用该函数。

2、没有为那些返回值不是整数的函数编写原型。

由于返回值的缺省值是整型。
3、在va_arg中使用错误的參数类型。导致没有定义的结果。

看个样例:
#include <stdarg.h>
/* 取形參的平均值 */
float average(int n_value,...)
{
va_list var_arg;
int count;
float sum=0;

/** 准备訪问可变參数 */
va_start(var_arg, n_values);
/* 加入取自可变參数列表的值 */
for(count = 0; count < n_values; count += 1)
{
sum += va_arg(var_arg, int );
}
/* 完毕处理可变參数 */
va_end(var_arg);
return sum/n_values;
}
參数类型必须明白在va_arg(var_arg, ***)中说明,务必!

编程提示:
1、在函数原型中使用參数名。能够给函数的用户提供很多其它的信息。

请尽量使用參数名,不要这样的:
int func(int , int);
从函数名到形參一坨shi。
2、抽象数据类型能够降低程序对模块实现的细节的以来。提高可靠性。
3、当递归定义清晰的这点能够补偿它的效率时。就用递归吧。

C和指针 (pointers on C)——第七章:函数(上)的更多相关文章

  1. C和指针 第七章 函数递归与迭代

    C语言通过运行时堆栈支持递归函数的实现,递归函数时直接或者间接调用自身的函数,经常有人拿斐波那契实现当做递归的实现,然后这样做效率并不高. n < 1;  Fib(1) =1 n = 2;  F ...

  2. 《C和指针》 读书笔记 -- 第7章 函数

    1.当程序调用一个无法见到原型的函数时,编译器便认为该函数返回一个整型值.如果这个值实际上是非整型值时,还得执行类型转换,所以函数原型声明有时很重要. 2.值的类型并不是值的内在本质,而是取决于它被使 ...

  3. 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法

    一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...

  4. JAVASCRIPT高程笔记-------第 七章 函数表达式

    7.1递归 经典递归例子 function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - ...

  5. 流畅的python第七章函数装饰器和闭包学习记录

    本章讨论的话题 python如何计算装饰器句法 python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量) 闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存 ...

  6. python3-cookbook笔记:第七章 函数

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  7. 读书笔记 - js高级程序设计 - 第七章 函数表达式

      闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...

  8. JS复习:第七章

    第七章  函数表达式 一.定义函数的方式有两种:函数声明和函数表达式. 1.函数声明: function functionName(arg0 , arg1 , arg2){ //函数体... } 函数 ...

  9. C语言程序设计(七) 函数

    第七章 函数 分而治之: 把较大的任务分解成若干较小.较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 ...

随机推荐

  1. 通过DFS求解有向图(邻接表存储)中所有简单回路

    前言 查阅了网上许多关于通过DFS算法对有向图中所有简单回路的查找,发现有很多关于使用DFS求解有向回路中所有简单回路的帖子,(在按照节点编号情况下)但大多数仅仅寻找了编号递增的回路.又或者未对结果去 ...

  2. Java学习笔记之——自动装箱与拆箱

    自动装箱与拆箱 基本类型与引用类型的互相转换 1. 基本类型对应的包装类 byte    short       char      int       long    flaot    double ...

  3. python中的property属性

    目录 1. 什么是property属性 2. 简单的实例 3. property属性的有两种方式 3.1 装饰器方式 3.2 类属性方式,创建值为property对象的类属性 4. property属 ...

  4. Java马士兵高并发编程视频学习笔记(一)

    1.同一个资源,同步和非同步的方法可以同时调用 package com.dingyu; public class Y { public synchronized void m1() { System. ...

  5. javascript中数组的常用算法深入分析

    Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascri ...

  6. Grafan+Prometheus 监控 MySQL

    架构图 环境 IP 环境 需装软件 192.168.0.237 mysql-5.7.20 node_exporter-0.15.2.linux-amd64.tar.gz mysqld_exporter ...

  7. 基于timestamp和nonce的防重放攻击

    以前总是通过timestamp来防止重放攻击,但是这样并不能保证每次请求都是一次性的.今天看到了一篇文章介绍的通过nonce(Number used once)来保证一次有效,感觉两者结合一下,就能达 ...

  8. 矢量图面层和线层相交得到相交后的线层文件(gis相交)

    目的:将arcgis里的面层和线层相交(重叠)部分的线单独生成一个shp文件,用于道路路网密度计算等. 注意:进行相交运算后生成的是线要素文件,相当于把面线相交部分的线单独拿了出来. 操作例子:将图示 ...

  9. Android样式主题及自定义属性

    一.Selector——图形.颜色选择器 语法 <selector>   <item android:drawable=“drawableResA” android:state_xx ...

  10. 浅谈SnackBar(Toast大兄弟)

    SnackBar是 Android Support Library 22.2.1 里面新增提供的一个控件,我们可以简单的把它理解成一个加强版的Toast,或者是一个轻量级的Dialog. 特点: .S ...