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

C语言 变量的存储和引用,内部和外部函数

一、变量的存储类型
从变量存在的时间(生存期)角度来划分,可以八遍俩个划分为:静态存储变量  和  动态存储变量 ,从而引出 静态存储方式  和  动态存储方式。【静态存储区、动态存储区都是内存】
静态存储变量:在程序运行期间 分配固定存储空间的变量;这种分配变量的方式就叫做静态储存方式。
动态存储变量:在程序运行期间需要进行 动态分配存储空间的变量;这种分配变量的方式就叫做动态存储方式。
全局变量(在函数的外部定义的):放在静态存储区中,程序开始执行的时候就给全局变量分配存储区,程序执行完毕后就释放这些存储区;在程序执行过程中它们占据固定的存储单元,而不是动态的分配和释放。
动态存储区中存的数据:
a)函数形参:函数形参被看作是局部变量
b)局部变量:比如函数内定义的一些变量
c)函数调用时现场的一些数据和返回地址等。
一般来讲,这些数据在函数调用开始时分配存储空间,函数调用完毕,这些控件就被释放掉了。这种分配和释放,我们就认为是动态的。 如果两次调用同一个函数,分配给此函数的局部变量的存储空间可能就是不同的。
二、局部变量的存储方式
(1)、 传统情形
函数的局部变量:函数被调用时分配存储空间,函数执行完毕后自动释放其所占用的存储空间。
(2)、 特殊情形
局部静态变量:用static加以说明;能够保留原值,占用的存储单元不释放。在下一次调用该函数的时候,该变量的值,就是上一次该函数调用结束时的值。
局部静态变量说明:
A、在静态存储区内分配存储单元,程序整个运行期间不释放内存。
B、局部静态变量是在编译的时候赋予初值的,之赋予初值一次,在程序运行的时候,它已经有了初值。以后每次调用函数时不再重新赋初值,而是保留上次函数调用结束时的值。(普通局部变量的定义和赋值是在函数调用时进行的)
C、定义局部静态变量时,如果不赋予初值,则编译时自动赋初值 0;而普通的局部变量,如果不赋初值,则该普通局部变量是一个不确定的值。
D、虽然局部静态变量在函数嗲用结束后仍然存在(内存没有释放),但是其他函数是不能引用他,只能在自己的函数中引用。
E、缺点: 长期占用内存,降低了程序的可读性;
结论:除非必要,否则不要多用局部静态变量
#include<stdio.h>
void funcTest()
{
    int c=4;  //定义一个普通局部变量,每次都是被重新赋值重新初始化重新分配内存
    printf("c=%d\n",c);
    c++;
    return;
}
int main()
{
    funcTest();
    funcTest();
    funcTest();
}
#include<stdio.h>
void funcTest()
{
    static int c=4;  //为局部静态变量的时候,调用函数结束的时候不释放内存,下次调用该函数时c的值是上次调用结束后的值
    printf("c=%d\n",c);
    c++;
    return;
}
int main()
{
    funcTest();
    funcTest();
    funcTest();
}
三、全局变量跨文件引用
extern 做一个外部变量说明;在引用该全局变量的文件中的头部做一个“外部变量说明”就可以引用另一个文件中的全局变量;说明这里出现的变量是一个已经在其他文件中定义过的外部变量,本文件不必再为它分配内存。
四、函数的跨文件调用
我们根据函数能否被其他源文件调用,我们将函数分为内部函数和外部函数。
内部函数:只能被本文件中其他函数调用;在函数定义的时候最前面加一个static,形式如下:
static 类型标识符  函数名 (形参)  {........}
static void lookvalue()
{
      return ;
}
内部函数又称为“静态函数”:使用内部函数,可以使函数只局限于所在文件。
外部函数:如果一个函数定义,没有static,他就是外部函数,当然定义时也可以加一个extern,但是默认是extern。
extern 类型标识符  函数名 (形参)  {.........}
五、static关键字用法总结
a.函数 内部 定义一个变量的时候使用static,则该变量会保存在静态存储区,在编译的时候被初始化;如果不给初始值,它的值会被初始化为 0,并且下次调用该函数时该变量保持上次离开该函数时的值。
b.在 全局变量之前增加static,会导致该全局变量,只能被本文件中引用,无法再在其他文件中被调用。
c.在 函数定义之前增加static,那么会导致该函数只能在本文件中被调用,无法再在其他文件中被调用。
d.

相关文章:

  • 仿真1 - takeoff_land
  • 基于C语言的图论汇编
  • 非自交任意多边形与矩形框的交集面积计算方法
  • 软件测试项目实战,Web测试常用测试点,即拿即用宝典
  • i.MX 6ULL 驱动开发 九:中断
  • typename 的用法
  • java题2
  • 【Python深度学习】深度学习框架搭建模版
  • 双绞线连接网卡和集线器时的制作步骤
  • vue实战-mockjs模拟数据
  • 深度学习优化算法之动量法[公式推导](MXNet)
  • tomcat面试和Spring的面试题
  • 网课查题公众号接口
  • 基于Hive的搜狗搜索日志与结果Python可视化设计
  • vue+echarts项目四:地区销量趋势(堆叠折线图)
  • Google 是如何开发 Web 框架的
  • 《剑指offer》分解让复杂问题更简单
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Android 控件背景颜色处理
  • create-react-app项目添加less配置
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • javascript 哈希表
  • Joomla 2.x, 3.x useful code cheatsheet
  • webpack4 一点通
  • Windows Containers 大冒险: 容器网络
  • 搞机器学习要哪些技能
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 离散点最小(凸)包围边界查找
  • 前端知识点整理(待续)
  • 《码出高效》学习笔记与书中错误记录
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • ${factoryList }后面有空格不影响
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (solr系列:一)使用tomcat部署solr服务
  • (SpringBoot)第七章:SpringBoot日志文件
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (力扣)1314.矩阵区域和
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .FileZilla的使用和主动模式被动模式介绍
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 材料检测系统崩溃分析
  • .net 设置默认首页
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 指南:抽象化实现的基类
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net连接MySQL的方法
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • @Async注解的坑,小心
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @RequestBody的使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ NOI 2001 ] 食物链
  • [20171106]配置客户端连接注意.txt