跳到主要内容

指针、数组和指针算术

概述

指针与数组基本等价

指针和数组基本等价的原因在于指针算术和 Cpp内部处理数组的方式。首先要理解的是什么是算术。

算术的定义

将整数变量加1后,其值将增加1;但将指针变量加1后,增加的量等于它指向的类型的字节数。将指向double的指针加1后,如果系统对double使用8个字节存储,则数值将增加8,因为double类型通常占8个字节。

数组名解释为地址

C/Cpp将数组名解释为地址。

例如 test[1] 会被看作 *(test + 1)

如果使用的是指针,而不是数组名,则Cpp也将执行同样的转换: test[1] 等同于 *(test+1) (此处test为指针类型)。

特性

指针与数组名的区别

在很多情况下,可以相同的方式使用指针名和数组名。

但有以下几个例外

数组名的地址不可改变

test = test + 1; //错误
Pointer_test = Pointer_test + 1; //正确。

也就是说,数组名是一个常量,其所指向的位置不能被随意更改。

sizeof()运算

sizeof运算符返回的结果对这两个类型来说不相同。数组名会返回数组的大小,指针会返回指针的大小。

数组的动态联编和静态联编

使用数组声明来创建数组时,将采用静态联编,即数组的长度在编译时设置。

创建动态联编数组

使用new[ ]运算符创建数组时,将采用动态联编(动态数组),即在运行时为数组分配空间,其长度也将在运行时设置。

释放动态联编数组占用的空间

使用完这种数组后,应使用delete[ ]释放其占用的内存。