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

C 語言 static、extern 與指針函數深度解析

     編輯:更多程式設計知識

1. static 關鍵字三大用法

場景作用關鍵點
修飾局部變量延長生命周期至程序結束,存儲在靜態區僅初始化一次,下次調用保留上次值
修飾全局變量限制作用域為當前源文件(內部鏈接)避免多文件符號衝突
修飾函數限制作用域為當前源文件(內部函數)僅在定義文件可見,配合頭文件暴露公共 API

對比總結

  • static 局部變量:改變存儲方式(棧→靜態區),延長生存期
  • static 全局變量/函數:改變作用域(外部鏈接→內部鏈接),限制可見範圍

2. extern 關鍵字

  • 聲明外部符號(變量/函數)定義在別處
  • 擴展作用域:允許在定義前使用,或跨文件引用

// file1.c
int a = 10, b = 20;

// file2.c
extern int a, b; // 聲明
void foo() { printf("%d %d", a, b); }

3. 指針函數

定義:返回值為指針的函數。語法:返回類型 *函數名(參數列表)

經典案例:返回子串指針

char *SubString(char s[], int i, int j) {
    static char temp[100]; // 必須 static,否則棧內存函數返回後失效
    int m = 0;
    for (int n = i; n <= j; m++, n++) temp[m] = s[n];
    temp[m] = '\0';
    return temp;
}

// 調用
char *p = SubString("I Love C Language", 2, 9);
printf("%s\n", p); // 輸出 "Love C L"

陷阱警示

char *BadSubString(char s[], int i, int j) {
    char temp[100]; // 非 static!棧內存,返回指針懸空
    // ...
    return temp; // 未定義行為
}

口訣:「返回指針指向棟,函數結束棟毀;必須 static 守住地,或由調用者傳緩衝。」

4. 綜合示例:帶輸出緩衝區的子串函數

// 更安全:調用者提供緩衝區
void SubStringSafe(char s[], char outBuf[], int i, int j) {
    int m = 0;
    for (int n = i; n <= j; m++, n++) outBuf[m] = s[n];
    outBuf[m] = '\0';
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved