首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言數組遍歷三大法:下標法、指針算術與指針變量完整實現

     編輯:關於C語言

題目要求

定義一個包含 10 個元素的整型數組,輸入 10 個整數,然後輸出所有元素。

三種訪問方式深度解析

方法一:下標法(最直觀)

#include <stdio.h>

int main(void) {
    int a[10];
    int i;

    printf("請輸入 10 個整數:\n");
    for (i = 0; i < 10; ++i) {
        scanf("%d", &a[i]);
    }

    printf("數組元素:");
    for (i = 0; i < 10; ++i) {
        printf("%2d ", a[i]);
    }
    printf("\n");
    return 0;
}

本質:a[i] 編譯器自動轉換為 *(a + i)。數組名 a 在表達式中退化為指向首元素的指針。

方法二:指針算術(數組名+偏移)

#include <stdio.h>

int main(void) {
    int a[10];
    int i;

    printf("請輸入 10 個整數:\n");
    for (i = 0; i < 10; ++i) {
        scanf("%d", &a[i]);
    }

    printf("數組元素:");
    for (i = 0; i < 10; ++i) {
        printf("%2d ", *(a + i));  // 等價於 a[i]
    }
    printf("\n");
    return 0;
}

關鍵點:a + i 的地址計算考慮類型大小,即 &a[0] + i * sizeof(int)。

方法三:指針變量遍歷(最靈活)

#include <stdio.h>

int main(void) {
    int a[10];
    int i;
    int *p;

    printf("請輸入 10 個整數:\n");
    for (i = 0; i < 10; ++i) {
        scanf("%d", &a[i]);
    }

    printf("數組元素:");
    for (p = a; p < a + 10; ++p) {  // 指針比較與遞增
        printf("%2d ", *p);
    }
    printf("\n");
    return 0;
}

優勢:指針可任意移動、支持指針運算、作為函數參數傳遞時保留地址運算能力。

核心概念總結

方面下標法指針算術指針變量
可讀性最高中等高
靈活性固定模式可計算任意偏移可前進/後退/跳躍
函數傳參退化為指針同左天然適配
邊界檢查編譯器不檢查同左同左
適用場景簡單遍歷隨機訪問、矩陣運算鏈表、動態內存、複雜遍歷

內存佈局圖解

a[0]  a[1]  a[2]  ...  a[9]
+----+----+----+-----+----+
| 12 | 45 | 78 | ... | 99 |
+----+----+----+-----+----+
^
a (首地址)

p = a          → *p = a[0]
p = a + 1      → *p = a[1]
...
p = a + 9      → *p = a[9]
p = a + 10     → 越界(僅用於循環終止判斷)

常見錯誤避坑

  • scanf("%d", a+i) 正確;scanf("%d", *(a+i)) 錯誤(傳值而非地址)
  • 指針越界訪問屬於未定義行為,嚴重時導致程序崩潰
  • 數組名 a 是常量指針,不能賦值(a = p 編譯錯誤)
  • sizeof(a) 在定義作用域內返回整個數組大小(40 字節),傳入函數後退化為指針大小(4/8 字節)

掌握三種遍歷方式並理解其底層等價性,是從 C 語言初學者進階的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved