目录
1. 函数是什么
我们最先了解到函数的概念应该是在数学中,但是C语言中也有函数的概念,而且与数组中的概念并不相同,C语言中的函数又被称为子程序。
函数的释义:
能被其他程序调用,在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令,故能保证重新返回到调用它的程序中去。也可调用其他子程序,甚至可自身调用(如递归)。
子程序的概念:
在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
C语言中函数的分类:
- 按照函数的使用:
- 库函数:
- 自定义函数
- 按照函数的形式
- 无参函数
- 有参函数
2. 主函数
简介
程序执行总是从main函数开始,如果有有其他函数,则完成对其他函数的调用后再返回到主函数,最后由main函数结束整个程序。
在执行程序时,由系统调用main函数。main 函数是在程序启动中完成对具有静态存储期的非局部对象的初始化之后被调用的。
它是程序在有宿主 (hosted)环境(亦即有操作系统)中所指定的入口点。自立程序(启动加载器,操作系统内核,等等)的入口点则是由实现定义的
形式
int main()
{
//代码块
return 0;
}
这是一种最常见的形式,在C89标准中是可以接受的,例如在Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著《 The C programming Language》 用的就是 main( )。
但是在C99标准中,只有以下两种形式是标准形式:
int main(void)//整数类型主函数(无类型)
{
//代码块
return 0;
}
int main(int argc,char **argv)//整数类型主函数(整数类型 统计参数个数,字符类型*数组指针至字符[])
{
//代码块
return 0;
}
其中char **argv可以写成char *argv[],两者等价
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。
常见错误
在很多人或者一些书籍中,都使用过一个代码void main(void)
,但是C/C++中从来没有定义过void main()。
main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。
C++之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main() {/*...*/}
is not and never has been C++, nor has it even been C.(void main() 从来就不存在于C++或者C)。
虽然在一些编译器中,void main可以通过编译(如vc6),但并非所有编译器都支持void main,因为标准中从来没有定义过void main。g++3.2、dev C++等环境中如果main函数的返回值不是int类型,根本无法通过编译。而gcc3.2则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用int main。
3. 库函数
概念
函数库
函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。
库函数
库函数(Library function)是将函数封装入库,供用户使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include<>加到里面就可以了。
库函数并不是C语言官方实现的,C语言官方只规定了库函数的功能和使用方式,库函数的具体实现是由编译器完成的,所以不同的编译器实现库函数的方式并不一定相同。但库函数的功能和使用方式都没有任何区别
头文件
头文件有时也称为包含文件。C语言库函数与用户程序之间进行信息通信时要使用的数据和变量,在使用某一库函数时,都要在程序中嵌入(用#include)该函数对应的头文件。
为什么会有库函数
- 我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。
- 在编程的时候经常会开辟一些空间(malloc)。
- 在编程的时候经常会计算字符串的长度(strlen)。
以上我们所描述的功能,都是我们在编程过程中经常会被使用到。为了支持可移植性和增加代码效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发
C语言库函数的分类
- I/O函数:输入/输出函数,printf、scanf、getchar、putchar……
- 字符串操作函数:strlen、strcpy……
- 字符操作函数:islower、isupper……
- 内存操作函数:memset、memcpy……
- 时间/日期函数:time……
- 数学函数:sqrt、pow……
- 动态储存分配函数:malloc、free……
- 其他函数
如何学习库函数
在学习库函数的时候,我们只需要掌握最常用的一些库函数就行,并不是需要把所有的库函数都学会,当然这也很难做到。
我们更重要的是学会如何看懂我们没有学习过的函数以及使用他们。
一下是我常用的网站:
www.cplusplus.com
http://en.cppreference.com
第一个是我最常用的一个网站,他的排版看起来比较舒服。但是最新版没有搜索功能,如果我们打开的是新版的,可以通过链接跳转到旧版本,跳转方式如下:
第二个网站是C++的官方网站,但是排版看起来会比较乱。
两个网站内容没有本质差别,都可以很好的了解C语言的库函数中所有的内容,大家可以根据自己的喜好自由选择。
查询函数的重点是关注它的函数名,功能,返回类型,参数。
例如:
strlen
size_t strlen ( const char * str );
函数 strlen 的功能是计算字符串的长度,返回类型是 size_t,参数是 const 修饰的 char* 的指针。
memset
void * memset ( void * ptr, int value, size_t num );
函数 memset 的功能是将数组的前 num 个字节的内容设置成 value,返回类型是void*,函数的第一个参数是数组的指针,第二个参数是被初始化成的值,第三个参数是初始化的长度,单位是字节。
4. 自定义函数
在程序设计中,库函数只能解决我们极少的一部分功能,大部分我们需要的功能都需要我们自己实现,这时我们就应该学会自己创建自定义函数来实现我们所需要的功能。
函数的组成
ret_type fun_name(para_type para1,... )
{
statement;//语句项
}
- ret_type 是函数的返回类型,当不需要返回时,ret_type 为 void。
- fun_name 是函数的函数名,在取名时尽量避免与库函数函数名相同。
- para_type para1为参数的类型和参数名。
- statement 是函数体,用来实现函数的功能。
举例
求两个整形的最大值
int Max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
求整形数组中的最小值
int arr_min(const int arr[], int num)
{
int i = 0;
int min = arr[0];//为最小值赋数组中的任意一个数
for(i = 0;i < num; i++)//遍历数组
{
if(arr[i]<min)//依次比较
min = arr[i];//遇到更小的就替换原来的
}
return min;
}