
- 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語言 - 返回語句
- 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語言程式設計中,陣列和指標的概念非常重要,兩者之間也密切相關。本章將詳細解釋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語言中陣列和指標的概念密切相關。可以使用指標來提高程式的效率,因為指標直接處理記憶體地址。指標也可以用來處理多維陣列。