指針是C語言裏面很重要的一個東西,C語言因爲有了指針才變得絢麗多彩。有句話是這樣說的“如果你掌握了指針與內存,那麼C語言也就學會了。”,由此可見,指針的重要性。這裏我簡要談談指針數組與數組指針的區別。
從他們的名字我們可以得出這樣的結論:
指針數組:這是一個數組;
數組指針:是一個指針。
然後我們看看他的用法:
(我們在分析是數組還是指針的時候可以採用把他名字和類型分開來分析,去掉他的名字以後剩下的就是類型,化複雜爲簡單,由內到外一步一步的去分析,切莫操之過急)
例如:
int *arr[ ]: 由於[ ]的優先級高於*,所以他是一個數組。去掉他的名字,我們看到他的類型是一個int*,所以他表 示數組中的內容是int*型的指針,整體就代表他是就是一個指針數組。
int (*arr)[ ]:由於( )的優先級高,所以arr與*先結合,所以確定它是一個指針,去掉它我們看到留下了int [ ]。所 以整體就是數組指針。
接下來我們看一個簡單程序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int *a[5] = {0}; //指針數組
int (*p)[5] = NULL; //數組指針
int i = 0;
p = &arr;
//將數組c中元素賦給數組a
for(i=0;i<4;i++)
{
a[i]=&arr[i];
}
printf("%d\n%d\n", *a[0], (*p)[0]);
return 0;
}
接下來看看結果
結果一樣
那麼我們是不是可以得出一個結論:指針數組和數組指針是一樣的?
接下來我們進一步看看這個數組指針
數組名的指針,即數組首元素地址的指針。即是指向數組的指針。
例:int (*p)[10]; p即爲指向數組的指針,又稱數組指針。
易混淆概念
數組指針是指向數組首元素的地址的指針,其本質爲指針;
指針數組是數組元素爲指針的數組(例如 int *p[3],定義了p[0],p[1],p[2]三個指針),其本質爲數組。
數組指針的使用在某些情況下與指針數組很相似,要注意區別。
二維概念
爲了能更好地理解數組指針,與普通指針及二級指針的區別,下面舉例說明一下。
char c[][3] = {"abc", "cds", "dss", "asz", "as", "vdd"};
char (*p)[3];
int i;
p = c;
for(i=0; i<6; i++)
{
printf("%s, ", *(p+i)); //*p++;
}
printf("\n"); //p=c;/p--;
for(i=5; i>=0; i--)
{
printf("%s\n", *(p+i)); //*p--;/*--p;
}
指針數組:
int i;
char *pch[6] = {"abc", "cds", "dss", "asz", "as", "vdd"}; //這種寫法不提倡,應該先聲明一個數組,再把地址給指針,
for(i=0;i<6;i++) //否則很危險;
{
printf("%s, ",*(pch+i));
}
printf("\n");
for(i=5; i>=0; i--)
{
printf("%s\n",*(pch+i));
}
例如:{int a[4][5];int (*p)[5]=a;}這裏a是個二維數組的數組名,相當於一個二級指針常量;
p是一個指針變量,它指向包含5個int元素的一維數組,此時p的增量以它所指向的一維數組長度爲單位;
*p+i是二維數組a[0][ i ] 的地址;
*(p+2)+3表示a[2][3]地址(第一行爲0行,第一列爲0列),*(*(p+2)+3)表示a[2][3]的值。
//(*p)[5]其中的5換成其他的數字在vc++6.0環境中都無法通過編譯
(*p)[5]其中的5在上述例子中沒有表示任何意思你可以換成除0以外的整數,[5]的作用就是幫助你記憶說你所指向的一維數組的長度。(不過除了與定義的二維數組的長度一致的不會警告之外 )其他的數會警告但是不影響結果。
與指針數組的對比
數組指針是指向數組首元素的地址的指針,其本質爲指針(這個指針存放的是數組首地址的地址,相當於2級指
針,這個指針不可移動); 指針數組是數組元素爲指針的數組,其本質爲數組。
例如:*p[2]是指針數組,實質是一個數組,裏面的兩個元素都是指針 []的優先級比*的優先級高,p先與[]結合,形成數組p[2],有兩個元素的數組,再與*結合,表示此數組是指針類型的,每個數組元素相當於一個指針變量
注意:指針說起來很簡單,但是真正用起來很容易出錯,把指針用對了,可以達到事半功倍的效果,但是出錯了的後果也很嚴重,所以在使用它的時候需要謹慎又謹慎,細心再細心。