C++ 指针 vs 数组
指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。请看下面的程序:
实例
#include
<
iostream
>
using
namespace
std
;
const
int
MAX
=
3
;
int
main
(
)
{
int
var
[
MAX
]
=
{
10
,
100
,
200
}
;
int
*
ptr
;
// 指针中的数组地址
ptr
=
var
;
for
(
int
i
=
;
i
<
MAX
;
i
++
)
{
cout
<<
"
var[
"
<<
i
<<
"
]的内存地址为
"
;
cout
<<
ptr
<<
endl
;
cout
<<
"
var[
"
<<
i
<<
"
] 的值为
"
;
cout
<< *
ptr
<<
endl
;
// 移动到下一个位置
ptr
++;
}
return
;
}
当上面的代码被编译和执行时,它会产生下列结果:
var[0]的内存地址为 0x7fff59707adc var[0] 的值为 10 var[1]的内存地址为 0x7fff59707ae0 var[1] 的值为 100 var[2]的内存地址为 0x7fff59707ae4 var[2] 的值为 200
然而,指针和数组并不是完全互换的。例如,请看下面的程序:
实例
#include
<
iostream
>
using
namespace
std
;
const
int
MAX
=
3
;
int
main
(
)
{
int
var
[
MAX
]
=
{
10
,
100
,
200
}
;
for
(
int
i
=
;
i
<
MAX
;
i
++
)
{
*
var
=
i
;
// 这是正确的语法
var
++;
// 这是不正确的
}
return
;
}
把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值。
由于一个数组名对应一个指针常量,只要不改变数组的值,仍然可以用指针形式的表达式。例如,下面是一个有效的语句,把 var[2] 赋值为 500:
*(var + 2) = 500;
上面的语句是有效的,且能成功编译,因为 var 未改变。