一点都不安静的 ——static

一点都不安静的 ——static,第1张

一点都不安静的 ——static 介绍头文件

抛砖引玉一下

为什么要有头文件
  • 单纯的使用源文件,组织项目结构的时候,项目越大就会越复杂,维护成本变得越来越高,有一定规模的项目,一定是多文件的,多文件之间,后续一定进行数据“交互”的,而且一个项目一般都不是一个人单独开发的,所以更加要进行数据“交互”的**( #include.h : test.h --> main.c --> test.c )** 函数,如果不能跨文件,“交互” 成本比较高,所以C语言本身就设计好了。


  • 文件:组织项目结构的时候,减少项目的维护成本问题,特别是大型项目的维护成本问题。


  • 文件分布式

所以头文件应该放什么
  • C语言内置的头文件
  • 所有的变量的声明(extern)
  • 所有的函数声明
  • #define 宏 ,typedef ,struct, 枚举,共用体,类型

声明 – extern
  • 在自定义的头文件中声明变量的 时候 一定要使用 extern 声明变量,声明不会开辟空间所以可以多次声明,而定义会开辟空间,所以同一个变量只能定义一次,更多详细请看:[变量声明]((81条消息) C语言 —— 关键字_月光下的编程魔术师的博客-CSDN博客)
  • 声明没有开辟空间,开辟空间不是目的,存放数据才是目的,因为存放数据需要空间存放,所以才开辟空间的
  • 函数的声明我也建议带上 extern ,代码好习惯,好风格

extern void Print();
extern int num;
// 注意:我的这个是在自定头文件放着的

  • 想要在别的文件中使用 全局变量的话,就要在头文件中 声明该全局变量,再使用,
extern void Print();
int num;
// 注意:我的这个是在自定头文件放着的
  • 注意声明变量的时候,不要省略修饰符 extern 上述代码虽然可以通过不会出错,但是存在歧义,表达不清晰,它是不是有点像定义变量,所以它是定义变量还是,声明变量,模糊,所以为了你好,别人好,请加上修饰符 extern
// 注意:我的这个是在自定头文件放着的
extern void Print();
extern  int num;

局部变量
  • 局部变量,局域临时性
  • 函数调用开辟空间并初始化
  • 函数结束释放空间

#include
void fun()
{
	int i = 0;
	i++;
	printf("i = %d\n", i);
}
int main()
{

	for (int i = 0; i < 10; i++)
	{
		fun();
	}


	return 0;
}

  • 结果:如下,我们发现其结果并没有相加,而是一直为 1

  • 原因:
    • 我们定义的 i 是个局部变量,临时性,出了作用域,该函数就会自动释放空间了,空间都释放了,其里面的数据,自然也就没了
    • 我们这里循环了 10 次,每一次,进入函数,定义 i ,打印一次,出函数释放 定义 i 的空间,又重新定义初始化 i ,打印,这样十次的结果都是 1

  • 我们打印这十次的地址看看:
#include
void fun()
{
	int i = 0;
	i++;
	//printf("i = %d\n", i);
	printf("i = %p\n", &i);
}
int main()
{

	for (int i = 0; i < 10; i++)
	{
		fun();
	}


	return 0;
}

  • 结果:发现地址居然是一样的,不过这可能是编译器的原因吧!
  • 因为:为了防止一个空间的重复多次的使用,而开辟失败的机制,每次开辟的空间应该是不一样的


static 的探究

好了,经过一番其他知识的铺垫,我们来,玩玩这 一点也不安静的 static 关键字吧!

  • 在C语言中:
    static是用来修饰变量和函数的
    1. 修饰局部变量 —— 称为静态局部变量
    2. 修饰全局变量 —— 称为静态全局变量
    3. 修饰函数 —— 称为静态函数

static 修饰局部变量
  • 首先我们对比,看看下面这个程序与我们上面之前的局部变量的程序的不同:
#include
void fun()
{
	static int i = 0;
	i++;
	printf("i = %d\n", i);
	
}
int main()
{

	for (int i = 0; i < 10; i++)
	{
		fun();
	}


	return 0;
}


  • 结果:大家发现没有,我只是在 定义 **i ** 变量上加了一个修饰符 static 结果就可以实现累加效果了,
  • 原因:就是这里 “一点也不安静的 static” 在作怪:
    • 被 static 修饰的局部变量,会更改局部变量的 生命周期 这里大家注意:仅仅是改变了局部变量的生命周期,其中的局部变量的作用域并没有发生改变的。


    • 这里让我们的局部变量的生命周期,延长到了程序的结束。


    • 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。


  • 请看验证:


  • 我们使用了 static 修饰变量 num ,我们离开它的作用域范围,在其他函数中使用该变量,发现报错:未定义该标识符,
  • 证实了我们的猜测:被 static 修饰的局部变量:仅仅是改变了局部变量的生命周期,其中的局部变量的作用域并没有发生改变的。



static 修饰全局变量
  • 首先我问一个问题,请问全局变量可以跨文件访问吗?
    • 嘿嘿,of course ! (可以)
  • 嘿嘿! 而 static 修饰全局变量,就让其失去其,全局的功效:
    • 被 static 修饰的全局变量,该全局变量只能在本文件中内可以被访问,不能被外部其他文件直接 访问,但是,可以被间接访问(通过一个函数接口访问)
    • 被 static 修饰的全局变量,改变的是该全局变量的作用域,它的生命周期并没有改变的,(因为全局变量生命周期为整个进程的结束(项目的结束))


  • 从上述的代码图中我们可以看到被 static 的全局变量失去了,它本来的全局性,只能被其所定义的本文件中使用,但是可以间接访问调用(函数接口)。


  • 例子如下:通过函数的调用实现其打印要求:(函数接口)



static 修饰函数
  • 同样,首先我问一个问题,请问函数可以跨文件访问吗?
    • 嘿嘿,of course ! (也可以)
    • 只要对该函数,声明在了所需调用的代码文件当中就可以,使用了
  • 嘿嘿! 但是我们的“一点都不安静的 ——static” 会搞鬼!
    • 被 static 修饰的函数,该函数只能在本文件中内被调用访问使用,不能在其他外部文件中直接访问使用,为项目维护,提供了安全的保证 ,但是可以间接访问,通过所在的代码文件调用使用,(封装函数)
    • 被 static 修饰的函数,改变的是函数的作用域,不是生命周期

  • 验证如下:



  • 上述代码图:我们发现被 staitc 修饰的函数,确实不能被其他外部直接访问
  • 我们试试封装函数,对被 **static ** 修饰的函数,间接访问。




  • 介绍一个内存结构图,其实,这个并不叫内存,它的真面目是叫:进程地址空间 ,是 *** 作系统里面的有关知识。



总结:
  • 声明:多多使用 extern ,非常好的代码风格

    • 声明不会开辟空间,所以可以多次,
    • 定义会开辟空间,所以同一个变量只能定义一次,否侧:报错——>重定义 了
    • 开辟空间不是目的,存放数据才是目的
    • 因为存放数据需要空间,所以才开辟空间的
  • 在C语言中:
    static是用来修饰变量和函数的

    1. 修饰局部变量 —— 称为静态局部变量:
      被 static 修饰的局部变量,可以实现累加,主要是改变了,局部变量的生命周期,延长了局部变量的生命周期,使它出了作用域,还不会被销毁,释放空间。


    2. 修饰全局变量 —— 称为静态全局变量
      被 static 修饰的全局变量,只能在本文件中使用,不可以被外部直接访问,但是可以被间接访问(函数接口),本质上是:改变了全局变量的作用域,没有改变生命周期
    3. 修饰函数 —— 称为静态函数
      被 static 修饰的函数,只能在本文件中使用,访问,不可以被其他外部文件,直接访问,但是可以被间接访问(函数接口),本质上是:改变了函数的作用域,没有改变生命周期
  • 项目中合理好好利用,static 可以增加项目的维护性,大大提高项目的安全性:

  • 是项目开发的神器中的神器


最后: 每博一文案

人生好像总是有满满的遗憾,生活总是有缺陷,才显得美丽。


我们总是在错误的时间遇到那个对的人,多少刻骨铭心都变成了一声叹息。


或许有些感情只适合用来回忆,有些人只能藏在心底,成我只属于你自己的秘密,偶尔回忆,从不忘记,

总有一天,岁月会抚平伤痛的痕迹。


当你回头望时,记住到只有曾经的甜蜜

​ ———— 一禅心灵庙语

限于自身水平,其中存在的错误希望大家,给予指教,韩信点兵——多多益善!谢谢大家,后会有期,江湖再见!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存