【C语言函数部分的重要知识点】--自定义函数,static和extern
目录
一.函数的语法形式
1.1.实参
1.2.形参
二.return 语句
三.嵌套调用和链式访问
1.嵌套调用
2.链式访问
四.函数的声明和定义
五.static和extern
1.作用域和生命周期的知识点;
2.static
2.1.static修饰局部变量
2.2.static修饰全局变量
2.3.static修饰函数
前言:上篇文章给大家分享了数组的相关知识点,这篇文章主要是分享一下函数中的自定义函数的相关知识;
一.函数的语法形式
---自定义函数和库函数是一样的,形式如下:
1 ret_type fun_name(形式参数)
2 {
3
4 }
--ret_type是函数返回类型 --fun_name是函数名
--括号里放形式参数 --{}括起来的是函数体
我们来看个加法函数,了解一下函数的构成以及形参和实参;
1.1.实参
---在上述代码中,第4~7行是函数的定义,有了函数后,再第13行调用了add函数的。我们把第13行调用add函数时,传递给函数的参数a和b,称为实际参数,简称实参-实际参数就是真实传递给函数的参数。
1.2.形参
---在上述代码中,第4行定义函数的时候,在函数名add后的括号中写的x和y,称为形式参数,简称形参。为什么叫形参呢?实际上,如果只定义了add函数,而不去调用的化,add该函数的参数x和y只是形式上存在的,不会向内存申请空间,不会是真实存在的,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才会向内存申请空间,这个过程就是形参的实例化。我们可以理解为形参是实参的一份临时拷贝 。
二.return 语句
--return语句有如下这些注意事项
1.return语句后面可以是一个数值也可以是一个表达式,如果是表达式则先执行表达式,在返回表达式的结果。
2.return语句后边可以什么都没有,直接写return;这种写法适合返回类型是void的情况。
3.return语句执行后,函数就彻底返回,后边的代码不再执行。
4.return返回的值和函数类型不一致,系统会自动将返回的值的隐式转换为函数的返回类型。
5.如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,不然会出现编译错误。
6.函数的返回类型如果不写,编译器会默认函数的返回类型是int。
7.函数写了返回类型,但是函数中没有使用return返回值,那么函数的返回值是未知的。
三.嵌套调用和链式访问
1.嵌套调用
--嵌套调用就是函数之间的互相调用;
假如我们计算某年某月有多少天?
#include<stdio.h>int is_leap_year(int y)
{if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)return 1;elsereturn 0;
}
int get_days_of_month(int y, int m)
{int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };int i = m - 1;int day = days[i];if (is_leap_year(y) && m == 2){day += 1;}return day;}
int main()
{int y = 0;int m = 0;scanf("%d %d", &y, &m);int d = get_days_of_month(y,m);printf("%d\n", d);return 0;
}
这就是一个嵌套调用的实际运用,在第二个函数中嵌套调用了第一个函数;
2.链式访问
--所谓链式访问就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问;
我们直接通过一个有趣的例子来直观的了解一下把,大家可以想一下下面这串代码的打印结果;
#include <stdio.h>
int main()
{printf("%d", printf("%d", printf("%d", 43)));return 0;
}
--printf的返回值是打印在屏幕中字符的个数,这里注意如果是有打空格也算;
上面的例子中,我们的第一个printf打印的是第二个printf的返回值,第二个printf打印的是第三个printf的返回值,所以最后会打印出4321;
这里声明一下:前面有一个数组做函数参数的知识点没有分享,感兴趣的可以私信联系我,我将相关知识点分享给你;
四.函数的声明和定义
--函数一定要先声明再调用,这里只跟大家讲讲在多文件中该怎样操作;当然,函数的定义也是一种特殊的声明,所以如果函数定义放在调用之间也可以;
一般我们会将函数的声明,类型的声明放在头文件.h中,函数的实现是放在.c文件中;如下:
补充:我这里最后test.c文件中还需要包含一个头文件add.h
五.static和extern
--static和extern都是c语言中的关键字。
static是静态的意思,可以用来修饰局部变量,全局变量,函数;extern是用来声明外部函数的。
1.作用域和生命周期的知识点;
作用域:是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效(可用)的,而限定这个名字的可用性的代码范围就是这个名字的作用域;
--局部变量的作用域是变量所在的局部范围;
--全局变量的作用域是整个工程(项目);
生命周期:指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
--局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
--全局变量的生命周期是:整个程序的生命周期。
2.static
2.1.static修饰局部变量
--static修饰局部变量就是改变的变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来局部变量存放于内存的栈区,被static修饰后存储到了内存的静态区,和全局变量是一样的,只有程序结束,变量才销毁。但是作用域不变。
2.2.static修饰全局变量
--static修饰全局变量后,整个全局变量只能在本源文件中使用。本质原因是全局变量默认具有外部链接属性,在外部文件使用只需要声明就可以使用了,但是被static修饰后,外部链接属性变成了内部链接属性,只能在本源文件中使用了。
2.3.static修饰函数
--其实static修饰函数和修饰全局变量是一样的,一个函数在整个工程中都可以用,被static修饰后只能在本文件中使用了。本质是因为函数默认也具有外部链接属性 ,使得函数在整个工程中只要适当的声明就可以使用了,但是被static修饰后变成了内部链接属性。
结语:本篇文章就到此结束了,学完数组和函数的知识点后,会在下一篇文章中给大家带来趣味小游戏扫雷,感谢大家的支持。