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 = 0; i < MAX; i++)
{
cout << "var[" << i << "]的内存地址为 ";
cout << ptr << endl;
cout << "var[" << i << "] 的值为 ";
cout << *ptr << endl;
// 移动到下一个位置
ptr++;
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
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 = 0; i < MAX; i++)
{
*var = i; // 这是正确的语法
var++; // 这是不正确的
}
return 0;
}
把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值。
由于一个数组名对应一个指针常量,只要不改变数组的值,仍然可以用指针形式的表达式。例如,下面是一个有效的语句,把 var[2] 赋值为 500:
*(var + 2) = 500;
上面的语句是有效的,且能成功编译,因为 var 未改变。

文人墨客
经过实验确实如此我在教程中的实例里发现, ptr=var; 这句话改为 ptr=&var[0]; 也可以,经过实验确实如此。
#include <iostream> using namespace std; const int MAX=3; int main () { int var[MAX] = {10, 100, 200}; int *ptr=NULL; ptr=var; //这句话改为"ptr=&var[0];"也可以 for(int i=0; i<3; i++) { cout << "var[" << i << "]的值为:" << *ptr << ",内存地址为:" << ptr << endl; ptr++; //移到下一个位置 } system("pause"); return 0; }文人墨客
#include <iostream> using namespace std; const int MAX = 3; int main() { int var[MAX] = { 10, 100, 200 }; cout << var << endl; cout << *var << endl; for (int i = 0; i < MAX; i++) { *(var+i) = i; // 这是正确的语法 cout << *(var+i) << endl; cout << i << endl; cout << &var[i] << endl; cout << var << endl; } return 0; }上面笔记的一些补充,var++ 实际上是 var=var+1,而var是常量,不能出现在=(赋值符号)的左边,但是 *(var+i)、&var[i]都是允许的,尝试这些操作可以加深理解。上述代码运行结果:
文人墨客
#include <iostream> using namespace std; int main () { int var[3] = {10,100,200}; int *p=var; for (int i = 0; i < 3; i++) { cout << *(var++) << endl; //编译错误,因为var是数组名(也是数组首元素地址),不是一个变量,不可修改其值 cout << *(var+i) << endl; //编译正确,因为没有对var进行赋值,只是通过与i相加访问变量地址 cout<< *(p++)<<endl; ///编译正确,p为指针变量可赋值 } return 0; }文人墨客
教程示例中的 *var = i; 实际上是改变了数组中的第一个元素的值。
证明如下:
#include <iostream> using namespace std; int main () { int ar[3] = {10,100,200}; for (int i = 0; i < 3; ++i) { *ar = i; // *ar 实际上指向的是ar中的第一个元素的地址值 cout << *ar << endl; cout << ar[i] << endl; } return 0; }输出结果:
每次循环 *ar 都是改变了数组中第一个元素的值, 因此只有第一次输出的结果显示 ar[i] 被改变。
最后一条是输出了 *ar 和 ar[0] 的地址值, 结果显示两者地址值相同。
文人墨客
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; cout<<var<<endl; cout<<*var<<endl; for (int i = 0; i < MAX; i++) { *var = i; // 这是正确的语法 cout<<*var<<endl; cout<<i<<endl; cout<<&i<<endl; cout<<var<<endl; *(var+1)=500; cout<<*(var+1)<<endl; //var++; // 这是不正确的 } return 0; }输出结果:
根据实验结果,此章节最后一句应该不是说数组内的数值不能修改,而是说只要var的值(地址)不变,那么相应位置的数值改变了,该数组的地址也不会受到影响。