指針數組

指針數組

指針數組,就是一個整數數組,那個數組的各個元素都是整數,指向某個內存地址。在C語言和C++語言中,數組元素全為指針的數組稱為指針數組。一維指針數組的定義形式為:“類型名*數組標識符[數組長度]”。例如,一個一維指針數組的定義:int*ptr_array。數組名出現在表達式中時,很多情況下會被隱式轉換為一個指針,指向數組的首個元素。注意這是聲明定長數組時,其數組名轉換成的數組首地址是常量。而聲明數組並使某個指針指向其值指向某個數組的地址(不一定是首地址),指針取值可以改變。

對比


與數組指針關係

數組指針是指向數組首元素的地址的指針,其本質為指針(這個指針存放的是數組首地址的地址,相當於2級指針,這個指針不可移動);指針數組是數組元素為指針的數組,其本質為數組。
例如:*p是指針數組,實質是一個數組,裡面的兩個元素都是指針 []的優先順序比*的優先順序高,p先與[]結合,形成數組p,有兩個元素的數組,再與*結合,表示此數組是指針類型的,每個數組元素相當於一個指針變數

與二維數組對比

二維數組:如char string_1隻要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字元。我們可以通過指定下標對其元素進行修改。
指針數組
指針數組
指針數組:如char *str_B 系統至少會分配5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字元型數據的一個指針。
如果我做這樣的定義:
char a={"gain","much","strong"};
char *n={"gain","much","strong"};
他們在內存的存儲方式分別如右圖所示,可見,系統給數組a分配了
3×8的空間,而給n分配的空間則取決於具體字元串的長度。
此外,系統分配給a的空間是連續的,而給n分配的空間則不一定連續。
由此可見,相比於比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是訪問指針數組中的一個元素是用指針間接進行的,效率比下標方式要高。但是二維字元數組卻可以通過下標很方便的修改某一元素的值,而指針數組卻無法這麼做。

舉例


指針數組:
int i;
char *pch = {"妹","妹","你","坐","船","頭"};
for(i=0;i<6;i++)
{
printf("%s, ",pch[i]);
}
printf("\n");
for(i=5; i>=0; i--)
{
printf("%s\n",pch[i]);
}