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

C 語言基礎教程(二):陣列變數完整指南——宣告、記憶體佈局、多維陣列與初始化

     編輯:C 語言基礎

陣列:同型別元素的連續集合

陣列名代表首元素位址 (常量指標),元素在記憶體中連續排列,下標從 0 開始。

一維陣列宣告與基本屬性


int a[10];              /* 10 個 int,索引 0~9 */
unsigned long b[20];    /* 20 個 unsigned long */
char *strs[5];          /* 5 個 char* 指標 */
char unknown[] = "Hi";  /* 省略長度,由初始化推斷 (含結束符共 3) */
  • sizeof(a) = 10 × sizeof(int) (如 20 bytes)。
  • a、&a[0]、&a 數值相同但型別不同:int*、int*、int(*)[10]。
  • 字串字面常數 "Hello" 編譯器自動附加 '\0',長度 = 可見字元數 + 1。

Turbo C 2.0 不做邊界檢查 — 危險示範


char s1[5], s2[6];
strcpy(s1, "ABCDEFG");  /* 複製 7 字元 + '\0' = 8 bytes */
/* 結果:s1 寫入 "ABCDE",'F' 溢寫進 s2[0],'G' 進 s2[1],'\0' 進 s2[2] */

教訓:永遠確保目的緩衝區足夠大,或使用 strncpy/snprintf 等有長度限制的函數。

多維陣列:行優先佈局


int m[3][2];        /* 3 列、2 行 (C 語法:[列][行]) */
char c[2][2][3];    /* 3 維:2×2×3 = 12 元素 */

記憶體線性順序 (最右維變化最快):


m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1]
c[0][0][0], c[0][0][1], c[0][0][2],
c[0][1][0], c[0][1][1], c[0][1][2],
c[1][0][0], c[1][0][1], c[1][0][2],
c[1][1][0], c[1][1][1], c[1][1][2]

多維陣列大小計算

總位元組數 = 維度1 × 維度2 × ... × 維度N × 元素型別大小


sizeof(m) = 3 * 2 * sizeof(int) = 12 bytes
sizeof(c) = 2 * 2 * 3 * sizeof(char) = 12 bytes

多維陣列初始化規則


/* 完整巢狀初始化 */
int p[2][3] = { {2, -9, 0}, {8, 2, -5} };

/* 扁平化初始化 (依記憶體順序) */
int x[2][3] = { 1, 2, 3, 4, 5, 6 };  /* 等同 {{1,2,3},{4,5,6}} */

/* 部分初始化:缺項自動補 0 */
int q[2][4] = { {27, -5}, {1} };
/* 結果:{{27,-5,0,0}, {1,0,0,0}} */

/* 指標陣列可省略第一維 */
char *f[] = { 'A', 'B', 'C' };  /* 自動推斷為 3 元素 */

不完整陣列宣告 (僅外部宣告合法)


extern int arr[];   /* 只宣告,定義在別處 */
extern int mat[][3]; /* 多維僅第一維可省略 */

常見錯誤與避坑指南

  1. 越界存取:C 無邊界檢查,必須自行確保索引合法。
  2. 字串緩衝區太小:char s[5]; strcpy(s, "Hello"); 需 6 bytes (含 \0)。
  3. 陣列名非左值:a = b;、a++ 皆非法,陣列名為常量指標。
  4. 函數參數退化:void f(int a[10]) 實為 void f(int *a),sizeof(a) 在函數內為指標大小。
  5. 變長陣列 (VLA, C99):int n; scanf("%d",&n); int vla[n]; 僅限區塊作用域,避免大尺寸導致堆疊溢位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved