一、通過數組名訪問數組元素
看下面代碼:
int i, a[] = {3,4,5,6,7,3,7,4,4,6};
for (i = 0; i <= 9; i++)
{
printf("%d\n", a[i]);
}
很顯然,它是顯示 a 數組的各元素值。我們還可以這樣訪問元素,如下:
int i, a[] = {3,4,5,6,7,3,7,4,4,6};
for (i = 0; i <= 9; i++)
{
printf("%d\n", *(a+i));
}
它的結果和作用完全一樣。
二、通過指針訪問數組元素
int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6};
pa = a; /*請注意數組名a直接賦值給指針pa*/
for (i = 0; i <= 9; i++)
{
printf("%d\n", pa[i]);
}
很顯然,它也是顯示 a 數組的各元素值。另外與數組名一樣也可如下:
int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6};
pa = a;
for (i = 0; i <= 9; i++)
{
printf("%d\n", *(pa+i));
}
看pa = a
,即數組名賦值給指針,以及通過數組名、指針對元素的訪問形式看,它們並沒有什麼區別,從這裏可以看出:數組名其實也就是指針。難道它們沒有任何區別?有,請繼續。
三、數組名與指針變量的區別
請看下面的代碼:
int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6};
pa = a;
for (i = 0; i <= 9; i++)
{
printf("%d\n", *pa);
pa++; /*注意這裏,指針值被修改*/
}
可以看出,這段代碼也是將數組各元素值輸出。不過,你把循環體{}中的pa改成a試試。你會發現程序編譯出錯,不能成功。看來指針和數組名還是不同的。其實上面的指針是指針變量,而數組名只是一個指針常量。這個代碼與上面的代碼不同的是,指針pa在整個循環中,其值是不斷遞增的,即指針值被修改了。數組名是指針常量,其值是不能修改的,因此不能類似這樣操作:a++
。
前面4、5節中pa[i],*(pa+i)處,指針pa的值是使終沒有改變。所以變量指針pa與數組名a可以互換。
四、聲明指針常量
再請看下面的代碼:
int i, a[] = {3,4,5,6,7,3,7,4,4,6};
int *const pa = a; /* 注意const的位置:不是const int *pa */
for (i = 0; i <= 9; i++)
{
printf("%d\n", *pa);
pa++ ; /*注意這裏,指針值被修改*/
}
這時候的代碼能成功編譯嗎?不能。因爲pa指針被定義爲常量指針了。這時與數組名a已經沒有不同。這更說明了數組名就是常量指針。但是……
int *const a = {3,4,5,6,7,3,7,4,4,6}; /*不行*/
int a[]={3,4,5,6,7,3,7,4,4,6}; /*可以,所以初始化數組時必定要這樣。*/