通过实战理解C语言精要——函数篇
前言
本篇博客是对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语言精要——函数篇的更多相关文章
- [转帖]C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义
C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义 https://blog.csdn.net/willyang519/article/d ...
- 深入理解C语言-函数指针
函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作. 函数类型基础 函数三要素: 名称.参数.返回值 C语言中的函数有 ...
- selenium2自动化测试实战--基于Python语言
自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...
- 理解函数式编程中的函数组合--Monoids(二)
使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...
- C语言 第八章 函数、指针与宏
一.函数 函数是一个包含完成一定功能的执行代码段.我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的.外部程序 ...
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针 1.1. java方法引用(Method References) 与c#委托与脚本语言js ...
- 《Selenium2自动化测试实战--基于Python语言》 --即将面市
发展历程: <selenium_webdriver(python)第一版> 将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...
- 【转载】理解C语言中的关键字extern
原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...
- (转)PHP的语言结构和函数的区别
相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...
随机推荐
- jQuery实现侧边导航栏效果
效果图: 效果体验:http://keleyi.com/keleyi/phtml/jqmenu/2.htm 以下是完整代码: <!DOCTYPE html> <html> &l ...
- jquery根据name属性查找
$("div[id]") 选择所有含有id属性的div元素 $("input[name='keleyicom']") 选择所有的name属性等于'keleyic ...
- html基础大全(经典)
HTML教程 一.HTML基础(人) 1.基础概念: 1.1.自动闭合标签和闭合标签(如出错html编写时不会报错) 自闭合:<mete /> 闭合:<table>文字< ...
- 字体属性设置(一):谷歌浏览器12px以下字体的显示;方法和原理
前言: chrome 谷歌浏览器默认的字体大小为16px:可以通过设置font-size来设置字体大小但是当设置到12px以下的时候字体大小不再改变:对于想设置其他大小的字体就很头疼,本文参考网上的方 ...
- js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法
HTML结构:很简单,就一个input,一个div,能说明问题就OK了: <input type="text" value="默认值"><br ...
- 【高级功能】使用 Ajax(续)
1. 准备向服务器发送数据 Ajax 最常见的一大用途是向服务器发送数据.最典型的情况是从 客户端发送表单数据,即用户在form元素所含的各个 input 元素里输入的值.下面代码展示了一张简单的表单 ...
- C# 多線程&BackgroundWorker概念入門教程
感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下 http://jingyan.baidu.c ...
- 【转】swift实现ios类似微信输入框跟随键盘弹出的效果
swift实现ios类似微信输入框跟随键盘弹出的效果 为什么要做这个效果 在聊天app,例如微信中,你会注意到一个效果,就是在你点击输入框时输入框会跟随键盘一起向上弹出,当你点击其他地方时,输入框又会 ...
- 【代码笔记】iOS-通过颜色来生成一个纯色图片
一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...
- sun.misc.Unsafe的理解
以下sun.misc.Unsafe源码和demo基于jdk1.7: 最近在看J.U.C里的源码,很多都用到了sun.misc.Unsafe这个类,一知半解,看起来总感觉有点不尽兴,所以打算对Unsaf ...