当前位置: 首页 > news >正文

【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修饰后变成了内部链接属性。


结语:本篇文章就到此结束了,学完数组和函数的知识点后,会在下一篇文章中给大家带来趣味小游戏扫雷,感谢大家的支持。

 

 

相关文章:

  • 【2025软考高级架构师】——计算机系统基础(7)
  • Matlab PID参数整定和设计
  • B+树节点与插入操作
  • MySQL 视图
  • shell 正则表达式与文本处理器
  • 基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制研究
  • Flink介绍——实时计算核心论文之MillWheel论文详解
  • [安全实战]逆向工程核心名词详解
  • 基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(三)
  • markdown语法大全- 最新markdown中文文档
  • Linux内核哈希表学习笔记
  • 【TeamFlow】4 用户管理系统的实现
  • 【每日八股】复习 MySQL Day1:事务
  • 【TeamFlow】3 Rust 与 WebAssembly (Wasm) 深度应用指南
  • 爱在冰川-慢就是快
  • 基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践
  • 【HarmonyOS 5】makeObserved接口详解
  • C++初阶的应用-日期管理系统的设计与实现
  • hackmyvm-quick3
  • 运维侠职场日记9:用DeepSeek三天通关详解自动化操作pdf批量提取PDF文字将PDF转Word文档(附上脚本代码)
  • 澎湃读报丨央媒头版头条集中刊发:大国应有的样子
  • 超越梅罗,这样一个亚马尔折射巴萨的容错率
  • 光明日报社论:用你我的匠心,托举起繁盛的中国
  • 十四届全国人大常委会举行第四十四次委员长会议
  • 济南高新区一季度GDP增长8.5%,第二产业增加值同比增长14.4%
  • 零食连锁鸣鸣很忙递表港交所:去年营收393亿元,门店超1.4万家,净利润率2.1%