指针与数组(Pointers vs Arrays)
优质
小牛编辑
130浏览
2023-12-01
指针和数组密切相关。 实际上,指针和数组在许多情况下是可互换的。 例如,指向数组开头的指针可以使用指针算法或数组样式索引来访问该数组。 考虑以下程序 -
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have array address in pointer.
ptr = var;
for (int i = 0; i < MAX; i++) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the next location
ptr++;
}
return 0;
}
编译和执行上面的代码时,它产生的结果如下 -
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
但是,指针和数组不是完全可互换的。 例如,考虑以下程序 -
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
for (int i = 0; i < MAX; i++) {
*var = i; // This is a correct syntax
var++; // This is incorrect.
}
return 0;
}
将指针运算符*应用于var是完全可以接受的,但修改var值是非法的。 原因是var是一个指向数组开头的常量,不能用作l值。
因为数组名称生成指针常量,所以只要不修改它,它仍然可以在指针式表达式中使用。 例如,以下是将var [2]赋值为500的有效语句 -
*(var + 2) = 500;
上面的语句是有效的,并且将成功编译,因为var未更改。