指針數組與數組指針的區別

指針數組

C語言C++語言中,數組元素全爲指針的數組稱爲指針數組。

一維指針數組的定義形式爲:類型名 *數組標識符[數組長度]”

例如,一個一維指針數組的定義:int *ptr_array[10]

含義

指針數組中的每一個元素均爲指針,即有諸形如“*ptr_array[i]”的指針。

指針數組中的元素亦可以表示爲“*(*ptr_array+i))”。又因爲“()”的優先級較“*”高,且“*”是右結合的,因此可以寫作**ptr_array+i)。

由於數組元素均爲指針,因此ptr_array[i]是指第i+1個元素的指針。

運用

指針數組可以作爲函數的參量使用,使用方式與普通數組類似。

指針數組常適用於指向若干字符串,這樣使字符串處理更加靈活方便。

數組指針

數組名的指針,即數組首元素地址的指針。即是指向數組的指針。

例:int (*p)[10]; p即爲指向數組的指針,又稱數組指針。

 

數組指針與指針數組

數組指針是指向數組地址的指針,其本質爲指針;spacer.gif

指針數組是數組元素爲指針的數組(例如 int *p[3],定義了p[0],p[1],p[2]三個指針),其本質爲數組。

數組指針是指向數組首元素的地址的指針,其本質爲指針(這個指針存放的是數組首地址的地址,相當於2級指針,這個指針不可移動); 指針數組是數組元素爲指針的數組,其本質爲數組。

例如:*p[2]是指針數組,實質是一個數組,裏面的兩個元素都是指針, []的優先級比*的優先級高,p先與[]結合,形成數組p[2],有兩個元素的數組,再與*結合,表示此數組是指針類型的,每個數組元素相當於一個指針變量

 

數組指針的使用在某些情況下與指針數組很相似,要注意區別。

 

二維數組指針

爲了能更好地理解數組指針,與普通指針及二級指針的區別,下面舉例說明一下。

例如:

{

int a[4][5];

int (*p)[5]=a;

}

這裏a是個二維數組的數組名,相當於一個二級指針常量;

p是一個指針變量,它指向包含5int元素的一維數組,此時p的增量以它所指向的一維數組長度爲單位; 

*(p+i)是二維數組a[i][0]的地址;

*(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]的作用就是幫助你記憶說你所指向的一維數組的長度。(不過除了與定義的二維數組的長度一致的不會警告之外 )其他的數會警告但是不影響結果。

 

與二維數組對比 

二維數組:char string_1[10][10]只要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字符。我們可以通過指定下標對其元素進行修改。

指針數組:char *str_B[5] 系統至少會分配5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字符型數據的一個指針。

spacer.gif

如果我做這樣的定義:

char a[3][8]={"gain","much","strong"};

char *n[3]={"gain","much","strong"};

他們在內存的存儲方式

系統給數組a分配了3×8的空間,而給n分配的空間則取決於具體字符串的長度。

此外,系統分配給a的空間是連續的,而給n分配的空間則不一定連續。

由此可見,相比於比二維字符數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字符串不必限制在相同的字符長度;二是訪問指針數組中的一個元素是用指針間接進行的,效率比下標方式要高。 但是二維字符數組卻可以通過下標很方便的修改某一元素的值,而指針數組卻無法這麼做。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章