C++ 将数组名解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。从数字上而言,这两个地址相同,无需区分;但从概念上特别是需要运用指针算术时,需要明白两者的区别。如下示例中假设 short 宽 2 字节,系统为 32 位,数组首地址为0x0028ccf0,指针变量 ptr 和 ptrc 的区别如下:
- 变量 ptr 的类型是 short*,存储的是一个 2 字节内存块的地址,它指向的对象是 short 类型,记号 *ptr 与 tacos[0] 等价。
- 变量 ptrc 的类型是 short(*)[10],存储的是一个 20 字节内存块的地址,它指向的对象是包含 10 个元素的 short 数组,记号 *ptrc 与 tacos 等价。
表示 tacos、&tacos、&tacos[0] 的区别如下:
- 数组名 tacos 和 &tacos[0] 等效,类型都为 short *,存储的是一个 2 字节内存块的地址,它们指向的对象是 short 类型,但在运用 sizeof() 时,这两者会有区别,sizeof(tacos)=20 而 sizeof(&tacos[0])=4。
- 表示 &tacos 的类型为 short(*)[10],存储的是一个 20 字节内存块的地址,它指向的对象是包含 10 个元素的 short 数组。
[code]//声明并初始化数组short tacos[10] = {5,2,8,4,1,2,2,4,6,8};//声明并初始化指针一:以下几种赋值结果对ptr等效short *ptr = tacos; //值为0x0028ccf0short *ptr = &tacos[0]; //值为0x0028ccf0//声明并初始化指针二short (*ptrc)[10] = &tacos;//值为0x0028ccf0//访问数组第三个元素cout |