前言

本篇博客是对C语言函数部分的重点内容和细枝末节通过实战得到的经验的总结精炼,不涵盖C语言函数的全部内容,所有提炼内容均来自提炼与实战,阅读需要对函数部分有一定基础,可用于对C语言函数的理解提升和备考复习,理解本文有助于您解决C语言函数部分的题目,获得只有通过实战才能加深理解的经验。

大家都大致都了解一点数学意义上“函数”的概念,比如“y=f (x)”,且不论f的具体形式如何,其基本特点是“对一个x,有一个y值与之对应”。C语言中,“函数”是个重要的概念,是模块化编程的基础。

什么是函数?—根据输入进行处理返回输出。

函数精要与细枝末节

1.函数概念

函数的别称是方法,函数也就是完成某一特定功能的模块,main函数是C程序的入口点,有且仅有一个main函数。

2.函数的执行流程
函数调用必须等待函数执行完成才会执行下一步。

3.库函数与自定义函数

库函数:
由C语言系统提供;
用户无须定义,也不必在程序中作类型说明;
只需在程序前包含有该函数定义的头文件;
自定义函数:
用户在程序中根据需要而编写的函数;

4.函数在VS编译器中的特点

函数名在VS里可以参杂中文

C语言参数过多会警告,多的会忽略,结果不保证正确,C语言保证尽量类型一致,个数一致。

C语言函数不return返回可以编译,但是结果自负。

C语言函数一定要加声明,加了声明一定不会出错,不加声明有可能出错,声明可以有多个,定义只能有一个,理论上一定要加声明。

VS2013的编译器,默认的配置了静态库lib的路径。

C语言编译比较宽泛,有库的路径,可以自动定位,不需要函数声明;C++必须有函数声明,头文件,库文件。

std标准库,C语言标准跨平台。

可以用abort()函数来处理程序的异常。

5.函数的返回值就是函数的输出,函数的结果

main函数可以没有返回值,无论类型是int还是void。

C非main函数如果不是void,会有一个警告,如果是CPP会是一个错误。

6.return后面得语句不会再被执行
main函数的return语句就是退出,没有return,main函数执行完所有语句就会退出

7.函数的形参与实参

函数调用的时候,形参分配内存,新建一个变量,存储传递过来的实参。函数调用之前,形式参数,也就是函数定时时()里的参数,值都不确定,不确定的值,不会分配内存,只有调用函数的时候,才会分配内存新建一个变量,接受实际参数的值,当函数调用结束的时候,形参占据的内存会被回收。实际参数是函数调用的时候,函数传递的确切值就是实际参数,实际参数可以是常量,变量或者表达式。形参与实参内存地址不一样,占用不同的内存空间。

形式参数与实际参数的类型,会自动完成数据类型的转换,调用函数的时候,尽量类型要匹配,否则会出现误差或错误。

8.局部变量与全局变量

局部变量:局部变量调用完成以后会被回收,局部变量是为块语句服务的,函数内部定义的变量,还有函数的参数,都是局部变量

全局变量:全局变量不属于任何一个函数,可以被任何一个函数调用,全局变量的生存期就是程序的生命期,全局变量会一直占内存,而局部变量用完就扔。

全局变量可以用于函数的通信,同名的情况下,局部变量会屏蔽全局变量。

C++可以用::访问全局变量,C语言不可以。同一个块语句下变量不可以重名,可以再装一个块语句。

int a; //全局变量声明,没有初始化默认为0,有的话就是默认的值
; //全局变量定义,只能有一个

全局变量,跨文件都可以调用
如果重名,局部变量会屏蔽全局变量,内部块语句变量会屏蔽外部变量
全局变量,很容易被覆盖,很容易被读写

局部变量没有声明与定义的区别

int add(int ,int ); //声明的变量名可以省略,要加分号,声明要与定义匹配

9.输入输出函数

putchar(); //按字符打印
getchar(); //等待你输入一个字符,返回值就是你输入的字符

10.函数声明与定义

C语言从上往下开始编译,所以上面如果没有函数的定义,或者声明就无法找到函数,无法调用。

函数的实体只能有一个,函数的声明,只是说明函数的存在,所以可以有多个。

C++属于严格的编程语言,函数的声明必须在调用之前

11.函数是模块化编程的基础,函数解决代码重用的问题

函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用。

12.函数的块语句不允许省略

函数体内部变量不可以与参数同名

参数传递是单向值传递

(void) 参数为空

函数的默认类型是int,可以省略

13.函数的副本机制

函数除了数组外,都是副本,副本机制通过赋值,赋值会自动类型转换。return也会完成类型转换

14.字符串输入输出

%i等价于%d,打印有符号十进制数据

gets();  //输入一个字符串到字符串变量
getchar(); //等待你输入一个字符的作用

sleep()函数在windows.h头文件里

15.函数的执行顺序:

从下往上进栈,从上往下执行。

16.函数参数运算顺序:

从右面的参数开始算 (int a,int b) 先计算b的值,再计算a的值,从右往左

show(a,a++); //执行结果6,5

实战——可变参数函数的实现

1.int类型可变参数函数实现:

#include<stdarg.h> // 标准参数
    int add(int num,...) //...代表可变参数

{
    ; //结果
    va_list argp; //存储参数开始的地址
    va_start(argp,num); // 从首地址开始,读取num后面的数据
    ;i<num;i++)
{
    res+=va_arg(argp,int); //读取一个数据按照int类型解析
}
    va_end(argp); //结束读取
    return res;
}

2.字符串类型可变参数函数实现:

void go(int num,...)
{
    va_list argp; //存储参数开始的地址
    va_start(argp,num); // 从首地址开始,读取num后面的数据

    ;i<num;i++)
    {
        ];
        sprintf(str,"%s",va_arg(argp,char *));
        system(str); //读取一个数据按照char *解析
    }
    va_end(argp); //结束读取
}

3.如果是参数的个数也不知道情况:

void showint(int start,...)
{
    va_list argp; //存储参数开始的地址
    va_start(argp,start); // 从首地址开始,读取num后面的数据
    int argvalue=start; //第一步初始化

    do
    {
        printf("\n%d",argvalue);
        argvalue=va_arg(argp,int); //不断读取
    });
    va_end(argp); //结束读取
}            

通过实战理解C语言精要——函数篇的更多相关文章

  1. [转帖]C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义

    C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义 https://blog.csdn.net/willyang519/article/d ...

  2. 深入理解C语言-函数指针

    函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作. 函数类型基础 函数三要素: 名称.参数.返回值 C语言中的函数有 ...

  3. selenium2自动化测试实战--基于Python语言

    自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...

  4. 理解函数式编程中的函数组合--Monoids(二)

    使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...

  5. C语言 第八章 函数、指针与宏

    一.函数 函数是一个包含完成一定功能的执行代码段.我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的.外部程序 ...

  6. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  7. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  8. 【转载】理解C语言中的关键字extern

    原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...

  9. (转)PHP的语言结构和函数的区别

    相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...

随机推荐

  1. 滚动变色的文字js特效

    Js实现滚动变色的文字效果,在效果展示页面,可看到文字在交替变色显示,以吸引人的注意,效果真心不错哦,把代码拷贝到你的网站后,修改成想要的文字就OK了. 查看效果:http://keleyi.com/ ...

  2. DYN-B201 Dynamics CRM 云生产力解决方案与功能简介

    DYN-B201 Dynamics CRM 云生产力解决方案与功能简介 讲师:王健.林松涛Dynamics CRM 云产品正式落地中国,CRM 与 Azure.O365 深度整合无缝集成,带来无与伦比 ...

  3. childViewController 小计

    设置childViewcontroller Unbalanced calls to begin/end appearance transitions for 以上报错 需要添加 transitionF ...

  4. synthesize 与dynamic的区别

    官方文档解释: @synthesize will generate getter and setter methods for your property. @dynamic just tells t ...

  5. HttpUrlConnection

    •HttpUrlConnection是java的标准类,继承UrlConnection类,二者都是抽象类.其对象主要通过URL的                                     ...

  6. JavaScript的个人学习随手记(一)

    JavaScript 简介  要学习的人可以到W3School http://www.w3school.com.cn/b.asp JavaScript 是世界上最流行的编程语言. 这门语言可用于 HT ...

  7. [MySQL Reference Manual]14 InnoDB存储引擎

    14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...

  8. 深入解析Windows操作系统笔记——CH2系统结构

    2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...

  9. 在Ubuntu上单机安装Hadoop

    最近大数据比较火,所以也想学习一下,所以在虚拟机安装Ubuntu Server,然后安装Hadoop. 以下是安装步骤: 1. 安装Java 如果是新机器,默认没有安装java,运行java –ver ...

  10. CSS white-space 属性

    实例 规定段落中的文本不进行换行: p { white-space: nowrap } nowrap:文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止.