1.函数的概念
说到函数,我们可能第一想到的就是小学或中学数学中所学的函数,其实也可以把理解数学中函数的方式来理解程序中的函数。函数是怎样来的呢?
我们用的main(),其实就是一个函数,它是一个程序运行的入口,而一个代码中有且只能有一个main()函数,而我们如果所有代码都写在一个main()函数里面的话想象一下会有多么繁杂和混乱,后来就引入子程序(也就是函数)的概念,C语言程序就是无数个函数来实现的
2.库函数
像printf,scanf等等都是库函数,在头文件<stdio.h>中,printf,scanf是有返回类型的,它们的功能也是非常的强大,库函数是怎样来的呢?
开始并没有库函数这一概念,要把信息打印到显示屏上或要把信息从键盘输入,都需要程序员自己写代码来实现,而几乎所有人都要做这样的事情,都各自有各自的写法,然后就有了国际标准ANSI 规定(因此也使c语言得到很好的发展)printf,scanf等等的函数功能和用法,然后由编译器厂商去实现,放头文件里,程序员包含一下头文件就可以直接使用。
库函数很多,用起来很高效,需要我们有一个学习函数的正确方法去逐个学习。接下来有两个学习网站:
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/
C/C++官⽅的链接:https://zh.cppreference.com/w/c/header
关于库函数的学习我们主要关注以下几点
1.函数名
2.函数功能
3.函数参数
4.函数返回类型
3.自定义函数
而光有库函数是不够用的,我们需要自己来实现一些函数。
举个例子:
int sum(int a,int b)
{
int sum;
sum=a+b;
return sum;
}
#include<stdio.h>
int main()
{
int k=sum(5,8);
printf("%d",k);
return 0;
}
函数的语法
例2:
注:函数里面不可以定义函数。
4.形参和实参
4.1形参是在定义函数时所写的参数
4.2实参是传给函数的真实参数
函数不被执行前形参是不会向内存申请空间,只是形式存在,函数被执行后形参会类似的拷贝一份(数组除外)实参的数据存入申请的内存。
因此,实参的数据非常大的时候,会导致效率降低,那么我们也可以传入地址(指针)通过地址去寻找数据更高效。
5.return语句
5.1 return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式
的结果。
5.2 return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
5.3 return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
5.4 return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。
5.5 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
6.函数的嵌套使用和链式访问
链式访问是指一个函数的返回值作为另一个函数的参数,例如:
#include<stdio.h>
int main()
{
int k=54;
printf("%d",printf("%d",printf("%d",k)));
return 0;
}
7.函数的定义和声明
7.1单个文件
函数的定义本身也是一种特殊的声明,但如果自定义函数在主函数(main函数)后面的话,前面不加声明,就无法识别,所以需要在主函数前加上声明。
例
7.2多个文件
函数可以在点.h(头文件)后缀的文件里声明,在.c(源文件)后缀文件里实现,而在另.c后缀文件里使用(该点c文件,需要包含点h头文件,而自定义的头文件是用双引号,例如:#include"text.h")
例如:
它的好处就在于有利于多人合作,提高效率。除此之外还可以起到隐藏代码的作用。
8.static和exter
8.1static和extern,是在C语言里的两个关键字。
![c6796a1dddbd4651871ab531b4ed08f6.jpeg](https://i-blog.csdnimg.cn/blog_migrate/96cc9f52b12e13931d6459c12a724515.jpeg)
8.2内存可以分为三个区:栈区,堆区和静态区。
全局变量是在 静态区中申请内存,可以在整个项目内都有效。
#include<stdio.h>
int a;
int main()
{
int b;
return 0;
}
像这里变量a就是一个全局变量,b就是一个局部变量。
![9b3c56b717f04285beeaca6707fb8b72.png](https://i-blog.csdnimg.cn/blog_migrate/42f9e8d62ae3293b3d4c0d7f189559e0.png)
而如果A文件中该程序被static修饰,外部链接属性会变为内部链接性,在B文件中无法使用。