數組的概念與指針的概念聯系非常解密。其實數組的標識相當於它的第一個元素的地址,如:int a[5],數組名a指向它的第一個元素a[0]的地址。
有語句如下:
int a[5];
下面的賦值為合法的:
p = a;
這裡指針p 和a 是等價的,它們有相同的屬性,唯一的不同是我們可以給指針p賦其它的數值,而a 總是指向被定義的5個整數組中的第一個。所以,p只是一個普通的指針變量,而與之不同,a 是一個指針常量(constant pointer),數組名的確是一個指針常量。因此雖然前面的賦值表達式是合法的,但下面的不是:
a = p;
因為a 是一個數組(指針常量),常量標識不可以被賦其它數值。
由於變量的特性,以下例子中所有包含指針的表達式都是合法的:
#include <iostream>
using namespace std;
int main()
{
int a[5];
int *p;
p = a; //p是a[0]的地址,因a指向a的首地址,即指向a[0],
*p = 10; //即a[0]=10
p++;
*p = 20; //a[1]=20
p = &a[2];
*p = 30; //a[2]=30;
p = a +3;
*p = 40; //a[3]=40
p = a;
*(p+4) = 50; //a[4]=50
for(int n=0; n<5; n++)
{
cout<<a[n]<<", ";
}
cout<<'\n';
}
輸出:10, 20, 30, 40, 50,
括號[]來指明我們要引用的數組元素的索引(index)。中括號[]也叫位移(offset)操作符,它相當於在指針中的地址上加上括號中的數字。
例如,下面兩個表達式互相等價:
a[5] = 0; // a [offset of 5] = 0不管a 是一個指針還是一個數組名, 這兩個表達式都是合法的。