博主介绍:程序喵大人
- 35- 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
- 更多原创精品文章,首发gzh,见文末
- 👇👇记得订阅专栏,以防走丢👇👇
😃C++基础系列专栏
😃C语言基础系列
在C语言中,存储类型定义了变量或函数在内存中的存储位置、生命周期和作用域。下面将详细介绍C语言中主要的存储类型,主要有几个关键字:register
、static
和extern
。
register
register
用于提示编译器将变量存储在CPU寄存器中,而不是RAM中。
寄存器的访问速度比RAM快得多,因此对于需要频繁访问的变量,使用register
可以提高程序的运行速度。
需要注意的是,register
是一个建议而非强制要求,编译器可能会忽略这个建议。
此外,由于寄存器大小有限,register
变量的大小不能超过寄存器的大小。
示例代码:
#include <stdio.h>void myFunction() {register int count = 0;for (count = 0; count < 1000000; count++) {// 频繁访问count变量}printf("Count reached 1000000\n");
}int main() {myFunction();return 0;
}
static
static
在C语言中有两种主要用途:一是修饰局部变量,使其在函数调用之间保持值不变;二是修饰全局变量,限制其作用域仅限于声明它的文件内。
- 修饰局部变量: 当
static
修饰局部变量时,该变量在程序的生命周期内只被初始化一次,并且在函数调用之间保持其值不会改变。
示例代码:
#include <stdio.h>void myFunction() {static int count = 0; // 静态局部变量,只在程序开始时初始化一次count++;printf("Count = %d\n", count);
}int main() {for (int i = 0; i < 5; i++) {myFunction();}return 0;
}
输出:
Count = 1Count = 2
Count = 3Count = 4
Count = 5
- 修饰全局变量: 当
static
修饰全局变量时,变量的作用域被限制在声明它的文件内。这对于模块化编程非常有用,可以避免命名冲突。
示例代码(两个文件):
// file1.c
#include <stdio.h>static int globalVar = 100; // 静态全局变量,只在file1.c中可见void printGlobalVar() {printf("GlobalVar in file1.c = %d\n", globalVar);
}
// file2.c
#include <stdio.h>// extern int globalVar; // 如果去掉static,则需要在file2.c中声明
void anotherFunction() {// printf("GlobalVar in file2.c = %d\n", globalVar); // 错误:globalVar在file2.c中不可见
}int main() {printGlobalVar();anotherFunction();return 0;
}
编译和运行:
clang file1.c file2.c -o myProgram./myProgram
输出:
GlobalVar in file1.c = 100
extern
extern
用于声明在其他文件中定义的全局变量或函数。
当在多个文件中使用全局变量或函数时,可以在一个文件中定义它们,并在其他文件中使用extern
关键字来声明它们。这样,所有文件都可以访问同一个全局变量或函数,实现跨文件的数据共享。
示例代码(两个文件):
// file1.c
#include <stdio.h>int globalVar = 100; // 全局变量,在file1.c中定义void printGlobalVar() {printf("GlobalVar in file1.c = %d\n", globalVar);
}
// file2.c
#include <stdio.h>extern int globalVar; // 声明在file1.c中定义的全局变量void anotherFunction() {printf("GlobalVar in file2.c = %d\n", globalVar);
}int main() {printGlobalVar();anotherFunction();return 0;
}
编译和运行:
clang file1.c file2.c -o myProgram./myProgram
输出:
GlobalVar in file1.c = 100GlobalVar in file2.c = 100
建议,对于频繁访问的变量,可以考虑使用register
来提高访问速度;对于需要在函数调用之间保持值的变量,可以使用static
;对于需要在多个文件中共享的全局变量,可以使用extern
进行声明。
码字不易,欢迎大家点赞,关注,评论,谢谢!
C++训练营
专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍