C語言中指標陣列的初始化



一個指標是一個儲存另一個變數地址的變數。指標變數名必須以“*”符號作為字首。就像普通變數一樣,我們也可以宣告一個“指標陣列”,其中陣列的每個下標都儲存一個數組型別的地址。

如何在C語言中初始化指標陣列?

在宣告時,可以透過為指標變數賦值現有變數的地址來初始化它。以下程式碼片段顯示瞭如何初始化一個指標:

int x = 10;
int *y = &x;

預設情況下,所有變數(包括指標變數)都屬於“自動儲存類別”。這意味著指標變數將儲存一個不可預測的、垃圾的、隨機的記憶體地址,這可能導致未定義的行為和潛在的程式風險,例如分段錯誤。因此,如果我們在宣告時沒有特定的值要儲存,則應將其初始化為 NULL。

int *ptr = NULL;

“指標陣列”在每個元素中儲存地址。陣列的型別必須與目標變數的型別匹配。

使用 static 關鍵字初始化指標陣列

您還可以使用static關鍵字初始化指標陣列,以在每個下標中儲存“0”。

示例

#include <stdio.h>

int main(){

   static int *ptr[5];

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

輸出

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

ptr[0]= 0
ptr[1]= 0
ptr[2]= 0
ptr[3]= 0
ptr[4]= 0

初始化整數指標陣列

在這裡,我們宣告一個整數指標陣列,並存儲三個整數變數的地址。

示例

#include <stdio.h>

int main(){

   int a = 10, b = 20, c = 30;
   int *ptr[3] = {&a, &b, &c};

   for (int i = 0; i < 3; i++){
      printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
   }
   
   return 0;
} 

輸出

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

ptr[0]: address: 6422040 value: 10
ptr[1]: address: 6422036 value: 20
ptr[2]: address: 6422032 value: 30

透過直接地址初始化指標陣列

我們可以將普通陣列的每個元素的地址儲存在指標陣列的相應元素中。

示例

#include <stdio.h>

int main(){

   int arr[] = {10, 20, 30};
   int *ptr[3] = {&arr[0], &arr[1], &arr[2]};

   for (int i = 0; i < 3; i++){
      printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
   }
   
   return 0;
}

輸出

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

ptr[0]: address: 6422032 value: 10
ptr[1]: address: 6422036 value: 20
ptr[2]: address: 6422040 value: 30

使用基地址遍歷陣列

當我們獲得陣列的基地址(在本例中為“&arr[0]”)時,我們可以知道指標會根據資料型別的尺寸遞增,從而獲得其後續元素的地址。

因此,只需使用基地址(陣列名與第 0 個元素的地址相同),我們就可以遍歷陣列。

示例 1

看看下面的例子:

#include <stdio.h>

int main(){

   int arr[] = {10, 20, 30};
   int *ptr=arr;

   for (int i = 0; i < 3; i++){
      printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
   }
   
   return 0;
}

輸出

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

ptr[0]: address: 6422020 value: 10
ptr[1]: address: 6422024 value: 20
ptr[2]: address: 6422028 value: 30

示例 2:使用指標陣列遍歷二維陣列

在這個例子中,我們有一個二維陣列。每一行的第 0 個元素的地址都儲存在一個指標陣列中。遍歷時,指標陣列中每個元素儲存的地址(指向對應行的第 0 個元素)都會遞增,以獲取每一行中的值。

#include <stdio.h>

int main(){

   // 2d array
   int arr[3][4] = {
      {1, 2, 3, 4},
      {5, 6, 7, 8},
   };

   int ROWS = 2, COLS = 4;
   int i, j;

   // pointer
   int (*ptr)[4] = arr;

   // print the element of the array via pointer ptr
   for (i = 0; i < ROWS; i++) {
      for (j = 0; j < COLS; j++) {
         printf("%d ", *(ptr[i]+j));
      }
      printf("\n");
   }
   
   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

1 2 3 4 
5 6 7 8

示例 3

這裡我們實際上並不需要指標陣列,因為我們可以使用這個二維陣列的名稱作為它的基指標,並逐行逐列地遞增它來獲取給定二維陣列中的元素:

#include <stdio.h>

int main(){

   // 2d array
   int arr[3][4] = {
      {1, 2, 3, 4},
      {5, 6, 7, 8},
   };

   int ROWS = 2, COLS = 4;
   int i, j;

   // pointer
   int *ptr = arr;

   // print the element of the array via pointer ptr
   for (i = 0; i < ROWS; i++){
      for (j = 0; j < COLS; j++){
         printf("%d  ", *(ptr + i * COLS + j));
      }
      printf("\n");
   }
   
   return 0;
}

輸出

輸出與之前的程式碼類似:

1  2  3  4  
5  6  7  8

初始化字元指標陣列(字串)

在 C 程式設計中,字串是 char 資料型別的陣列。由於陣列的名稱也表示其第 0 個元素的地址,因此可以宣告一個字串為:

char arr[] = "Hello";

使用指標表示法,字串被賦值給 char 指標為:

char *arr = "Hello";

然後,我們可以宣告一個 char 指標陣列來儲存多個字串,如下所示:

char *arr[3] = {"string1", "string2", "string3", . . . };

示例

下面的例子有一個char 指標陣列,用於儲存計算機語言的名稱:

#include <stdio.h>

int main(){

   char *langs [10] = {
      "PYTHON", "JAVASCRIPT", "PHP",
      "NODE JS", "HTML", "KOTLIN", "C++",
      "REACT JS", "RUST", "VBSCRIPT"
   };

   for(int i = 0; i < 10; i++)
      printf("%s\n", langs[i]);

   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

PYTHON
JAVASCRIPT
PHP
NODE JS
HTML
KOTLIN
C++
REACT JS
RUST
VBSCRIPT

在這個程式中,“langs”是一個指向包含 10 個字串的陣列的指標。因此,如果“langs[0]”指向地址 5000,“langs + 1”將指向地址 5004,該地址儲存指向第二個字串的指標。

因此,我們也可以使用以下迴圈變體來列印字串陣列:

for (int i = 0; i < 10; i++){
   printf("%s\n", *(langs + i));
}

動態指標陣列的初始化

您可以使用malloc() 函式以動態方式宣告和初始化指標陣列。

示例

看看下面的例子:

#include <stdio.h>

int main(){

   int *arr = (int *)malloc (sizeof (int) * 5); 

   for(int i = 0; i < 5; i++){
      arr[i] = i;
   }
   for (int x = 0; x < 5; x++){
      printf("%d %d\n", x, arr[x]);
   }
   
   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

0 0
1 1
2 2
3 3
4 4

您甚至可以請求使用者輸入並將值賦給指標陣列中的元素:

for(i = 0; i < 5; i++){
   scanf("%d", &x);
   arr[i] = x;
}
廣告