【C语言】函数三要素,变量作用域、生存周期、存储类型

news2024/11/27 1:30:48

目录

写在前面

一、函数的用法

1、声明

2、调用

3、定义

形参与实参类型不一致

形参与实参类型一致

函数值类型与返回值类型不一致

函数值类型与返回值类型一致

二、变量的作用域与生存周期

三、变量的储存类型(auto,extern,static,register)

写在最后


写在前面

本文不讲一些琐碎的概念,而将其实例化,来解决一些棘手的问题;

要讲函数,那得从声明、定义、调用、返回讲起


一、函数的用法

9027a25297c349a789fb457e7a60e027.png

第一个函数结构。定义函数放在了调用函数之后,则需要在main函数之前进行声明。

第二个函数结构。定义函数放在了调用函数之前。那么则无需进行声明。

习惯问题:因为C语言程序总是从main函数开始,所以尽快找到main函数符合程序阅读的习惯,试想在一个很长的程序中找上半天才能找到main函数是多么不方便。


在开始之前,我们来问个小问题

1、void max( int,int )

2、void max( int a,int b );

3、max(a,b);

4、max(a,b)

上面四个代码,哪是声明,哪是调用,哪是定义

公布答案:1、2是声明,3是调用,4是定义


下面的所有实例均以这个代码来解释

#include<stdio.h>
void max(int a,int b); //函数声明

int main()
{
   int a,b;
   max(a,b);          //函数调用
   return 0;
}

void max(int a,int b) //函数定义
{
   if(a>b)
      return ;
   else
      printf("a<=b");
}

1、声明

void  max( int a,int a ); 或者void  max( int int );

返回类型+函数名+(参数类型1,参数类型2,...)

2、调用

max(a,b);

函数名(参数1,参数2),这里的参数是实参

3、定义

max(int a,int b){ }

函数名(类型1+参数1,类型2+参数2,...),这里的参数是形参

形参与实参类型不一致

以形参为主,因为编译器只知道形参的类型,不知道实参的类型,会将实参隐式转化为形参的类型

形参与实参类型一致

形参只能为变量,不能为常量和表达式,例如void max(7,a+b)就是错误的

函数值类型与返回值类型不一致

函数值类型与返回值类型不一致,以函数值类型为准,会把return 语句表达式的值的类型转化为函数值的类型

函数值类型与返回值类型一致

return (表达式)  ---->有返回值

return 表达式    ---->有返回值

return ;           ---->无返回值(void类型)


二、变量的作用域与生存周期

局部变量全局变量
1、main()函数内定义的变量也是局部变量,它只能在主函数内使用,但由于程序总是从main函数开始,以main函数执行完毕结束,所以main函数内定义的局部变量生存周期与全局变量相同4、从模块化程序设计的观点来看,这是不利的,一般不要使用全局变量
2、允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的内存单元5、全局变量与局部变量重名时,全局变量会被屏蔽,要引用需要在变量名前加两个冒号 ::
3、在复合语句中定义的变量是局部变量,作用域在复合语句(即{}里的一系列语句共同构成)范围内,生存周期是复合语句执行的时间段6、全局变量必须在所有函数之外,若想在定义全局变量之前的位置上使用,需加扩展名extern

概念解释

#include<stdio.h>

int fun1(int a,int b);//声明
int fun2(int ,int);
int fun3(int ,int);

int main()
{
   int a=3,b=4;//对1的解释
   printf("局部变量a=%d\n",a);
   printf("全局变量a=%d\n",::a);//对5的解释

   fun1(a,b);
   fun2(a,b);
   fun3(a,b);//函数调用
   return 0;
}

extern int d=10;//对6的解释,让fun1也能用d=4

int fun1(int a,int b)//对2的解释
{
   int c=0;//对3的解释,其他函数不能用c
   
}

int d=10;//全局变量,fun2之后的函数能用

int fun2(int a,int b)//对2的解释
{
   ...
}

int fun3(int a,int c)
{
   ...
}

三、变量的储存类型(auto,extern,static,register)

有关储存区的相关内存概念,大家自行搜索了解。

那我们平时做练习写的程序都是定义的什么变量呢?我们来看看吧

#include<stdio.h>

int fun1(int a,int b);//声明
int fun2(int ,int);
int fun3(int ,int);

int main()
{
   static int a=3,b=4;   //静态局部变量
   printf("局部变量a=%d\n",a);
   printf("全局变量a=%d\n",::a);

   fun1(a,b);
   fun2(a,b);
   fun3(a,b);//函数调用
   return 0;
}

extern int d;//一旦把前缀写出来,就容易把定义和扩展搞混,
             //全局变量只能定义一次,没有赋值的就是扩展,赋值的就是定义

int fun1(int a,int b)
{
   auto int c=0;//局部变量的默认存储方式是auto
   
}

extern int d=10;//全局变量默认存储方式是extern

int fun2(int a,int b)
{
   ...
}

auto型变量

一般情况下,在函数内或者复合语句内定义的变量,就是auto型变量

static型变量

static既能定义局部变量又能定义全局变量,那static修饰的静态局部变量和auto修饰的自动变量有何区别?static修饰的静态全局变量和extern修饰的全局变量有何区别?

静态局部变量

自动变量
生存期定义了该变量的源程序函数或复合语句内
作用域函数内或复合语句中,其他函数不能使用
赋初值若未赋初值,系统自动赋0;
如果已赋初始值,则再次调用函数时,就不会执行赋初始值的语句
若未赋初值,系统赋随机数;
如果已赋初始值,则再次调用函数时,还会重复执行赋初始值的语句
变量的值一次调用函数完成后,变量的值会被保留,再次调用,还是原来的值一次函数调用完成后,变量会被销毁,再次调用需要重新赋初始值
程序运行结果1 2 3 4 51 1 1 1 1

//定义静态局部变量
#include<stdio.h>
int main()
{
   int i;
   void fun();
   
   for(i=1;i<=5;i++)
      fun();      //函数调用
   return 0;
}
void fun()
{
   static int j=0;
   j++;
   printf("%d ",j);
}


//定义自动变量
#include<stdio.h>
int main()
{
   int i;
   void fun();
   
   for(i=1;i<=5;i++)
      fun();      //函数调用
   return 0;
}
void fun()
{
   auto int j=0;
   j++;
   printf("%d ",j);
}

静态全局变量

全局变量
生存期定义了该变量的源文件整个源文件
作用域在定义了该变量的源文件内有效同一源程序的所有源文件都有效

//假设一个源程序由源文件test_1和test_2组成
//test_1.c
int a,b;       //定义全局变量
static char ch;//定义静态全局变量
int main()
{
   ...
}

//test_2
extern int a,b;//正确a,b是全局变量
extern char ch;//错误,ch是静态全局变量
fun()
{
   ...
}

写在最后

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI虚拟人千亿级市场来袭,景联文科技提供全方面数据采集标注服务

“AI虚拟人通过语音、文字、视觉的理解和生成&#xff0c;结合动作识别、环境感知等多种方式可与人进行互动。AI虚拟人中运用到的强大算法需要高质量标注数据不断对其进行优化训练&#xff0c;景联文科技提供全方面数据采集标注服务。” 11月18日&#xff0c;科大讯飞在第五届世…

行为型模式 - 访问者模式Visitor

学习而来&#xff0c;代码是自己敲的。也有些自己的理解在里边&#xff0c;有问题希望大家指出。 行为型模式&#xff0c;我之所以把他放到第一个&#xff0c;是因为它号称是GoF中最难的一个。 模式的定义与特点 在访问者模式中&#xff08;Visitor Pattern&#xff09;中&…

pandasGUI:一款开源的功能异常强大的数据可视化分析工具

在很早之前关于可视化的描述中&#xff0c;我们介绍过一款D-table的数据分析操作工具。和D-table的操作相似&#xff0c;还有一款pandasGUI的开源工具更加强势。 Pandasgui是一个开源的python模块&#xff0c;它为pandas创建了一个GUI界面&#xff0c;我们可以在其中使用panda…

Impact of Problem Decomposition on Cooperative Coevolution

0、论文背景 本文在CCVIL的基础上&#xff0c;讨论了问题的分解效果对于CC框架的影响。由于VIL本身是一项计算成本昂贵的任务&#xff0c;因此应该避免在VIL上花费过多的时间而对CCEA没有显著的好处。我们进行实证研究来解决三个密切相关的问题&#xff1a; 1)更好的问题分解会…

STC 51单片机58——旋转LED

STC11F LED部分&#xff1a; #include "STC11.h" #define u8 unsigned char #define u16 unsigned int //全亮 //u8 code Picture1[8]{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; //u8 code Picture2[8]{0xe7,0xdb,0xbd,0x7e,0x7e,0xbd,0xdb,0xe7}; //u8 code P…

阿里云的工程师又闯祸了,github上紧急修复

最近不少用户使用阿里云提供的测试用例出现了被删除了用户目录下的所有文件&#xff0c;项目地址是&#xff1a;https://github.com/aliyun/aliyun-clialiyun-cli/cli/completion_installer_test.goLines 87 to 99 in 550ccb6path : filepath.Join(u.HomeDir, ".bashrc&qu…

求知 | 聊聊Android资源加载那些事 - Resource的初始化

Hi,你好 &#x1f603; 引言 在上一篇&#xff0c;求知 | 聊聊Android资源加载的那些事 - 小试牛刀 中&#xff0c;我们通过探讨 Resource.getx() ,从而解释了相关方法的背后实现, 明白了那些我们日常调用方法的背后实现。 那么&#xff0c;不知道你有没有好奇 context.reso…

【蓝桥杯国赛真题07】python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

目录 python杨辉三角 一、题目要求 1、提示信息 2、编程实现 3、输入输出

蓝桥杯嵌入式Debug

文章目录前言一、Debug是什么二、如何调试1.重要调试按键介绍2.其他按键介绍三、监视变量窗口总结前言 这一篇文章是非常重要的&#xff0c;掌握了这篇文章有助于大家在比赛中快速找到错误。 一、Debug是什么 Debug是一种程序&#xff0c;一种调试工具&#xff0c;说白了就是…

Elasticsearch:如何在 Elastic Agents 中配置 Beats 来采集定制日志

在我之前的文章 “Observability&#xff1a;使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0”&#xff0c;我详细地描述了如何安装 Elasticsearch&#xff0c;Stack 及 Elastic Agents 来采集系统日志及指标。很多开发者可能会有疑问&#xff0c;在我们的实际使用中…

陈都灵《我们当打之年》热播《关索岭》上热搜,温州人爱望京卡牌

最近&#xff0c;电视连续剧《我们的当打之年》&#xff0c;正在各大卫视台热播&#xff0c;一起热起来的还有该剧主演陈都灵。说起主演陈都灵&#xff0c;她虽然不是正宗的电影学院科班出身&#xff0c;但是她的演技却透露着灵气&#xff0c;也给人以真实的感觉。 陈都灵无疑是…

[附源码]Python计算机毕业设计Django学习帮扶网站设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2023年哪些渲染器更好用?3D新手适合的渲染器汇总

现在很多人都使用3D软件来创作自己的作品&#xff0c;所以渲染器的使用必不可少。有许多流行的渲染器&#xff0c;包括 V-Ray、Octane、Arnold、Corona、RedShift。对于许多 3D 新手来说&#xff0c;哪种渲染器最好&#xff1f; 这些渲染器的原理基本相同&#xff0c;只是操作…

大学免费查题接口系统

大学免费查题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…

地图信息,障碍判断以及寻路算法(A星算法,B星算法和蚁群算法等)

一、广度优先遍历和深度优先遍历 在学习寻路算法之前,我们先来了解一下广度优先遍历和深度优先遍历. 什么是广度优先遍历? 广度优先遍历(breadth first search)是一个万能的算法. 广度优先是从初始状态一层一层向下找&#xff0c;直到找到目标为止。 广度优先遍历&#x…

Elasticsearch入门(一)基本介绍与安装

介绍&#xff1a; Elaticsearch&#xff1a;简称为 ES&#xff0c;ES 是一个开源的高扩展的分布式全文搜索引擎&#xff0c;是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理…

STL-常用遍历算法

目录 1.for_each 功能描述 函数原型 2.transform 功能描述 函数原型 1.for_each 功能描述 实现容器遍历 函数原型 for_each(itertor beg,iterator end,_func); //遍历算法 遍历容器元素 //beg 开始迭代器 //end 结束迭代器 //_func函数或者函数对象 代码 #include <i…

磕磕绊绊的双非硕秋招之路小结

秋招&#xff0c;真的再见了。 ⭐️我叫恒心&#xff0c;一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处&#xff0c;并告知作者&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧 12…

Pr:导出设置之音频

H.264、HEVC&#xff08;H.265&#xff09;和 MPEG2-DVD 等格式支持多种音频格式。对于这些格式&#xff0c;我们可以通过导出设置中的音频 AUDIO模块导出为不同的音频格式。音频格式设置Audio Format Settings音频格式Audio FormatH.264 默认采用 AAC 音频格式。AAC&#xff0…

RFID固定资产定位管理系统-智慧资产人员可视化管理系统

概述 我司&#xff08;东识科技DONWIT&#xff09;RFID资产可视化管理系统是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID固定资产进行统一管理、分析的信息化、智能化、规范化的系统。 1.1东识RFID资产管理系统原理 受控样品&#xff08;或…