值类型
本课程介绍了值类型的概念,并更详细地讨论了&运算符。
值类型 很容易描述:值类型的变量直接持有其值。例如,所有的整数类型和浮点数类型都是值类型。虽然不那么明显,但固定长度的数组也是值类型。
例如,一个 int 类型的变量包含一个整数值:
1 int speed = 123;
变量 speed 占用的字节数即为 int 类型的大小。如果将内存想象成一条从左到右延伸的带子,那么这个变量就位于其中的某个位置:
当值类型的变量被复制时,它们会各自拥有独立的值:
1 int newSpeed = speed;
新变量将拥有自己独立的位置和值:
显然,对这些变量所做的修改是相互独立的:
1 speed = 200;
另一个变量的值不会受到影响:
下面断言检查的使用说明
以下示例中包含断言检查,用于表明其条件为真。换句话说,这些并非常规意义上的检查,而是我用来向读者展示“这是正确的”方式。
例如,下面的检查 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。
在下一课中,我们将学习引用变量。