C語言指針與數組名

http://c.biancheng.net/cpp/html/492.html

一、通過數組名訪問數組元素

看下面代碼:

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}; /*可以,所以初始化數組時必定要這樣。*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章