C語言中的數(shù)組指針和指針數(shù)組的概念和應(yīng)用
原創(chuàng)作者:三玹
轉(zhuǎn)載請保留相關(guān)信息
俗話說得好,C語言的指針是初學(xué)者的終點,也是高級Cer的起點。
在步入指針廣袤的海洋中,會碰到各類形形色色的指針。其中,數(shù)組指針和指針數(shù)組是是一開始容易混淆的兩個概念。
區(qū)分?jǐn)?shù)組指針和指針數(shù)組
雖然這兩個東西看著像是孿生兄弟一樣,但它們的概念和工作方式是截然不同的。尤其放在代碼中,有時候也分不清誰是誰。
int (*arr)[5];int *arr[5];
在編程語言中,每個符號都具備相應(yīng)的優(yōu)先級。就跟我們學(xué)數(shù)學(xué),先乘除后加減一個道理。
而在上面這兩個聲明中,() 和 [] 的優(yōu)先級算是最高的,解引用運算符 * 的優(yōu)先級就要次于二者。
由此代入到聲明,第一個式子中先是定義了一個指針 *arr,指針變量 arr 指向一個長度為 5 的匿名數(shù)組,數(shù)組中存儲的是 5 個 int 類型的數(shù)據(jù)。所以第一個聲明的是一個數(shù)組指針。
第二個聲明中,[] 的優(yōu)先級最高,因此變量名先和 [5] 進(jìn)行組成,構(gòu)成了一個長度為 5 的 arr 數(shù)組。
每個數(shù)組中的所有元素都必須要有統(tǒng)一的類型,而此時的類型就是 int* 整型指針類型。即說明當(dāng)前的 arr 數(shù)組中可以存儲 5 個整數(shù)指針類型的值,所以第二個聲明的是一個指針數(shù)組。
這么說或許有點干,也有點繞,下面就將這兩個拆開看一看。
數(shù)組指針
數(shù)組指針,它首先是一個指針,是指向數(shù)組的指針類型。允許用指針的方式,來訪問數(shù)組中的元素。
來看個例子,現(xiàn)在我們初始化了一個整形數(shù)組arr,里面包含了 5 個元素:
int arr[5] = {1, 2, 3, 4, 5};而后,我們再聲明一個ptr的指針,用來指向這個數(shù)組。
int *ptr = arr;當(dāng)我們將數(shù)組變量賦值給指針變量,就是將數(shù)組的第一個元素 arr[0] 所在的內(nèi)存地址賦值給了指針 ptr。
因此,我們就可以直接使用這個指針來訪問數(shù)組中的元素。
printf("%d\n", *ptr); // 輸出 1ptr++; // 指向下一個元素printf("%d\n", *ptr); // 輸出 2
指針數(shù)組
指針數(shù)組則是不同于數(shù)組指針的另一個概念,它首先是一個數(shù)組,然后數(shù)組中的每個元素都是一個指針。
來看一個例子,假設(shè)我們有兩個字符串:
char *str1 = "Hello";char *str2 = "World";
此時,我們可以使用指針數(shù)組來存儲這兩個字符串:
char *str_arr[2] = {str1, str2};這樣一來,我們就可以使用下標(biāo)來訪問這個數(shù)組中的每個元素,例如:
printf("%s %s\n", str_arr[0], str_arr[1]); // Hello World需要注意的是,這里使用的是下標(biāo)來訪問數(shù)組中的元素,而不是用解引用運算符。
應(yīng)用場景
在C語言當(dāng)中,數(shù)組變量名本身就是一個指向數(shù)組第一個元素的指針。因此,我們就可以直接將數(shù)組傳遞給函數(shù)來訪問數(shù)組中的元素,例如:
void print_array(int *arr, int size) {for(int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}int main() {intarr[5] = {1, 2, 3, 4, 5};print_array(arr, 5); // 輸出 "1 2 3 4 5"return0;}
在這個函數(shù)中,我們使用了數(shù)組指針來訪問數(shù)組中的元素。
而指針數(shù)組,我們可以用來存儲動態(tài)分配的內(nèi)存,例如:
char *strings[MAX_STRINGS];int main() {for(int i = 0; i < MAX_STRINGS; i++) {strings[i] = malloc(100);}// 在這里使用 strings 數(shù)組for(int i = 0; i < MAX_STRINGS; i++) {free(strings[i]);}return 0;}
在上面的代碼中,我們使用了指針數(shù)組來存儲動態(tài)分配的內(nèi)存塊。我們在用完這些內(nèi)存后,需要使用 free 函數(shù)及時釋放。
總結(jié)
在C語言中,數(shù)組指針和指針數(shù)組是兩種很常見的概念。它們都是用來存儲和訪問數(shù)據(jù),但兩者的工作方式是不同的。
數(shù)組指針是指向數(shù)組的指針類型,可以用解引用運算符來訪問數(shù)組中的元素;
指針數(shù)組是存儲指針的數(shù)組,可以通過下標(biāo)來訪問指針數(shù)組中的元素。
它們分別都有自己相應(yīng)的應(yīng)用場景:
數(shù)組指針,常用于函數(shù)參數(shù)中,方便在函數(shù)中訪問數(shù)組中的元素;
指針數(shù)組,常用于動態(tài)分配內(nèi)存,在使用完之后要及時釋放內(nèi)存。
學(xué)習(xí)數(shù)組指針和指針數(shù)組的時候,最重要的是要熟悉它們的工作方式,以及明白它們在 C 語言當(dāng)中的應(yīng)用場景。
新上課程


