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

C語言二維數組參數傳遞與scanf輸入解析

     編輯:C 語言問答

經典題目分析

代碼片段:


int x[3][2] = {0}, i;
for(i=0; i<3; i++) scanf("%d", x[i]);
printf("%3d%3d%3d\n", x[0][0], x[0][1], x[1][0]);
// 輸入 2 4 6 輸出為何?

記憶體佈局關鍵

二維數組在記憶體中按行主序連續存儲:

x[0][0]  x[0][1]  x[1][0]  x[1][1]  x[2][0]  x[2][1]
  0        1        2        3        4        5  ← 線性索引

x[i] 退化為指向第 i 行首元素的指針(類型 int*),等價於 &x[i][0]。

scanf 輸入過程追蹤


// 輸入: 2 4 6 (以空格/換行分隔)
i=0: scanf("%d", x[0]) → 讀入 2 存入 x[0][0]
i=1: scanf("%d", x[1]) → 讀入 4 存入 x[1][0]  (!!非 x[0][1])
i=2: scanf("%d", x[2]) → 讀入 6 存入 x[2][0]

結果:x[0][0]=2, x[0][1]=0, x[1][0]=4, x[1][1]=0, x[2][0]=6, x[2][1]=0

printf 輸出


printf("%3d%3d%3d\n", x[0][0], x[0][1], x[1][0]);
// 輸出:   2  0  4

正確輸入整行數據


// 方法一:雙重循環
for(i=0; i<3; i++)
    for(j=0; j<2; j++)
        scanf("%d", &x[i][j]);

// 方法二:指針遍歷
for(i=0; i<3; i++)
    for(j=0; j<2; j++)
        scanf("%d", (*(x+i))+j);  // 或 &x[i][j]

核心教訓

  • scanf("%d", x[i]) 只讀取一個整數到行首,非整行
  • 二維數組名 x 是行指針,x+i 跳過 i 行
  • 輸入格式必須與 scanf 格式串匹配:%d 間用空白分隔,非逗號
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved