这里本该有简介

C语言 – 变量的地址与变量的值

变量的定义与赋值

编程语言中有一个比较容易混淆的概念就是“变量的地址”与“变量的值”。因为在编程语言中我们用同一个标号来表示这两个东西,由编译器根据上下文判断它的具体含义。

让我们看下最简单的变量的定义与赋值:

  • 第1行,表示定义了一个变量a。对于编译器来说,编译器为a分配一个地址,这个地址代表一个存储空间,空间中存储的数据的类型是int
  • 第2行,表示赋值,把9赋值给变量a。即程序运行时,通过变量a的地址找到存储空间,然后向存储空间中写入9。

这个存储空间可以用下图表示,这里假设编译器分配给a的地址为C9420
image

再来看一组表达式:

  • 第1行,见上例。
  • 第2行,见上例。
  • 第3行,表示定义了一个变量b。对于编译器来说,编译器为b分配一个地址,这个地址代表一个存储空间,空间中存储的数据的类型是int *
  • 第4行,表示赋值,把a的地址赋值给b。即程序运行时,通过b的地址找到存储空间,然后向存储空间中写入一个数据,这个数据是a的地址。

这个存储空间可以用下图表示,这里假设a的地址为C9420,b的地址为CC004
image

通过上面两个例子可以看出来这几个因素与变量有关:
* 变量的地址
* 变量的值
* 变量的类型

变量的地址用于寻找存储空间,存储空间存放变量的值,该值的类型由变量的类型来定义。

sizeof

sizeof不是函数,是c语言中的一元运算符。它用来计算一个对象或者一个数据类型所占用的空间大小,单位为char所占用的字节。

以下例子,我们假设char类型占用1字节,int占用4字节,指针占用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。

再来看结构体的例子:

sizeof(struct test)的结果可能是8而不是5,这里涉及到字节对齐。

test