C语言static关键字

目录

  • 概述
  • [1. 局部变量](#1. 局部变量)
    • [1.1 普通局部变量](#1.1 普通局部变量)
    • [1.2 静态局部变量](#1.2 静态局部变量)
  • 2.全局变量
    • [2.1 普通全局变量](#2.1 普通全局变量)
    • [2.2 静态全局变量](#2.2 静态全局变量)
  • 3.函数
  • 4.静态块
  • 总结

概述

本文简单介绍一下static关键字在c语言中的应用。

1. 局部变量

1.1 普通局部变量

普通局部变量是在函数内部或代码块内部定义的变量。这些变量只能在其所在的作用域内访问,并且在离开作用域后会被自动销毁。

普通局部变量有以下特点:

  1. 只能在其所在的作用域内访问:普通局部变量的作用域通常是由它们所在的大括号 {} 决定。一旦超出了其定义所在的作用域,变量将不再可见。
  2. 生命周期受作用域限制:普通局部变量的生命周期从其定义的位置开始,直到离开其作用域时结束。当执行到变量所在的作用域外部时,变量将被自动销毁,释放相应的内存空间。
  3. 没有默认值:普通局部变量在定义时没有默认值,其初始值是未定义的。所以在使用之前,应该先为其赋值,否则会导致未定义行为。
  4. 存储在栈上:普通局部变量通常存储在栈中。栈是一种用于存储局部变量和函数调用信息的内存区域。栈上的变量分配和释放都是自动进行的。
  5. 可以是任何基本数据类型:普通局部变量可以是任何基本数据类型,如整型、浮点型、字符型等,也可以是结构体、联合体等复合数据类型。

1.2 静态局部变量

静态局部变量使用关键字static进行修饰,是在函数内部或代码块内部定义的具有静态存储期的变量。

与普通局部变量相比,静态局部变量具有以下特点:

  1. 存储在静态存储区:静态局部变量的存储位置位于静态存储区,不同于栈上的普通局部变量。静态存储区是程序运行时分配给静态变量和全局变量的内存区域。
  2. 生命周期持久:静态局部变量在程序执行期间都存在,其生命周期持久。当离开函数或代码块时,静态局部变量的值将保持不变,下次进入该函数或代码块时仍然可以访问到之前保存的值。
  3. 初始值为0:静态局部变量在定义时如果没有显式赋初值,会被自动初始化为0(对于数字类型)或NULL指针(对于指针类型)。
  4. 仅在定义所在的作用域内可见:静态局部变量只能在其所在的作用域内访问,无法被其他函数或代码块所访问。这种封闭性可以防止变量的命名冲突,同时提供了一定的信息隐藏。
  5. 保持上次赋值结果:每次进入定义所在的作用域时,静态局部变量不会被重新初始化,保持上次赋值的结果。这使得静态局部变量可以用于记录函数调用间的状态信息。

2.全局变量

2.1 普通全局变量

全局变量是在函数外部定义的变量,可以在程序的任何地方访问。

全局变量有以下特点:

  1. 全局作用域:全局变量的作用域范围覆盖整个程序,即从变量定义的地方开始到文件结束都可以访问该变量。
  2. 静态存储区:全局变量在程序执行期间一直存在,具有静态存储期。它们在程序启动时被分配内存,在程序结束时才释放。
  3. 默认初始化:全局变量如果没有被显式地初始化,将会自动初始化为零值(对于数字类型)或空指针(对于指针类型)。
  4. 可以被多个函数共享:全局变量可以在程序中的多个函数之间共享数据。这使得全局变量成为在不同函数之间传递信息的一种方式。
  5. 命名冲突可能性:由于全局变量的作用域范围广泛,存在命名冲突的潜在问题。当多个文件中使用相同名称的全局变量时,容易引发命名冲突和混淆。
  6. 与局部变量可以同名:全局变量和局部变量可以同名,但在同一作用域中,局部变量会覆盖全局变量,优先使用局部变量。

2.2 静态全局变量

静态全局变量使用关键字static进行修饰,是在函数外部、文件的顶层定义的变量。

与普通全局变量相比,静态全局变量具有以下特点:

  1. 文件作用域:静态全局变量的作用域仅限于当前源文件,即从变量定义的地方开始到文件结束,其他文件无法访问该变量。
  2. 静态存储区:静态全局变量在程序执行期间一直存在,具有静态存储期。它们在程序启动时被分配内存,在程序结束时才释放。与普通全局变量相比,静态全局变量的生命周期限制在当前文件内。
  3. 默认初始化:静态全局变量如果没有被显式地初始化,将会自动初始化为零值(对于数字类型)或空指针(对于指针类型)。
  4. 仅在当前文件内可见:静态全局变量只能在当前源文件内访问,其他源文件无法直接访问。这种封闭性提供了一定的信息隐藏和命名空间隔离。
  5. 避免命名冲突:由于静态全局变量的作用域限制在当前文件内,可以避免与其他文件中同名的全局变量造成的命名冲突。

3.函数

函数的使用方式与全局变量类似,在函数的返回类型前加上static关键字,就是静态函数。其特性如下:

  • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
  • 不同的文件可以使用相同名字的静态函数,互不影响

普通函数可以在另一个文件中直接引用,甚至不必使用extern声明

4.静态块

静态块(Static Blocks):

  • 在C99标准中引入了静态块的概念,用于限制变量的作用域。
  • 静态块中声明的变量仅在该块内可见,不同于普通块(局部块)中的自动变量。

总结

使用static关键字可以改变变量、函数和块的作用域和可见性。静态变量可以使变量在函数执行结束后仍然存在,静态函数使得函数对其他源文件隐藏,静态全局变量只能在声明它的源文件内访问,而静态块可以局部限定变量的作用范围。

在程序设计中,合理使用static关键字可以提高代码的安全性、模块化程度和可维护性。

相关推荐
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hikktn5 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错5 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小林熬夜学编程7 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺8 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德8 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
幼儿园园霸柒柒9 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫9 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
摆烂小白敲代码10 小时前
背包九讲——背包问题求方案数
c语言·c++·算法·背包问题·背包问题求方案数