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

C 語言基礎進階:函數調用機制、參數傳遞方式與變數作用域詳解

     編輯:關於C語言

函數是 C 程序的基本組成單元。本文通過完整示例,系統講解函數定義、聲明、調用、參數傳遞(值傳遞/地址傳遞)、返回值、聲明與定義順序,以及局部/全局變數的作用域與生命週期。

1. 函數基本形式

// 無參無返回
void func1() { ... }

// 有參有返回
float average(float scores[], int n) {
    float sum = 0;
    for (int i=0; i

2. 完整示例:計算班級平均分

#include 

float average(float scores[], int n); // 函數聲明

int main() {
    float scores[20], avg;
    int n, i;
    printf("輸入班級人數: ");
    scanf("%d", &n);
    printf("輸入 %d 個分數:\n", n);
    for (i=0; i

程序運行截圖

3. 核心知識點

參數傳遞

方式機制示例影響
值傳遞形參獲得實參的副本int n → int m函數內修改形參不影響實參
地址傳遞形參獲得實參的地址float a[] → float b[]函數內修改數組元素影響原數組

本質上 C 只有值傳遞,「地址傳遞」是通過傳遞指針值(地址)實現的間接修改。

返回值

  • return 只能返回單個值。
  • 返回表達式類型與函數聲明類型不一致時,隱式轉換為聲明類型。
  • 若函數聲明類型為 int,返回類型可省略(舊標準),現代建議顯式聲明。

函數聲明

  • 遵循「先聲明/定義,後使用」原則。
  • 若定義在 main 之前,可省略聲明;否則必須聲明,否則編譯器假定返回 int 導致錯誤。

4. 變數作用域與生命週期

int m, n;                 // 全局變數:文件級作用域,程序啟動~結束

double fun(int x, int y) {
    int m, n;             // 局部變數:塊級作用域(函數體),遮蔽全局 m,n
    ...
}

int main() {
    int a, b;             // 局部變數:main 塊級作用域
    if (cond) {
        int x, y;         // 局部變數:if 塊級作用域,出 if 即銷毀
    }
}

規則總結

  1. 局部變數:僅在定義它的代碼塊內可見,塊結束自動銷毀(棧分配)。
  2. 全局變數:在整個文件(或經 extern 聲明後跨文件)可見,靜態存儲區,程序全生命週期存在。
  3. 同名遮蔽:局部變數與全局變數同名時,局部優先(就近原則)。

5. 避坑指南

  • 數組作為參數時退化為指針,sizeof(scores) 在函數內得到的是指針大小,而非數組大小 → 必須額外傳遞長度參數。
  • 不要返回局部變數的地址(懸垂指針)。
  • 全局變數盡量少用,改用參數傳遞或靜態局部變數,降低耦合。

掌握函數調用棧幀、參數壓棧、作用域鏈機制,是從「能寫代碼」進階到「寫出健壯代碼」的關鍵。

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