C語言學習筆記 指標 指標陣列與陣列指標

2021-09-01 18:29:37 字數 1867 閱讀 8870

指標陣列:是乙個陣列,陣列元素為指標

陣列指標:是乙個指標,指向陣列的指標

例如:

int *p1[5];

int (*p2)[5];

對於語句int*p1[5],因為「」的優先順序要比*要高,所以 p1 先與「」結合,構成乙個陣列的定義,陣列名為 p1,而「int*」修飾的是陣列的內容,即陣列的每個元素。也就是說,該陣列包含 5 個指向 int 型別資料的指標,如圖 1 所示,因此,它是乙個指標陣列。

對於語句int(*p2)[5],「()」的優先順序比「」高,*號和 p2 構成乙個指標的定義,指標變數名為 p2,而 int 修飾的是陣列的內容,即陣列的每個元素。也就是說,p2 是乙個指標,它指向乙個包含 5 個 int 型別資料的陣列,如圖 2 所示。很顯然,它是乙個陣列指標,陣列在這裡並沒有名字,是個匿名陣列。

雖然有時指標陣列和二維陣列都可以解決同樣的問題,但指標陣列會更有效。

例如:

char str[n][m]=;

char *ptr[n]=;

(1)str[i]和ptr[i]都代表第i+1個字串的首位址,都是對第i+1個字串的合法引用,但str和ptr的含義完全不同。str是二維字元陣列的陣列名,在記憶體占用n*m位元組的連續儲存單元,字元陣列元素的初始值是初始化列表中提供的字串的字元。支著陣列ptr佔記憶體的位元組數為n*sizeof(指標型別)。指標陣列初始化列表中的字串是儲存在唯讀的常量儲存區中的,編譯時用存放這些字串的唯讀儲存區的首位址對指標陣列進行初始化,此時指標陣列的元素之(指標指向)是可以修改的,但其指向的儲存單元是唯讀的,所以不能修改器指向的儲存單元中的內容。

(2)二維陣列儲存多個字串時需按最長的字串長度來定義這個二維陣列的列數,所以不管每個字串的實際長度是否一致,它們在記憶體中都占用仙童長度的儲存單元。而指標陣列儲存每個字串的首位址時,各個字串在記憶體中不占用連續的儲存單元,占用儲存空間由字串的實際長度來決定,因此,使用字串指標陣列不會浪費記憶體空間。

(3)用二維陣列儲存多個字串時,由於需要移動字串的儲存位置,所以字串排序的速度很慢。這種通過移動字串在實際物理儲存空間中的存放位置而實現的排序,稱為物理排序。而用指標陣列儲存每個字串首位址時,字串排序不需要改變字串在記憶體中存放位置,只要改變指標陣列中各個元素的指向即可。這樣,移動指標的指向比移動字串要快的多,這種通過移動字串的索引位址而不是字串的實際儲存位置實現的排序,稱為索引排序。顯然索引排序,即指標陣列處理字串更高效。

索引拍訊程式如下:

#include#include#define n 5

int main()

; printf("before sorted:\n");

for (i = 0; i < n; i++)

for (i = 0; i < n; i++)

} }printf("after sorted:\n");

for (i = 0; i < n; i++)

return 0;

}

參考文獻:

C語言學習筆記 指標與陣列

在c語言中,陣列與指標的關係非常密切,陣列下標所能完成的任何運算都可以用指標來實現 一般而言,指標運算比陣列下標運算的速度快,但用指標實現的程式理解起來稍微有一些難度 一 指標與一維陣列 int a 10 定義了乙個大小為10的整型陣列a int pa a 0 將指標pa指向陣列a的第0個元素,即p...

C語言學習筆記 指標 指標與一維陣列

int a 10 int p null p a 其中,陣列名a代表陣列的首位址 即 a 0 那麼表示式a i代表陣列中下標為i元素a i 的位址,即 a i 還可以通過使用間接定址 來引用陣列元素。例如 a i 表示取出首位址元素後邊第i個元素的內容,即下標為i的元素a i 此外,還可以通過一維陣列...

C語言學習筆記 陣列指標域指標陣列

一 指標陣列和陣列指標的記憶體布局 初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔 4 個位元組,至於它指向的...