蓝色字体为差异部分。
对数组取地址时,数组名也不会被解释为其地址。等下,数组名难道不被解释为数字的地址吗?
不完全如此:数组名被解释为第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址:
short tell[10];
cout << tell << endl;
cout << &tell << endl;
从数字上说,这两个地址相同;但从概念上说&tell[0](即tell)是一个2字节内存块的地址,而&tell是一个20字节内存块的地址。因此表达式tell+1 将地址值加2,而表达式&tell+ 1 将地址加上20。换句话说,tell是一个short指针(*short),而&tell是一个这样的指针,即指向包含10个元素的short数组(short(*)[10])。
c您可能会问,前面有关&tell的类型描述是如何来的呢?首先,您可以这样声明和初始化这种指针:
short (*pas)[10] = &tell;
如果省略括号,优先级规则将使得pas先与[10]结合,导致pas是一个short指针数组,它包含10个元素,
一次括号是必不可少的。其次,如果要描述变量的类型,可将生命中的变量名删除。因此,pas的类型为short(*)[10]。
另外,由于pas被设置为&tell,因此*pas与tell等价,所以(*pas)[0]为数字的第一个元素。