
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 可變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入與輸出
- C語言 - 檔案 I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 預處理程式
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
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; }