C++ 指针与一维数组名
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数组。
//声明并初始化数组
short tacos[10] = {5,2,8,4,1,2,2,4,6,8};
//声明并初始化指针一:以下几种赋值结果对ptr等效
short *ptr = tacos; //值为0x0028ccf0
short *ptr = &tacos[0]; //值为0x0028ccf0
//声明并初始化指针二
short (*ptrc)[10] = &tacos;//值为0x0028ccf0
//访问数组第三个元素
cout << tacos[2]; //结果为8
cout << *(tacos+2); //结果为8
cout << ptr[2]; //结果为8
cout << *(ptr+2); //结果为8
cout << (*ptrc)[2]; //结果为8
cout << *(*ptrc+2); //结果为8
//应用指针算术时单位1表示的字节数
cout << int(tacos+1)-int(tacos); //结果为2
cout << int(&tacos[0]+1)-int(&tacos[0]);//结果为2
cout << int(&tacos+1)-int(&tacos); //结果为20
cout << int(ptr+1)-int(ptr); //结果为2
cout << int(ptrc+1)-int(ptrc); //结果为20
//应用sizeof()获得内存量大小
cout << sizeof(tacos); //结果为20
cout << sizeof(&tacos[0]);//结果为4
cout << sizeof(&tacos); //结果为4
cout << sizeof(tacos[0]); //结果为2
cout << sizeof(ptr); //结果为4
cout << sizeof(ptrc); //结果为4
上述例子中数组名tacos和指针变量ptrc以及ptr的区别如下:
- 数组名
tacos是常量,值不能修改;ptrc以及ptr是变量,值可以修改。 - 对数组名
tacos使用sizeof()得到的是整个数组的内存量宽度;对ptrc以及ptr使用sizeof()得到的是指针变量的内存量宽度。
实际上,上述访问方式中,C++ 编译器会自动将 tacos[2]转换为*(tacos+2),将ptr[2]转换为*(ptr+2),将(*ptrc)[2]转换为*(*ptrc+2),前者称为数组表示法,后者称为指针表示法。
本文作者:木三百川
本文链接:https://www.cnblogs.com/young520/p/16687935.html
版权声明:本文系博主原创文章,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请附上出处链接。遵循 署名-非商业性使用-相同方式共享 4.0 国际版 (CC BY-NC-SA 4.0) 版权协议。

浙公网安备 33010602011771号