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

static全局/局部变量/函数和普通全局/局部变量/函数的区别

逐一介绍每种类型的变量和函数在 C 语言中的区别,并通过代码示例说明 static 关键字的作用。

1. static 全局变量与普通全局变量的区别

  • 普通全局变量:可以在多个 .c 文件中使用(即具有外部链接)。
  • static 全局变量:作用域仅限于声明它的文件内部,其他文件无法访问(即具有内部链接)。

2. static 局部变量与普通局部变量的区别

  • 普通局部变量:每次进入函数时重新创建,退出函数时销毁,因此它不保留上次的值。
  • static 局部变量:在函数内定义但具有静态存储期,函数多次调用时不会被重新创建,会保留上次的值。

3. static 函数与普通函数的区别

  • 普通函数:可以在多个 .c 文件中使用(外部链接)。
  • static 函数:作用域仅限于声明它的文件内部,其他文件无法调用该函数(内部链接)。

示例代码

示例结构

假设我们有三个文件:

  1. file1.c — 包含普通和 static 全局变量、函数和局部变量。
  2. file2.c — 尝试访问 file1.c 中的变量和函数。
  3. main.c — 用于演示和运行整个代码。
1. file1.c
#include <stdio.h>int globalVar = 100;        // 普通全局变量
static int staticGlobalVar = 200; // static 全局变量void normalFunction() {printf("This is a normal function in file1.c\n");
}static void staticFunction() {printf("This is a static function in file1.c\n");
}void testStaticAndLocalVars() {int localVar = 1;             // 普通局部变量static int staticLocalVar = 1; // static 局部变量localVar++;staticLocalVar++;printf("Local variable: %d, Static local variable: %d\n", localVar, staticLocalVar);
}
2. file2.c
#include <stdio.h>extern int globalVar;          // 声明引用 file1.c 中的普通全局变量
// extern int staticGlobalVar;  // 尝试引用 static 全局变量会出错void normalFunction();
// void staticFunction();       // 尝试引用 static 函数会出错void accessFromAnotherFile() {printf("Accessing globalVar from file2.c: %d\n", globalVar);normalFunction();// 以下代码会出错,因为 staticGlobalVar 和 staticFunction 都是静态的,仅 file1.c 可见。// printf("Accessing staticGlobalVar from file2.c: %d\n", staticGlobalVar);// staticFunction();
}
3. main.c
#include <stdio.h>void testStaticAndLocalVars();
void accessFromAnotherFile();int main() {printf("Testing static and local variables in a function:\n");testStaticAndLocalVars();testStaticAndLocalVars(); // 调用两次函数,观察 static 局部变量的效果printf("\nTesting access to global variables and functions from another file:\n");accessFromAnotherFile();return 0;
}

编译和运行

将所有文件一起编译:

gcc file1.c file2.c main.c -o program
./program

预期输出

Testing static and local variables in a function:
Local variable: 2, Static local variable: 2
Local variable: 2, Static local variable: 3Testing access to global variables and functions from another file:
Accessing globalVar from file2.c: 100
This is a normal function in file1.c

解释

  1. static 全局变量与普通全局变量的区别

    • globalVar 是普通全局变量,可以在 file2.c 中访问。
    • staticGlobalVar 是静态全局变量,只能在 file1.c 中使用,尝试在 file2.c 中访问会报错。
  2. static 局部变量与普通局部变量的区别

    • testStaticAndLocalVars() 函数中,localVar 是普通局部变量,每次调用时都会重新初始化为 1
    • staticLocalVar 是静态局部变量,第一次初始化为 1,在函数多次调用时会保留其值,因此第二次调用时值增加到 3
  3. static 函数与普通函数的区别

    • normalFunction 是普通函数,可以在 file2.c 中调用。
    • staticFunction 是静态函数,只能在 file1.c 中使用,尝试在 file2.c 中调用会报错。

总结

  • static 全局变量:仅在定义它的文件中可见,防止其他文件意外使用该变量。
  • static 局部变量:在函数内声明,但在多次调用间保留其值。
  • static 函数:作用域仅限于声明它的文件中,防止其他文件调用它。

http://www.mrgr.cn/news/64098.html

相关文章:

  • 食堂采购系统源码:实现供应链管理平台功能模块的技术实践
  • 【Python】实战:使用input()获取一个字符串,编写并传参,将字符串中所有的小写字母转成大写字母,将大写字母转成小写字母
  • 达梦变量赋值
  • [Python学习日记-59] 开发基础练习2——网站访问日志分析
  • 百公斤大载重六旋翼吊运无人机技术详解
  • 在基于AWS EC2的云端k8s环境中 搭建开发基础设施
  • 赋值语句@赋值表达式@便于阅读和便于理解的比较
  • 【Linux中的第一个小程序】进度条及printf打印彩色字符
  • 《Python修炼秘籍》01踏上编程之旅
  • 满秩分解与奇异值分解
  • 机器人大模型GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)
  • 树的遍历(先,中,后)
  • 【无人机设计与控制】改进无人机三维路径规划(蜣螂优化算法)Matlab程序
  • 除甲醛开窗通风的正确方法 消除甲醛的最好方法
  • 如何引用一个已经定义过的全局变量?
  • 【含文档】基于ssm+jsp的智慧篮球馆预约(含源码+数据库+lw)
  • 【含文档】基于Springboot+Vue的工商局商家管理系统 (含源码数据库+LW)
  • 基于javaweb(springboot+mybatis)网站建设服务管理系统设计和实现以及文档报告设计
  • ssm毕业设计选题系统+jsp
  • HTML 基础标签——表格标签<table>
  • cangjie仓颉程序设计-怎么排序(二)
  • 从头开始学PHP之面向对象
  • 2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章
  • 仓颉刷题录-二维数组(二)
  • 第15届蓝桥杯省赛真题剖析-2024年8月24日Scratch中级组
  • 使用Github下载YOLO v5项目教程