变量的定义与赋值
编程语言中有一个比较容易混淆的概念就是“变量的地址”与“变量的值”。因为在编程语言中我们用同一个标号来表示这两个东西,由编译器根据上下文判断它的具体含义。
让我们看下最简单的变量的定义与赋值:
int a; // 1
a = 9; // 2
- 第1行,表示定义了一个变量a。对于编译器来说,编译器为a分配一个地址,这个地址代表一个存储空间,空间中存储的数据的类型是
int
。 - 第2行,表示赋值,把9赋值给变量a。即程序运行时,通过变量a的地址找到存储空间,然后向存储空间中写入9。
这个存储空间可以用下图表示,这里假设编译器分配给a的地址为C9420
:
再来看一组表达式:
int a; // 1
a = 9; // 2
int* b; // 3
b = &a; // 4
- 第1行,见上例。
- 第2行,见上例。
- 第3行,表示定义了一个变量b。对于编译器来说,编译器为b分配一个地址,这个地址代表一个存储空间,空间中存储的数据的类型是
int *
。 - 第4行,表示赋值,把a的地址赋值给b。即程序运行时,通过b的地址找到存储空间,然后向存储空间中写入一个数据,这个数据是a的地址。
这个存储空间可以用下图表示,这里假设a的地址为C9420
,b的地址为CC004
:
通过上面两个例子可以看出来这几个因素与变量有关:
- 变量的地址
- 变量的值
- 变量的类型
变量的地址用于寻找存储空间,存储空间存放变量的值,该值的类型由变量的类型来定义。
sizeof
sizeof不是函数,是c语言中的一元运算符。它用来计算一个对象或者一个数据类型所占用的空间大小,单位为char
所占用的字节。
以下例子,我们假设char
类型占用1字节,int
占用4字节,指针占用4字节。
int a = 0;
char b = 't';
char* c = &b;
int arr[9] = {0};
int* p_arr = arr;
printf("%d, %d, %d, %d\n", sizeof(char), sizeof(int), sizeof(char*), sizeof(int*)); // 结果为 1, 4, 4, 4
printf("%d, %d, %d, %d, %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(arr), sizeof(p_arr));// 结果为 4, 1, 4, 36, 4
- int占用4个字节的存储空间,a的类型为int,所以
sizeof(a)
等于4。 - char占用1个字节的存储空间,b的类型为char,所以
sizeof(b)
等于1。 - 指针占用4个字节的存储空间,c的类型为指针,所以
sizeof(c)
等于4。 - arr是一个数组,
sizeof(arr)
计算的是整个数组占用的空间,所以等于36。 - 指针占用4个字节的存储空间,p_arr的类型为指针,所以
sizeof(p_arr)
等于4。
再来看结构体的例子:
struct test {
int a;
char b;
};
sizeof(struct test)
的结果可能是8而不是5,这里涉及到字节对齐。