首页 > 其他分享 >C语言中关键字static

C语言中关键字static

时间:2024-07-15 16:25:34浏览次数:16  
标签:变量 访问 成员 C语言 关键字 static 修饰 函数

前言

       在C语言中,static 是一个关键字,它可以用在不同的上下文中,赋予变量或函数不同的意义。static 关键字主要用于控制变量的存储期和可见性,以及函数的链接性。下面是 static 关键字的主要作用原理与用途:

局部静态变量

        当 static 修饰局部变量时(即在函数内部定义的变量),它会改变该变量的存储期,但不会改变其作用域。局部静态变量只在其定义的函数内部可见,但它的生命周期贯穿整个程序运行期间,而不是在函数调用结束后就销毁。这意味着,即使函数执行完毕,局部静态变量的值也会被保留,并在下一次函数调用时继续使用。

       一般未定义储存类型的变量会自动的定义为auto储存类型(储存类型有四种,auto,static,extern,register)auto的存储位置在栈(栈是由编译器申请,由编译器释放),使用的时候临时申请空间,使用完就撤销保存,而使用static关键词进行修饰后它的储存位置就改到了静态区初始化后存在数据段,它的生命周期延长至直到结束。

参考下面的代码示例来理解;

使用关键词static进行修饰

全局静态变量

             当 static 修饰全局变量时(即在函数外部定义的变量),它会限制该变量的链接性(linkage),使其只在定义它的文件内部可见,对其他文件不可见。这有助于避免不同文件中的全局变量名冲突。

       当一个全局变量在一个源文件中定义后,想要在其他源文件中进行使用时,需要在需使用的源文件中加入一个链接告诉编译器此变量已在其他文件中定义,你去其他文件中找吧,即extern 数据特征 变量名(例 extern int a)告诉编译器整形变量a在其他文件定义了。如果使用static关键词进行修饰后,就限制此变量的作用域只在本源文件,不会作用其他源文件出现的同样变量,限制了该变量的链接性。

静态函数

       当 static 修饰函数时,它会将函数的链接性更改为内部链接(internal linkage),意味着该函数只能在其定义的文件内部被调用,其他文件无法链接到这个函数。这有助于封装,并防止函数名在不同文件间的冲突。

与全局静态变量相似,其作用是限制了其函数的作用域,只可在自己的源文件中使用。

C++扩展

修饰类成员变量

        在C++中,当static修饰符用于类成员变量时,这个成员变量就不再属于类的任何特定对象实例,而是属于类本身。这意味着所有该类的对象共享这个static成员变量的一个实例。这个特性使得static成员变量成为在类的所有对象之间共享数据的理想方式。

以下是一些关于static修饰类成员变量的关键点:

  1. 存储期static成员变量的存储期与程序的运行期相同,即它们在程序开始时被分配内存,并在程序结束时被销毁。

  2. 初始化static成员变量必须在类定义之外进行初始化,通常在类的实现文件(.cpp文件)中进行。如果static成员变量是整型或枚举类型,并且没有被显式初始化,那么它会被自动初始化为0。对于其他类型,如果没有显式初始化,则结果是未定义的。

  3. 访问static成员变量可以通过类名直接访问,而不需要创建类的对象。但是,在类的成员函数内部,可以像访问普通成员变量那样通过this指针(尽管实际上并不需要使用this,因为static成员变量与任何特定对象无关)或者简单地通过成员变量名来访问它。在类外访问static成员变量时,必须通过类名和作用域解析运算符::来访问。       

 修饰成员函数:   

        在C++中,当static修饰符用于成员函数时,这个成员函数就不再与类的任何特定对象实例相关联。这意味着你不能在static成员函数中访问类的非静态成员变量(除非通过对象实例的指针或引用显式传递),因为非静态成员变量是依赖于具体对象实例的。static成员函数可以访问类的其他static成员变量和成员函数。

   static成员函数的主要用途包括实现与类相关的工具性功能,这些功能不需要访问类的非静态成员。它们也常用于访问或修改类的static成员变量。

以下是一些关于static修饰成员函数的关键点:

  1. 访问限制:由于static成员函数不与任何对象实例相关联,因此不能在static成员函数内部使用this指针。this指针用于访问调用它的对象的成员,但在static成员函数中没有这样的对象。

  2. 调用方式static成员函数可以通过类名直接调用,也可以通过类的对象实例调用(尽管这样做在逻辑上可能不太直观,因为static成员函数不依赖于任何特定对象)。

  3. 参数传递:如果static成员函数需要访问类的非静态成员,它必须接受一个指向类对象的指针或引用作为参数。

标签:变量,访问,成员,C语言,关键字,static,修饰,函数
From: https://blog.csdn.net/m0_67669662/article/details/140418536

相关文章

  • static块执行时机
    不是类被加载的时候就执行,而是类初始化的时候才被执行。类初始化有以下几种情况:当一个类被主动使用时,Java虚拟就会对其初始化,如下六种情况为主动使用:当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)当调用某个类的静态方法时当使用某个类或接口的静态字段时当调用Java......
  • 【C语言】 全面解析占位符
    文章目录什么是占位符?常见的占位符及其用法占位符的宽度和精度常见错误和注意事项占位符的高级用法占位符在实际编程中的应用结论在C语言编程中,占位符是一种常用的编程工具,通常用于表示即将填入的某个值。占位符不仅在格式化输出中非常有用,而且在调试和开发过程......
  • 【C语言】全面解析冒泡排序
    文章目录什么是冒泡排序?冒泡排序的基本实现代码解释冒泡排序的优化冒泡排序的性能分析冒泡排序的实际应用结论在C语言编程中,排序算法是一个非常基础且重要的概念。冒泡排序作为最简单、最易理解的排序算法之一,广泛应用于各种编程教学和实践中。本文将全面解析C语......
  • C语言指针超详解——强化篇
    C语言指针系列文章目录入门篇强化篇文章目录C语言指针系列文章目录1.assert断言2.指针的使用和传址调用2.1strlen的模拟实现2.2传值调用和传址调用3.数组名的理解4.使用指针访问数组5.一维数组传参的本质6.冒泡排序7.二级指针8.指针数组9.指针数组模拟......
  • C语言典型例题
    本系列博客针对于《C程序设计教程(第四版)——谭浩强编著》这本书中的所有例题和习题进行了详细的解释和学习,希望可以对你学习C语言可以有所帮助。有些代码可能会在前面详细解释,后面会一笔带过,希望大家可以多多翻阅,谢谢大家啦!!!嘻嘻!!!//C程序设计教程(第四版)——谭浩强编著//例......
  • 【c语言】你绝对没见过的预处理技巧
    ......
  • C++ static关键字
    在C++中,static关键字有多种用途,主要用于控制变量和函数的存储期和链接性。下面详细介绍static关键字在不同上下文中的用法,并提供相应的代码示例。1.静态局部变量静态局部变量在函数中定义,但它们的生命周期贯穿程序的整个运行周期,而不仅仅是函数的执行周期。静态局部变量......
  • C语言实现扫雷游戏
    目录一、引言二、游戏规则三、设计思路 1.游戏概述2.数据结构设计3.游戏流程设计4.功能模块划分5.主要算法设计四、游戏设计 1.菜单函数2.主函数3.选择难度函数 4.初始化函数5.布置地雷函数  6.打印函数7.计算雷数函数 8.递归排雷函数9.标记(删除......
  • auto关键字
    作用:能自动推断出是什么数据类型代码示例:autoname()//能判断出返回值时字符串类returnstd::string("hhh");弊端:对变量类型不明确,可能会破坏依赖特定类型的代码比如字符串类的.strlen()什么时候用:当类型过长时intmain(){std::vector<std::string>strings;strin......
  • C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #
    文章目录前言序1:什么是内存?序2:地址是怎么产生的?一、指针是什么1、指针变量的创建及其意义:2、指针变量的大小二、指针的解引用 三、指针类型存在的意义四、野指针1、什么是野指针2、野指针的成因a、指针未初始化b、指针越界访问c、指针指向的空间释放3、如何......