第七章 函数
这一章对于有一定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. [angularjs] angularjs系列笔记(三)模型

    ng-model指令 ng-model可以将输入域的值与AngularJs的变量绑定 双向绑定 当修改输入域的值时候,AngularJs属性的值也将修改 <div ng-app="Ho ...

  2. 12.QT4.7.4-解决WIN平台和Linux平台中文乱码,QLineEdit右击菜单中文显示

    1.解决Win平台中文显示 1.1首先解决win平台上中文显示乱码问题 1)首先查看qt creator的编码格式 通过->编辑->选择编码 查看. 2)如果qt creator的编码格式 ...

  3. python基础学习(十)字符串

    字符串的定义 字符串 就是 一串字符,是编程语言中表示文本的数据类型 在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串 虽然可以使用 \" 或者 ...

  4. mysql基础整理01

    在终端或命令行中和数据库软件建立连接 mysql -uroot -p 数据库相关SQL 查看所有数据库 show databases; 创建数据库 create database 数据库名; crea ...

  5. Java从URL获取PDF内容

    Java直接URL获取PDF内容 题外话 网上很多Java通过pdf转 HTML,转文本的,可是通过URL直接获取PDF内容,缺没有,浪费时间,本人最近工作中刚好用到,花了时间整理下,分享出来,防止浪 ...

  6. WORLD 快速线

    1,3个“-”     一条直线 2,3个“=”    一条双直线 3,3个“*”     一条虚线 4,3个“~”     一条波浪线 5, 3个“#”    一条隔行线

  7. 《从零开始学习jQuery》:用jQuery操作元素的属性与样式

    元素属性和Dom属性简介 对于下面这样一个标签元素: <img id='img' src="1.jpg" alt='1' class="imgs"> ...

  8. CSS gradient渐变之webkit核心浏览器下的使用以及实例

    一.关于渐变 渐变是一种应用于平面的视觉效果,可以从一种颜色逐渐地转变成另外一种颜色,故可以创建类似于彩虹的效果渐变可以应用在任何可以使用图片的地方.例如,您可以指定一个这么一个渐变:顶部的颜色是红色 ...

  9. CF607B Zuma(区间dp)

    题意 题目链接 Sol 裸的区间dp,转移的时候判一下两个字符是否相等即可 #include<bits/stdc++.h> #define Pair pair<int, int> ...

  10. 实现DevOps需要的工具

    硬性要求:工具上的准备 代码管理(SCM):GitHub.GitLab.BitBucket.SubVersion 构建工具:Ant.Gradle.maven 自动部署:Capistrano.CodeD ...