Logo
Section 1 / 5

值类型

本课程介绍了值类型的概念,并更详细地讨论了&运算符。

导入

值类型

本课程介绍了值类型的概念,并更详细地讨论了&运算符。

值类型 很容易描述:值类型的变量直接持有其值。例如,所有的整数类型和浮点数类型都是值类型。虽然不那么明显,但固定长度的数组也是值类型。

例如,一个 int 类型的变量包含一个整数值:

1 int speed = 123;

变量 speed 占用的字节数即为 int 类型的大小。如果将内存想象成一条从左到右延伸的带子,那么这个变量就位于其中的某个位置:

...
值类型变量的拷贝

当值类型的变量被复制时,它们会各自拥有独立的值:

1 int newSpeed = speed;

新变量将拥有自己独立的位置和值:

...
int 变量

显然,对这些变量所做的修改是相互独立的:

1 speed = 200;

另一个变量的值不会受到影响:

...
newSpeed 变量不受影响

下面断言检查的使用说明

以下示例中包含断言检查,用于表明其条件为真。换句话说,这些并非常规意义上的检查,而是我用来向读者展示“这是正确的”方式。 例如,下面的检查 assert(speed == newSpeed) 表示“speed 等于 newSpeed”。

值的相等性

如上述内存表示所示,变量涉及两种类型的相等性:

  • 值相等性:课程中多次出现的 == 运算符通过比较变量的值来判断是否相等。当两个变量在这一意义上被认为相等时,意味着它们的值相同。
  • 值身份:从拥有独立值的角度看,speed 和 newSpeed 具有不同的身份。即使它们的值相等,它们仍然是不同的变量。
1import std.stdio; 2 3void main() { 4 int speed = 123; 5 int newSpeed = speed; 6 assert(speed == newSpeed); 7 speed = 200; 8 assert(speed != newSpeed); 9}

取地址操作符 &

到目前为止,我们已经在 readf() 中使用了 & 操作符。& 操作符告诉 readf() 输入数据应存储在内存中的哪个位置,也就是输入数据的地址。

注意:正如我们在“从标准输入读取”章节中所见,readf() 也可以不显式使用指针来调用。

变量的地址还可以用于其他用途。下面的代码只是简单地打印出两个变量的地址:

1import std.stdio; 2 3void main(){ 4 int speed = 123; 5 int newSpeed = speed; 6 7 writeln("speed : ", speed, " 地址: ", &speed); 8 writeln("newSpeed: ", newSpeed, " 地址: ", &newSpeed); 9}

speed 和 newSpeed 的值相同,但它们的地址不同。

...
相同值但不同地址

注意:每次运行程序时,地址的值通常都会不同。变量位于程序执行期间恰好可用的内存区域。
地址通常以十六进制格式显示。此外,如果两个地址的值相差 4 字节,说明这两个对应变量在内存中是相邻存放的。 注意:十六进制中的 C 对应十进制的 12,因此 8 和 12 之间的差值为 4。


在下一课中,我们将学习引用变量。

不可变性

引用变量