C++ 指针 vs 数组
C++ 中的指针和数组是密切相关的,指针和数组在很多情况下是可以互换的
一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> const int LEN = 5; int main () { int arr[LEN] = {8, 16, 32,64,128}; // 指针中的数组地址 int *ptr = arr; ptr = arr; for (int i = 0; i < LEN; i++) { std::cout << "arr[" << i << "]的内存地址为 "; std::cout << ptr << std::endl; std::cout << "var[" << i << "] 的值为 "; std::cout << *ptr << std::endl; // 移动到下一个位置 ptr++; } return 0; }
编译和运行以上范例,输出结果如下
arr[0]的内存地址为 0x7ffee42c91e0 var[0] 的值为 8 arr[1]的内存地址为 0x7ffee42c91e4 var[1] 的值为 16 arr[2]的内存地址为 0x7ffee42c91e8 var[2] 的值为 32 arr[3]的内存地址为 0x7ffee42c91ec var[3] 的值为 64 arr[4]的内存地址为 0x7ffee42c91f0 var[4] 的值为 128
但是
指针和数组并不是完全互换的,就是数组变量是不能做自增自减和加减法赋值给自己
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> const int LEN = 5; int main () { int arr[LEN] = {8, 16, 32,64,128}; for (int i = 0; i < MAX; i++) { *arr = i; // 这是正确的语法 arr++; // 这是不正确的 } return 0; }
把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的
因为 var 是一个指向数组开头的常量,不能作为左值
因为一个数组名对应一个指针常量,只要不改变数组的值,仍然可以用指针形式的表达式
*(arr + 2) = 500;
上面的语句是有效的,且能成功编译,因为 var 未改变