关键字深度刨析(2)
今日目标:static sizeof
头文件引入
// main.c
// 声明并没有开辟空间 != 叫做赋值或者初始化
// 所有的变量声明的时候,不能设置初始值
// extern int op = 100;
extern int op;
int main()
{
printf("%d", op);
show();// 有报警 但是可以运行
return 0;
}
// ----------------------------------------------------------
// test.c
int op = 1000;
void show()
{
printf("show");
}
为什么要有头文件:
- 单纯的使用源文件,在组织项目结构的时候,项目越大越复杂,维护成本越来越高!
- .h:头文件,组织项目结构的时候,减少大型项目的维护成本问题。
- 头文件重复包含问题。添加 #pragma once
- c头文件
- 所有的变量的声明
- 所有的函数的声明
- #define 类型typedef struct
- 以及 <stdio.h>等...
- 引入自定义头文件 #include "test.h"
// test.h
#pragma once
# include <stdio.h>
extern int op;
// 变量必须带上 extern
extern void show();
- 全局变量可以跨文件访问。
- 函数可以跨文件访问。
在具体的场景中,有没有可能,我们不想让全局变量或者函数跨文件访问,只在本文件内部访问?
static详解
- static 修饰全局变量只能在本文件内使用,不能被直接访问,但是可以通过内部函数间接访问.
- static 修饰函数只能在本文件内使用,不能在其他文件访问。
- 变相的封装,只对外暴露一个接口供使用。
- static 项目维护,提供安全保证。
- 一旦使用 static 会改变 作用域和生命周期
// 修饰全局变量
static int op = 100;
static void show()
{
printf("show()");
}
- static 修饰局部变量
- 价值是更改局部变量的生命周期
- 临时变量生命周期改为全局变量
- 作用域不变只在本代码块内
static void fun()
{
/*
函数调用开辟空间并初始化
函数结束释放空间
i 局部变量,局域临时性
*/
static int i = 0;
i++;
printf("%d", i);
}
int main()
{
for (int i = 0; i < 10; i++)
{
fun();
}
return 0;
}
sizeof详解
- 单位是字节
- 确定一种类型对应开在开辟空间的时候的大小,编译时确定的。
- sizeof 不是函数,是操作符
printf("%d",sizeof(char));
printf("%d",sizeof(int));
printf("%d",sizeof(short));
printf("%d",sizeof(float));
printf("%d",sizeof(long));
printf("%d",sizeof(double));
- c中为何要有类型:本质对内存进行合理划分,按需索取。
- 类型为什么在c语言中有这么多种:
- 应用场景不同,解决应用场景对应的计算方式不同,需要空间的大小也不同,本质用最小的成本,解决各种多样化的场景问题。
int *p = NULL;
int arr[10];
int *test[3];
printf("%d",sizeof(p));// 4
printf("%d",sizeof(arr));// 40
printf("%d",sizeof(test));// 12
// 单位byte
小总结:
- static是修饰变量或函数的,让变量只能在本文件内访问,其他文件不能直接访问,对于修饰局部变量只会初始化一次,会让局部变量不释放,延长生命周期,但是作用域不会变,它们都存在内存的静态区.
- sizeof 不是函数,是操作符,返回对应类型的字节。