目录
前言
从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。
提示:文章作者为初学者,有问题请评论指正,感谢。
1. 存储相关关键字
register 、static 、const 、extern
1.register
register 是 寄存器的意思,用 register 修饰的变量是寄存器变量,
首先,我们知道在计算机中,有一些特别快速的存储空间叫做“寄存器”。这些寄存器比内存更快,因此,如果我们能把一些常用的变量放进寄存器里,程序就会运行得更快。这时,我们可以使用 register
关键字来修饰变量。当我们声明一个变量时,加上 register
,就是在告诉编译器:请尽量把这个变量放到寄存器里。但是,需要注意几点:
1.并不是所有变量都能真正存放在寄存器中。编译器会根据情况决定是否将变量放入寄存器。
2.寄存器是宝贵的资源,所以不能定义寄存器数组。
3.register 只能修饰字符型和整型的变量,不能用于浮点数类型。
register char ch; //正确的
register short int b; register int c; //正确的
register float d; //错误的
4.因为 register
修饰的变量可能存放在寄存器中而不是内存中,所以我们不能对寄存器变量取地址。这是因为只有存放在内存中的数据才有地址,我们可以通过地址来访问它们。
register int a; int *p;
p =&a;//错误的 ,a 可能没有地址
2.static
全局变量那些后面才讲,如果全放进来就感觉过于臃肿了,先就这么理解吧,我把图也放在那里了,根据图理解。全局变量就是,定义了之后所有的地方都可以调用。
static 是静态的意思,static 可以修饰全局变量、局部变量、函数。
修饰全局变量:
通常全局变量是在整个程序中都可以访问的。但如果你用 static
来修饰全局变量,那么这个变量就变成了静态全局变量就只能在它被声明的那个文件中使用,其他文件是访问不到的。
static int globalCount = 0;
// 这个变量只能在这个hello.c文件中使用,在a.c里面访问不到的
修饰局部变量:
意思:局部变量通常只在函数内部存在,当函数结束时,局部变量就会消失。但如果用 static
来修饰局部变量,那么这个变量的值会在函数调用之间保持不变,即使函数结束了,下次调用时这个变量的值还是上次的值。
例子:
void function() {
static int localCount = 0; // 这个变量的值在函数调用之间不会消失
localCount++;
printf("函数被调用 %d 次\n", localCount);
}
修饰函数:
意思:和全局变量类似,通常函数是在整个程序中都可以调用的。但如果你用 static
来修饰函数,那么这个函数就叫内部函数就只能在它被声明的那个文件中调用,其他文件不能调用这个函数。
static void privateFunction() {
// 这个函数只能在这个hello.c文件中调用,其他不能调用
}
3.const
用 const 修饰的变量是只读的,不能修改它的值。
const
关键字在C语言中就像是给变量加上一个“不可改变”的标签。当你用 const
来修饰一个变量时,你就是在告诉编译器和其他程序员:这个变量的值一旦被设置,就不应该被改变。
比如,你有一个变量,它代表一周中的天数,这个数字是固定的,不会变化,那么你可以这样写:
const int DAYS_IN_WEEK = 7;
这样,DAYS_IN_WEEK
这个变量就被设置为7,并且以后不能被改变。如果你的代码中试图改变它的值,编译器会报错,因为你已经用 const
告诉它这个值是不可变的。
另一个例子是,如果你在写一个函数,这个函数接受一个参数,但是你不想在函数内部改变这个参数的值,你也可以用 const
来修饰这个参数:
void printNumber(const int number) {
printf("%d\n", number);
// number = 10; // 这会报错,因为number是const,不能被改变
}
在这个 printNumber
函数中,参数 number
被声明为 const
,所以在函数内部不能对它进行修改。
const
也可以修饰指针
const
也可以修饰指针,它的作用是限制指针所指向的数据。
首先,你知道指针是什么吗?它就像一个地址,指向内存中的某个位置。我们可以通过指针来访问那个位置的数据。
现在,有时候我们希望这个指针指向的数据不可修改,也就是说,我们不希望通过这个指针去改变那个内存位置的值。这时候,我们就可以用 const
来修饰这个指针。
举个例子,假设我们有一个整数变量 int x = 10;
,然后我们定义一个指针 int *p = &x;(
p
现在包含了 x
的地址,通过 p
我们可以找到 x
并访问或修改 x
的值。)
如果我们这样定义:const int *p = &x;
,那么这个指针 p
就变成了一个指向常量的指针。这意味着,我们可以通过 p
来读取 x
的值,但是不能通过 p
来修改 x
的值。
同样,如果我们这样定义:int const *p = &x;
,效果也是一样的。
如果我们这样定义:int *const p = &x;
,那么这个指针 p
就变成了一个常量指针。这意味着,我们可以通过 p
来修改 x
的值,但是不能让 p
指向其他的内存位置。
4.extern
关键字
extern
关键字用来声明一个变量,告诉编译器这个变量的定义在其他地方,让不同的文件可以共享这个变量。
首先,我们知道在 C 语言中,我们可以定义变量,比如 int x;
,这样我们就创建了一个整数类型的变量 x
。
但是,有时候我们希望在不同的文件中共享这个变量。比如,我们在一个文件中定义了变量 x
,然后在另一个文件中也想使用它。
这时候,我们就可以用 extern
关键字来帮助我们。它的作用是告诉编译器:“嘿,这个变量 x
不是在这个文件里定义的,它在其他地方定义了,你要去找一下。”
具体来说,我们可以这样使用 extern
:在一个文件中,我们定义了变量 int x;,
然后在其他文件中,我们可以这样写:extern int x;
。这样,编译器就知道了,我们在这里只是声明了一个变量 x
,它的定义在其他地方。
// helper.c 文件
int count = 0; // 定义并初始化一个全局变量
现在,我们希望在 main.c
文件中也能访问这个 count
变量。但是,我们不能在 main.c
中再次定义它,因为 C 语言不允许两个同名的全局变量。这时候,我们就可以在 main.c
中使用 extern
关键字来声明这个变量。
// main.c 文件
#include <stdio.h>
extern int count; // 声明一个在其他文件中定义的全局变量
int main() {
printf("Count is %d\n", count); // 使用这个全局变量
return 0;
}
在 main.c
中,我们通过 extern int count;
告诉编译器,count
是一个在别的地方定义的全局变量,我们这里只是引用它。这样,当我们编译这两个文件并链接它们生成程序时,main.c
就可以访问 helper.c
中定义的 count
变量了。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言中存储相关的关键字register 、static 、const 、extern,祝愿你我的朋友在学习的路上一帆风顺,也祝愿我会成为一个优秀的嵌入式工程师。