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

C 語言核心概念:函數與陣列深度解析

     編輯:關於C語言

前言

C 語言以其模組化設計聞名,函數與陣列是構建程式架構的兩大基石。雖然無法像經典教科書那般面面俱到,但透過淺顯易懂的方式切入,對初學者建立正確觀念仍大有裨益。

函數:程式模組化的關鍵

幾乎所有 C 教材都專門開闢章節講解函數,可見其重要性。當初學者嘗試撰寫百行以上的程式時,往往會被數不清的變數與錯綜複雜的邏輯搞得暈頭轉向。此時,將大型程式拆解為多個獨立的功能模組(函數)便成了必然選擇。C 語言中的所有函數都是平行關係,彼此獨立定義,不允許巢狀定義,這種設計讓程式結構更清晰,不僅方便開發者維護,也利於團隊協作與程式碼閱讀。

函數的兩種分類視角

從使用者角度看

  • 標準庫函數:由系統提供,無需自行定義即可直接呼叫。不同編譯器提供的庫函數數量與功能略有差異,但核心函數大同小異。
  • 使用者自訂函數:針對特定需求自行編寫,解決專屬問題。

從形式參數角度看

  • 無參函數:呼叫時不傳遞資料。例如列印分隔線或固定訊息的函數。這類函數可選擇是否回傳值。
  • 有參函數:呼叫端與被呼叫端之間存在資料傳遞。主呼叫函數可將資料傳入,被呼叫函數運算後也能透過回傳值將結果送回。

形式參數與實際參數詳解

形式參數 是定義函數時括號內的變數名稱;實際參數 是呼叫函數時傳入的具體值(可為常數、變數或運算式)。兩者類型必須相容,且在被呼叫函數中必須明確宣告形式參數的型態。

#include <stdio.h>

int print_add(int x, int y); // 函數原型宣告

int main() {
    int a, b, c;
    scanf("%d%d", &a, &b);
    c = print_add(a, b); // a、b 為實際參數
    printf("the add is :%d", c);
    return 0;
}

int print_add(int x, int y) { // x、y 為形式參數
    int z = x + y;
    return z;
}

掌握參數傳遞機制,是撰寫可重用、可維護程式碼的基礎。

陣列:同質資料的集合管理

陣列是一組擁有相同名稱與資料型態的儲存單元。引用特定元素時,需指定陣列名稱與索引值(從 0 開始)。

陣列宣告與初始化

int c[3] = {1, 2, 3}; // 宣告同時初始化
for (int i = 0; i <= 2; i++)
    printf("%5d", c[i]);

電腦依據元素型態與個數配置記憶體。初始化值個數不得超過陣列大小。字元陣列常用於儲存字串。

善用 #define 定義符號常數

透過前置處理器指令 #define SIZE 3 定義符號常數,修改陣列大小只需更改一處,極大提升程式彈性與可維護性。注意:巨集定義不屬於 C 語言本身,結尾不加分號,慣例以大寫命名以區別於變數。

冒泡排序法實作

冒泡排序透過相鄰元素兩兩比較、交換,將較大(或較小)元素逐步「浮」至陣列末端。以下為完整範例:

#include <stdio.h>
#define SIZE 10

int main() {
    int a[SIZE] = {2,6,4,8,10,12,89,68,45,37};
    int i, pass, hold;

    printf("Data items in original order\n");
    for (i = 0; i <= SIZE-1; i++) printf("%4d", a[i]);

    for (pass = 1; pass <= SIZE-1; pass++)
        for (i = 0; i <= SIZE-2; i++)
            if (a[i] > a[i+1]) {
                hold = a[i];
                a[i] = a[i+1];
                a[i+1] = hold;
            }

    printf("\nData items in ascending order\n");
    for (i = 0; i <= SIZE-1; i++) printf("%4d", a[i]);
    printf("\n");
    return 0;
}

二維陣列與魔方陣應用

二維陣列擁有兩個下標:第一個代表列,第二個代表行,切勿顛倒。宣告時可初始化,若某列初始值不足,剩餘元素自動補零。編譯器需要知道第二個下標(行數)以計算記憶體位移,第一個下標可省略。

經典的魔方陣生成演算法(如下)展示了二維陣列的強大應用:

#define N 5
void setmagic(int [][N]);
void outmagic(int [][N]);

int main() {
    int s[N][N] = {0};
    setmagic(s);
    outmagic(s);
    return 0;
}

void setmagic(int s[][N]) {
    int i = 0, j = N / 2, k = 1;
    s[i][j] = k++;
    while (k <= N*N) {
        int tryi = i - 1, tryj = j - 1;
        if (tryi == -1) tryi += N;
        if (tryj == -1) tryj += N;
        if (s[tryi][tryj] != 0 || (tryi == -1 && tryj == -1))
            i = i + 1;
        else { i = tryi; j = tryj; }
        s[i][j] = k++;
    }
}

void outmagic(int s[][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) printf("%4d", s[i][j]);
        printf("\n");
    }
}

執行結果將輸出一個 5×5 的魔方陣,每行、每列、對角線總和皆相同。

總結與建議

函數與陣列是 C 語言程式設計的核心支柱。建議初學者配合經典教材(如譚浩強《C 語言程式設計》或 Deitel《C How to Program》)系統學習,並多動手實作。若有疑問歡迎來信交流:ck0243@sina.com。

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