C語言中的指標和陣列



在C語言程式設計中,陣列和指標的概念非常重要,兩者之間也密切相關。本章將詳細解釋C語言中陣列和指標之間的關係。

C語言中的陣列

C語言中的陣列是同構元素的集合,這些元素都是單一資料型別,儲存在連續的記憶體塊中。陣列的大小是一個整數,放在方括號內,放在陣列名稱的前面。

宣告陣列

要宣告一個數組,使用以下語法

data_type arr_name[size];

陣列中的每個元素都由一個唯一的遞增索引標識,從“0”開始。陣列可以以不同的方式宣告和初始化。

可以先宣告一個數組,然後在程式碼中需要時再初始化它。例如

int arr[5];
... 
... 
a[0] = 1;
a[1] = 2;
... 
... 

也可以同時宣告和初始化陣列。要儲存的值以逗號分隔的列表形式放在花括號內。

int a[5] = {1, 2, 3, 4, 5};

注意:當在宣告時初始化陣列時,提及其大小是可選的,因為編譯器會自動計算大小。因此,以下語句也是有效的:

int a[] = {1, 2, 3, 4, 5};

示例:陣列的下界和上界

陣列中的所有元素都有一個位置索引,從“0”開始。陣列的下界始終為“0”,而上界為“大小 - 1”。可以使用此屬性使用迴圈遍歷、賦值或讀取陣列下標中的輸入。

請看下面的例子:

#include <stdio.h>

int main(){

   int a[5], i;
   
   for(i = 0; i <= 4; i++){
      scanf("%d", &a[i]);
   }

   for(i = 0; i <= 4; i++){
      printf("a[%d] = %d\n",i,  a[i]);
   }
   
   return 0;
}

輸出

執行程式碼並檢查其輸出:

a[0] = 712952649
a[1] = 32765
a[2] = 100
a[3] = 0
a[4] = 4096

C語言中的指標

指標是一個儲存另一個變數地址的變數。在C語言中,符號(&)用作取地址運算子。此運算子返回的值被賦值給一個指標。

要將變數宣告為指標,需要在名稱前加上星號 (*)。此外,指標變數的型別必須與它儲存的變數的型別相同。

在此程式碼片段中,“b”是一個整數指標,它儲存整數變數“a”的地址:

int a = 5;
int *b = &a;

對於陣列,可以將它的第0個元素的地址賦給指標。

int arr[] = {1, 2, 3, 4, 5};
int *b = &arr[0];

在C語言中,陣列的名稱本身解析為其第0個元素的地址。這意味著,在上述情況下,可以使用“arr”作為“&arr[0]”的等價物:

int *b = arr;

示例:使用指標的自增運算子

與普通的數值變數(其中自增運算子“++”將其值增加1)不同,用於指標的自增運算子會將其值增加其資料型別的sizeof大小。

因此,當int指標遞增時,會增加4。

#include <stdio.h>

int main(){

   int a = 5;
   int *b = &a;
   
   printf("Address of a: %d\n", b);
   b++;
   printf("After increment, Address of a: %d\n", b);
   
   return 0;
}

輸出

執行程式碼並檢查其輸出:

Address of a: 6422036
After increment, Address of a: 6422040

C語言中的解引用運算子

在C語言中,"*"符號用作解引用運算子。它返回指標指向的地址中儲存的值。

因此,以下語句返回“5”,這是變數“a”中儲存的值,變數“b”指向“a”

int a = 5;
int *b = &a;
printf("value of a: %d\n", *b);

注意:對於char指標,它將遞增1;對於double指標,它將遞增8;對於struct型別,它將遞增該struct型別的sizeof值。

示例:使用指標遍歷陣列

可以使用指標的此屬性使用指標遍歷陣列元素。

#include <stdio.h>

int main(){
    
   int arr[5] = {1, 2, 3, 4, 5};
   int *b = arr;

   printf("Address of a[0]: %d value at a[0] : %d\n",b, *b);
    
   b++;
   printf("Address of a[1]: %d value at a[1] : %d\n", b, *b);

   b++;
   printf("Address of a[2]: %d value at a[2] : %d\n", b, *b);

   b++;
   printf("Address of a[3]: %d value at a[3] : %d\n", b, *b);
    
   b++;
   printf("Address of a[4]: %d value at a[4] : %d\n", b, *b);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

address of a[0]: 6422016 value at a[0] : 1
address of a[1]: 6422020 value at a[1] : 2
address of a[2]: 6422024 value at a[2] : 3
address of a[3]: 6422028 value at a[3] : 4
address of a[4]: 6422032 value at a[4] : 5

需要注意的幾點

需要注意的是:

  • “&arr[0]” 等價於 “b”“arr[0]” 等價於 “*b”
  • 同樣,“&arr[1]” 等價於 “b + 1”“arr[1]” 等價於 “*(b + 1)”
  • 同樣,“&arr[2]” 等價於 “b + 2”“arr[2]” 等價於 “*(b + 2)”
  • 一般來說,“&arr[i]” 等價於 “b + i”“arr[i]” 等價於 “*(b + i)”

示例:使用解引用運算子遍歷陣列

可以使用此屬性和迴圈使用解引用運算子遍歷陣列。

#include <stdio.h>

int main(){

   int arr[5] = {1, 2, 3, 4, 5};
   int *b = arr;
   int i;

   for(i = 0; i <= 4; i++){
      printf("a[%d] = %d\n",i,  *(b+i));
   }
   
   return 0;
}

輸出

執行程式碼並檢查其輸出:

a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5

也可以在每次迭代中遞增指標並獲得相同的結果:

for(i = 0; i <= 4; i++){
   printf("a[%d] = %d\n", i, *b);
   b++;
}

C語言中陣列和指標的概念密切相關。可以使用指標來提高程式的效率,因為指標直接處理記憶體地址。指標也可以用來處理多維陣列。

廣告