c语言关键字深度刨析(2)

155 阅读3分钟

关键字深度刨析(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 不是函数,是操作符,返回对应类型的字节。