C语言变量详解
文中代码均在VS2022 X64的条件下实现.
一、什么是变量?
在C语言中,变量是一种基本的编程元素,用于存储和表示数据。
1. 变量定义
在C语言中,变量的定义包括两个主要部分:数据类型和变量名。数据类型决定了变量可以存储的数据的类型,而变量名则是在程序中标识这个存储位置的名称。
例如,下面是一个简单的整数变量的定义:
1.int age; //定义一个整型变量,变量名称为age
变量的age的储存地址是 0x000000AA471FF6D4
在这里,int
是数据类型,指示这个变量将存储整数值。age
是变量名,用于在程序中引用这个特定的变量。
2. 变量存储数据的方式
变量是一种存储数据的方式,它在计算机内存中分配一块空间来保存数据。它的本质可以说是内存空间,在计算机中,变量是为了存储和处理数据而分配的内存空间的抽象表示,这个数据可以是整数、浮点数、字符等不同类型。通过为变量分配内存,程序可以使用变量名来读取或修改存储在这块内存中的数据。
存储类别与对应存储位置
存储类别 | 关键字 | 存储位置 | 作用域 | 生命周期 | 初始化要求 |
---|---|---|---|---|---|
自动变量 | auto | 栈区 | 局部(代码块) | 代码块执行期间 | 可未初始化 |
寄存器变量 | register | CPU寄存器 | 局部(代码块) | 代码块执行期间 | 必须显式初始化 |
静态局部 | static | 静态存储区 | 局部(代码块) | 程序运行期间 | 默认初始化为0 |
静态全局 | static | 静态存储区 | 文件内全局 | 程序运行期间 | 默认初始化为0 |
外部变量 | extern | 静态存储区 | 跨文件全局 | 程序运行期间 | 需外部定义 |
例如:
1.age = 25; // 将整数值25存储到变量age中
将25这个数字储存在变量名为age的地址中。默认情况下,数据储存在栈区中。
3. 变量的命名规则和规范
在C语言中,变量名需要遵循一些规则和规范,以确保代码的可读性和一致性:
- 由字母、数字、下划线组成,不能以数字开头
- 区分大小写(
Age
与age
是不同变量) - 禁止使用C语言关键字(如
int
,for
等),但可重定义库函数名(如scanf
).
二、C语言变量的声明和初始化
1. 变量声明:
在C语言中,声明变量是为了告诉编译器将要使用某个标识符代表一个特定类型的数据。
变量的声明通常包括类型和变量名。初始化是在声明变量的同时给它一个初始值。
变量创建的语法形式是这样的:
data_type name;
| |
| |
数据类型 变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
2. 变量初始化:
变量初始化是在声明变量的同时为其赋初值。
初始化的形式为:
<数据类型> <变量名> = <初始值>;
例如:
int age = 18; // 在创建整型变量age的同时,给它赋值
3.初始化的好处:
- 避免使用未初始化的变量导致的错误: 在C语言中,未初始化的变量包含的值是不确定的,可能是随机的。使用了未初始化的变量,可能会发生错误。
- 增加代码可读性: 初始化变量可以使代码更加清晰和可读。
- 编译器优化:明确的初始化可以帮助编译器生成更有效的代码。
三、变量的作用域
1.局部变量(Local Variables):
在⼤括号内部定义的变量就是局部变量。
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。
2.全局变量(Global Variables):
在大括号外部定义的变量就是全局变量。
全局变量的使⽤范围更⼴,整个工程中想使用,都是有办法使用的。
#include <stdio.h>
int global = 2023;//全局变量
int main()
{
int local = 2018;//局部变量
printf("%d\n", local);//2018
printf("%d\n", global);//2023
return 0;
}
当全局变量和局部变量同名时,局部变量会掩盖全局变量。
#include <stdio.h>
int n = 1000;
int main()
{
int n = 10;
printf("%d\n" n);// 10
return 0;
}
3.作用域规则:
-
就近原则:
在嵌套的作用域中,变量的访问按照就近原则。也就是说,程序会优先查找最内层的作用域,如果找不到变量,就会逐级向外查找。 -
同名变量:
同名变量在不同的作用域中是相互独立的。如果在局部作用域中有一个与全局作用域中同名的变量,那么在局部作用域中的变量会优先使用,而全局变量会被隐藏。 -
块作用域:
块作用域可以在任意代码块(花括号{ }
内)内声明变量。说明if
语句、for
循环等结构中声明的变量只在该结构内部可见。
4.常见作用域:
1. 局部作用域
局部变量的生命周期:
程序运行到变量所在的那一行时,变量开始创建,生命周期开始,当程序运行到 { } 结束后,变量被销毁,生命周期结束。
int Add(int x, int y)
{
int sum = x + y;// 变量sum就只能在函数Add中使用,sum是局部变量
return sum;
}
2. 全局作用域
全局变量的生命周期:
当程序开始运行时,变量便开始创建,等到程序运行结束时,变量才开始被销毁。所以程序的生命周期就是全局变量的生命周期。
int s = 1000;// 全局变量,在整个程序中都可以使用
int Add(int x, int y)
{
int sum = x + y;// 变量sum就只能在函数Add中使用,sum是局部变量
return sum;
}
3. 块作用域
在{ }
中创建的变量属于局部变量,只能在{ }
中使用。
int main()
{
int x = 10;
if (x <= 10)
{
int y = 100; // 局部变量,只能在if语句中的{}中使用
printf("x = %d y = %d", x, y);
}
return 0;
}
4. 函数参数作用域
函数参数相当于在函数内部创建的局部变量。
int Add(int x, int y)
{
int sum = x + y;// x 和 y 是函数参数,是局部变量,只能在函数内部使用
return sum;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int ret = Add(a, b);
pritnf("%d\n", ret);
return 0;
}
四、extern关键字
在C语言中,我们创建好一个项目后,比如有多个文件File1.c
和File2.c
。
如果我们想要在File2.c
文件中使用File1.c
文件的全局变量,就要使用到extern
关键字。
File1.c
文件:
// file1.c
#include <stdio.h>
int flag = 100; // 定义全局变量
File2.c
文件:
// file2.c
#include <stdio.h>
extern int flag;// 外部声明全局变量,表示该变量在其他文件中定义
int main()
{
printf("flag = %d\n", flag);
return 0;
}
运行结果:
flag = 100
在上面的例子中,file1.c
定义了一个全局变量 flag
。在 file2.c
中,我们使用 extern 关键字
声明了 flag
,表示该变量在其他文件中定义。然后,我们可以在 file2.c
的 main
函数中使用该全局变量。
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/liziyaoshangan/article/details/147422030