4

十一、变量作用域

 2 years ago
source link: https://www.techstack.tech/post/%E5%8D%81%E4%B8%80%E3%80%81%E5%8F%98%E9%87%8F%E4%BD%9C%E7%94%A8%E5%9F%9F/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

十一、变量作用域

发表于2021-12-24|更新于2021-12-24|C语言入门手册
字数总计:929|阅读时长:3分钟|阅读量:1|评论数:0

当你在 C 程序中定义一个变量时,根据你声明它的位置,它会有一个不同的 作用域(scope)

这意味着它将会在某些地方可用,而在其它地方不可用。

该位置决定了两种类型的变量:

  • 全局变量(global variables)
  • 局部变量(local variables)

这就是区别:在函数内部声明的变量就是局部变量,比如这个:

int main(void) {
int age = 37;
}

局部变量只有在函数内才能访问,它们会在函数结束后不复存在。它们会被从内存中清除掉(有一些例外)。

定义在函数外部的变量就是全局变量,比如这个示例:

int age = 37;

int main(void) {
/* ... */
}

全局变量可以从程序中的任何一个函数访问,它们在整个程序的执行过程中都是可用的,直到程序结束。

我提到过局部变量在函数结束之后就不再可用。

原因是局部变量默认是在 栈(stack) 上声明的,除非你使用指针在堆中显式地分配它们。但是这样一来,你就不得不自己管理内存了。

在函数内部,你可以使用 static 关键字初始化一个 静态变量(static variable)

我说了“在函数内部”,因为全局变量默认就是静态的,所以没有必要再添加这个关键字。

什么是静态变量?静态变量在没有声明初始值的时候会被初始化为 0,并且它会在函数调用中保持该值。

考虑这个函数:

int incrementAge() {
int age = 0;
age++;
return age;
}

如果我们调用一次 incrementAge(),我们将会得到返回值 1。如果我们再调用一次,我们总是会得到 1,因为 age 是一个局部变量并且在每次调用该函数的时候都会被重新初始化为 0

如果我们将该函数改为:

int incrementAge() {
static int age = 0;
age++;
return age;
}

现在我们每调用一次这个函数,我们就会得到一个增加了的值:

printf("%d\n", incrementAge());
printf("%d\n", incrementAge());
printf("%d\n", incrementAge());

将会给我们:

我们也可以在 static int age = 0; 中省略初始化 age 为 0 的代码,只写 static int age;,因为静态变量在创建时会自动设置为 0。

我们也可以有静态数组。这时,每一个数组元素都被初始化为 0:

int incrementAge() {
static int ages[3];
ages[0]++;
return ages[0];
}

在这一节中,我想多谈论一点 全局变量与局部变量 之间的差异。

局部变量 被定义在函数内部,只在该函数内可用。

就像这样:

#include <stdio.h>

int main(void) {
char j = 0;
j += 10;
printf("%u", j); //10
}

jmain 函数之外的任何地方都不可用。

全局变量 定义在所有函数的外部,就像这样:

#include <stdio.h>

char i = 0;

int main(void) {
i += 10;
printf("%u", i); //10
}

全局变量可以被程序内的任何函数访问。该访问并不只局限于读取全局变量的值:任何函数都可以更新全局变量的值。

因此,全局变量是一种在函数间共享相同数据的一种方式。

局部变量的主要不同在于,分配给局部变量的内存会在函数结束之后立即释放。

全局变量只在程序结束时才会释放。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK