4.8.1 程序说明(1)
在多数情况下,C++(www.cppentry.com)将数组名解释为数组第1个元素的地址。因此,下面的语句将pw声明为指向double类型的指针,然后将它初始化为wages-wages数组中第1个元素的地址:
和所有数组一样,wages也存在下面的等式:
为表明情况确实如此,该程序在表达式&stacks[0]中显式地使用地址运算符来将ps指针初始化为stacks数组的第1个元素。
接下来,程序查看pw和*pw的值。前者是地址,后者是存储在该地址中的值。由于pw指向第1个元素,因此*pw显示的值为第1个元素的值,即10000。接着,程序将pw加1。正如前面指出的,这样数字地址值将增加8,这使得pw的值为第2个元素的地址。因此,*pw现在的值是20000-第2个元素的值(参见图4.10,为使改图更为清晰,对其中的地址值做了调整)。
|
| (点击查看大图)图4.10 指针加法 |
此后,程序对ps执行相同的操作。这一次由于ps指向的是shor t类型,而short占用2个字节,因此将指针加1时,其值将增加2。结果是,指针也指向数组中下一个元素。
注意:将指针变量加1后,其增加的值等于指向的类型占用的字节数。
现在来看一看数组表达式stacks[1]。C++(www.cppentry.com)编译器将该表达式看作是*(stacks + 1),这意味着先计算数组第2个元素的地址,然后找到存储在那里的值。最后的结果便是stacks [1]的含义(运算符优先级要求使用括号,如果不使用括号,将给*stacks加1,而不是给stacks加1)。
从该程序的输出可知,*(stacks + 1)和stacks[1]是等价的。同样,*(stacks + 2)和stacks[2]也是等价的。通常,使用数组表示法时,C++(www.cppentry.com)都执行下面的转换:
如果使用的是指针,而不是数组名,则C++(www.cppentry.com)也将执行同样的转换:
因此,在很多情况下,可以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数组名是常量: