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关键字可以提高代码的安全性、模块化程度和可维护性。

相关推荐
stm 学习ing1 小时前
HDLBits训练5
c语言·fpga开发·fpga·eda·hdlbits·pld·hdl语言
就爱学编程2 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
北国无红豆3 小时前
【CAN总线】STM32的CAN外设
c语言·stm32·嵌入式硬件
单片机学习之路3 小时前
【C语言】结构
c语言·开发语言·stm32·单片机·51单片机
graceyun5 小时前
C语言初阶习题【9】数9的个数
c语言·开发语言
Schwertlilien6 小时前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习
程序员buddha7 小时前
C语言从入门到放弃教程
c语言·开发语言
AAA.建材批发刘哥11 小时前
Linux快速入门-Linux文件系统管理
linux·运维·服务器·c语言·学习方法
Kisorge13 小时前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
爱吃西瓜的小菜鸡17 小时前
【C语言】判断回文
c语言·学习·算法