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

相关推荐
Happy鱿鱼1 小时前
C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)
c语言·开发语言·数据结构
KBDYD10101 小时前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法
LWDlwd05251 小时前
shell指令及笔试题
c语言
Crossoads1 小时前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
QXH2000002 小时前
数据结构—单链表
c语言·开发语言·数据结构
David猪大卫2 小时前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ2 小时前
数据结构(Day14)
linux·c语言·数据结构·算法
微尘82 小时前
C语言存储类型 auto,register,static,extern
服务器·c语言·开发语言·c++·后端
五味香3 小时前
C++学习,动态内存
java·c语言·开发语言·jvm·c++·学习·算法
Aurora20053 小时前
蓝桥杯2024省C
c语言·算法·蓝桥杯