当前位置: 首页 > 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修饰后变成了内部链接属性。


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

 

 

http://www.xdnf.cn/news/54487.html

相关文章:

  • 【题解-JSOI】JSOI2009 配菜
  • 【连接池-55.1】深入解析Druid连接池:高性能Java数据库连接池的最佳实践
  • Python 爬虫案例
  • Dubbo QoS操作手册
  • Spring 01
  • 前端与传统接口的桥梁:JSONP解决方案
  • 大数定理(LLN)习题集 · 答案与解析篇
  • QCPAxis、QCPGrid 和 QCPAxisTicker 三者关系
  • 关于隔离2:ADC芯片
  • 京东 h5st 5.1 详情 京东滑块 cfe 分析
  • Cursor工具你会用了吗
  • leetcode0078. 子集-medium
  • stm32 13位时间戳转换为时间格式、对时
  • Day58 | 179. 最大数、316. 去除重复字母、334. 递增的三元子序列
  • Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问
  • 无回显RCE
  • 每日一道leetcode(补充版)
  • 具身智能零碎知识点(四):联合嵌入预测架构(JEPAs)详解
  • acwing--动态规划【线性dp】4/20、4/21
  • 网页的URL绝对路径和相对路径,以及各自的使用场景
  • 【Vulkan 入门系列】创建逻辑设备和图形、呈现队列,显示尺寸更改(三)
  • 错误: 找不到或无法加载主类 HelloWorld,cmd窗口,java命令,提示
  • PT站中的tracker
  • LangChain4j语言模型选型指南:主流模型能力全景对比
  • 生成式AI对话中提示词策略:明确问题、明确目标和提供背景信息是最有效的策略
  • 【CPU】中断即时性
  • leetcode(01)森林中的兔子
  • 机器学习(神经网络基础篇)——个人理解篇6(概念+代码)———参数优化篇
  • 模型上下文协议(MCP)详解
  • 【物理学】物理学——电机控制中常用的定则