关键字static完全解析

【C++面试八股】基础篇--3、C++ static关键字完全解析:从语法到实现原理的面试宝典 static关键字在C++中具有双重生命周期控制特性: 持久性:超出作用域依然存在 限定性:将可见性限制在特定范围内 阅读详情

在c语言中关键字static的意思是静态,它有三个明显的作用.

1).在函数体内,静态变量具有“记忆功能”,即一个变量被声明为静态变量,在函数下次被调用时仍保留上次调用该函数时该静态变量的值.

代码如下:

/*
	Name: 52coder
	Copyright: 52coder.net		
	Author: 尘世中迷途小书童
	Date: 15/05/15 11:49
	Description: 
*/
#include <stdio.h>
void fun()
{
	static int n=0;
	printf("%d\n",++n);
}
int main()
{
	for(int i=0;i<10;i++)
		fun();
	return 0;
}

运行结果:


静态全局变量有以下特点:

  • 该变量在全局数据区分配内存;
  • 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
  • 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的; 
静态变量都在全局数据区分配内存,包括静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:
代码区
全局数据区
堆区
栈区

  一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据,即使是函数内部的静态局部变量也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。

2、静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。
我们先举一个静态局部变量的例子,如下:
[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. void fn();  
  5.   
  6. int main(void)  
  7. {  
  8.     fn();  
  9.     fn();  
  10.     fn();  
  11.     return 0;  
  12. }  
  13.   
  14. void fn()  
  15. {  
  16.     static int n = 10;  
  17.     cout<<n<<endl;  
  18.     n++;  
  19. }  
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
  但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
  静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
静态局部变量有以下特点:
    (1)该变量在全局数据区分配内存;
    (2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
    (3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
    (4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

3、静态函数
  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
静态函数的例子:

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. static void fn();   //声明静态函数  
  5.   
  6. int main(void)  
  7. {  
  8.     fn();  
  9.     return 0;  
  10. }  
  11.   
  12. void fn()     //定义静态函数  
  13. {  
  14.     int n = 10;  
  15.     cout<<n<<endl;  
  16. }  

与全局变量相比,使用静态数据成员有以下两个优势:

1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性。

2)可以实现信息隐藏,静态数据成员可以是private成员,而全局变量不能。


static变量只能初始化一次。

代码如下:

#include <stdio.h>

void fun(int i)
{
	static int value=i++;
	printf("%d\n",value);
}
int main()
{
	fun(0);
	fun(1);
	fun(2);
	return 0;
}
程序输出为:

0

0

0

由于第一次调用函数fun()时i=0,所以value就初始化为0,以后再调用fun()都不会初始化value.



Java static关键字深度解析 System.out.println("手机验证: " + ValidationUtils.isValidPhone(phone));System.out.println("服务器端口: " + config.getConfig("server.port"));System.out.println("新的日志级别: " + config.getConfig("log.level"));System.out.println("应用名称: " + config.getConfig("app.name")); 阅读详情

相关推荐

C语言循环、数组、函数及指针练习题精选及答案

C语言循环、数组、函数及指针练习题精选及答案,习题经典,答案详细!

C/C++中的“static”

static修饰全局变量、函数和局部变量时的相关含义

xvrixingkong的博客 629

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析

本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。

weixin_28698059的博客 252

c 用static 修饰的变量,只能用在当前的文件中,对吗

修饰一个函数内的局部变量时,这个变量的作用域仍然限制在该函数内部,但它的生命周期会变为整个程序的运行期间。修饰一个在函数外部(即文件作用域)定义的变量时,这个变量的作用域会被限制在定义它的源文件中。这意味着该变量在其他源文件中是不可见的(即不是全局的),但它仍然在整个程序的运行期间存在。关键字有多种用途,但关于其修饰的变量(包括函数内的局部变量和文件作用域的变量)在可见性(作用域)和生命周期方面的效果,有一些常见的误解。修饰一个函数时,这个函数的可见性也会被限制在定义它的源文件中。对于函数内的局部变量,

xie__jin__cheng的博客 446

Flowable高级篇 -6.8.0 最全表结构说明-主要表结构字段注释

flowable 28张表 详细

billzhen的博客 1万+

文华指标源码—区间彩带

这就是当年东方财富软件终端里主打经典的指标、主要揭示主力成本区域。

qq2054129753的博客 888

四道指针应用题(帮助理解指针,指针数组)

1.循环移动 问题描述: 给定一组整数,要求利用数组把这组数保存起来,再利用指针实现对数组中的数循环移动。假定共有n个整数,则要使前面各数顺序向后移m个位置,并使最后m各数变为最前面的m各数。 输入样列: 11 4 15 3 76 67 84 87 13 67 45 34 45 输出样例: 67 45 34 45 15 3 76 67 84 87 13 代码如下: #inc...

linyuan703的博客 1790

别再让地图加载慢吞吞!GeoServer + GeoWebCache 缓存配置实战(附性能对比)

本文详细介绍了如何通过GeoServer和GeoWebCache优化地图服务性能,实现地图加载速度的显著提升。从缓存机制解析到实战配置流程,再到高级性能调优技巧,帮助开发者构建高效地图缓存系统,解决地图加载慢的问题。

weixin_42525369的博客 407

【C/C++基础练习题】简单指针与数组使用练习题

🍉内容专栏:【C/C++要打好基础啊】 🍉本文内容:简单指针与数组练习题(复习之前写过的实验报告) 🍉本文作者:Melon西西 🍉发布时间 :2023.2.12 目录 1.vector​编辑 2.编写一个函数实现数制的转换,不用递归,用数组实现。在主函数中输入一个十进制数,输出相应的十六进制数。 3. 编写字符串反转函数。该函数的功能是将指定字符串中的字符顺序颠倒存放,然后在主函数中进行测试。 4.编写一个程序,判定一个字符串是否是另一个字符串的子串,若是,则返回子串在主串中的位置。要

Catherine_77的博客 2007

FPGA人脸识别检测(先获取人脸图像以及灰度二值化)

由于图片有空洞等缺陷,所以后面要进行中值滤波、腐蚀、膨胀等算法处理,然后再对人脸进行框选,最后显示出来。最终的成像应该是下面这样的。(后面有时间再接着做哈哈哈)5、通过modelsim将操作后的图片数据写入gray_img.txt里面后,用matlab将txt转成图片。1、先用matlab将图片转换成txt数据,代码如下。读取图片的方式按照博客咸鱼里的方式来做,如下。2、FPGA读取txt数据。4、FPGA顶层模块及仿真。3、FPGA灰度二值化。

weixin_46312715的博客 2531

【Flow3D实战】从零构建水利冲淤模型:关键步骤与参数详解

本文详细介绍了使用Flow3D构建水利冲淤模型的关键步骤与参数设置技巧。从基础认知到前处理、计算设置和后处理,全面解析如何高效模拟水流与泥沙的相互作用,特别适用于桥墩冲刷、水库泄洪等工程场景。通过实战案例分享,帮助读者掌握Flow3D在水利工程中的精准应用,提升模型精度与计算效率。

weixin_42549723的博客 502

C/C++/C#中static关键字的本质差异与跨语言对比解析

在编程语言中,static关键字是一个基础且核心的概念,它用于控制变量和函数的存储期、链接性以及作用域。从原理上讲,static通过改变标识符的链接属性(内部链接vs外部链接)和存储期(静态存储期vs自动存储期),实现了数据的持久化与模块化封装。这一机制的技术价值在于提升代码的模块性、减少命名冲突,并为跨文件协作提供清晰边界。在应用场景上,C语言利用static实现模块私有变量和函数,C++将其扩展为类级别的静态成员,而C#则进一步深化为静态类与类型系统的一部分。本文聚焦于C、C++和C#中static的横

weixin_30268071的博客 506

创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—ISP图像处理开发案例

创龙科技研发的 TL3588-EVM 评估板具备强大视频处理能力,可满足多场景视频开发需求。为助力开发者快速上手,本文整理 7 个实用视频开发案例,涵盖从采集到显示的全流程,详细说明各案例的硬件连接、参数配置与代码解析,帮助开发者高效实现评估板视频相关功能开发与调试。

创龙,嵌入式一体化解决方案商 208

C++中Static的完全解析

                     C++中Static的完全解析C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个

jsjwql专栏 1万+

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 873

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C#中Static关键字解析

Static是C#中的一个修饰符,用于声明属于类型本身而不是特定对象的成员。使用static修饰的成员与类相关联,而不是与类的实例相关联。这意味着:​​类级别存储​​:静态成员在内存中只有一份拷贝,无论创建多少个类的实例​​直接访问​​:可以通过类名直接访问静态成员,无需创建类的实例​​共享性​​:所有实例共享同一个静态成员,修改一处会影响所有使用该成员的地方静态成员包括静态类、静态方法、静态属性、静态字段和静态构造函数等。Static关键字是C#中一个功能强大但需要谨慎使用的特性。实现了以下价值。

lzt1027的博客 1922

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深入解析Java中的static关键字

friendly(默认访问修饰符):在同一包内可见,不使用任何修饰符。使用位置:类、接口、变量、方法。private(私有访问修饰符): 在同一类的内部可见。使用位置:变量、方法。public(公共访问修饰符): 对所有类可见。使用位置:类、接口、变量、方法protected(保护访问修饰符): 对同一包内的类、或子类(子类可以不同包)可见。使用位置:变量、方法。修饰符当前类同一包内子类(同一包)子类(不同包)其他包publicYesYesYesYesYesprotected。

m0_73863802的博客 703

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 中的 static 关键字深入解析

static关键字在 Java 编程中具有重要的作用。它可以用于修饰变量、方法和内部类等,提供了一种在不创建对象的情况下访问成员的方式。静态变量和静态方法属于类而不是对象,所有对象共享静态变量,并且可以直接通过类名调用静态方法。静态代码块在类加载时执行,用于初始化静态变量。静态内部类与外部类的实例无关,可以直接通过外部类名访问。在实际编程中,我们可以根据具体的需求合理使用static关键字。例如,创建工具类、实现单例模式、定义常量等。

m0_72256543的博客 1573

static关键字

5.创建子类对象之前先创建父类对象,所以先执行Base()构造器,再执行Test()构造器,所以最后输出 base constructor和test constructor。之前扫描Demo类,发现没有父类,所以编译Demo类,在编译的过程中,static代码块按顺序优先执行。(1).main方法在哪里,就先扫描哪个类,先扫描Test类,发现没有父类,也没有static修饰的代码,那么编译Test类,并且main方法入栈。1.扫描Test类,发现有父类Base类,先去扫描父类,发现Base类没有父类。

2201_76081438的博客 1238

Java中的static关键字解析

java中static关键字的解析 目录 java中static关键字的解析 1. static详解 1.1为什么要用static? 1.2 static的用法 1.2.1 static变量 1.2.2 static方法 1.2.3 static代码块 2.static面试总结 1. static详解 1.1为什么要用stati...

二可 561

Static关键字

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:MyEclipse 作者:朱海恩 撰写时间: 2019.04.29 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_42585491的博客 1950

C#语言static关键字详细解析

要理解Static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用C# Static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样。 我们通常声明一个变量: int a; string s; 其实就是: auto int a; auto string s;

861

Java中的Static关键字解析

一、Static的用法 static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。(也就是方便在没有实例化对象的情况下来进行调用(方法/变量)) 1.static方法 示例 1).在上面的代码中print2()方法是独立于对象存在的,是可用类...

凉生i的博客 395

Static关键字解析以及反射笔记之一

Static关键字解析以及反射笔记Java中的static关键字解析一.static关键字的用途以下是关于反射的一些笔记与思考 Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于stat...

a719974515的博客 844
上一篇: 优酷土豆2014年校园招聘会笔试题
下一篇: 求数组中出现一次的数字
52coder
博客等级 码龄17年 87粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值