变量和常量

变量的本质

在C语言中,不同类型的数据有不同的存储方式,在内存中所占的大小不同,地址对齐方式也不相同。我们可以使用不同的数据类型来定义变量,不同类型的变量在内存中的存储方式和大小也不相同。

1
2
3
4
5
6
7
8
9
10
11
12
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
int x = 10;
char c = 'A';

printf(" x 字节大小 = %d\n", sizeof(x));
printf(" c 字节大小 = %d\n", sizeof(c));

return 0;
}

输出结果:

1
2
x 字节大小 = 4
c 字节大小 = 1

数据类型定义字节大小,变量名是内存地址的别名,存储实际数据。这个内存地址是存储实际数据的起始地址,而数据类型的字节大小就表明从这个起始地址开始读取的字节大小,这样就能够找到对应存储的实际数据,不会多读,也不会少读。

变量名的本质,其实就是一段内存空间的别名。编译器在编译程序时会将变量名看成一个符号,符号值即变量的地址,各种不同的符号保存在符号表中。我们可以通过变量名对和它绑定的内存单元进行读写,而不是直接使用内存地址。通过变量名访问内存,既方便了程序的编写,也大大增强了程序的可读性。

变量本质.png

不同类型的变量有不同的存储方式、作用域和生命周期。在定义一个变量时,我们可以使用char、int、float、double等关键字来指定变量的类型,再加上short和long这两个整型限定符,基本上就确定了这个变量在内存中的存储空间的大小。有时候我们还可以使用一些变量修饰限定符来改变变量的存储方式,常用的修饰符有auto、register、static、extern、const、volatile、restrict、typedef等。这些修饰限定符往往会决定变量的存储位置、作用域或生命周期,所以一般也被称为存储类关键字。

不同类型的变量存储.png

常量折叠

1
int val = 3 * 4 + 5 * 2;

查看变量地址存储数据:

常量.png

十六进制 00000016 转换成 十进制为 22,所以当一个C语言程序中存在常量表达式时,编译器在编译时会把常量表达式优化成一个固定的常量值,以节省存储空间。我们把这种编译优化称为常量折叠。

⭐️内容取自王利涛《嵌入式自我修养》,仅从中取出个人以为需要纪录的内容。不追求内容的完整性,却也不会丢失所记内容的逻辑性。如果需要了解细致,建议读原书。