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

C語言程序結構全景:語句分類、控制流、數組、函數、作用域、存儲類別、內部/外部函數

     編輯:C 語言入門

一、C 語句五大類

類別形式示例作用
控制語句if/switch/for/while/do-while/goto/break/continue/return`if(x>0) foo();`改變執行流程
函數調用語句函數調用 + `;``printf("hi");`執行子程序
表達式語句表達式 + `;``a = b + c;`計算/賦值/副作用
空語句`;``while(getchar()!='\n');`佔位/循環體為空
復合語句`{ 声明/語句列表 }`函數體、if 分支塊構建塊級作用域

二、控制結構核心模式

選擇結構

// 單分支
if (expr) stmt;

// 雙分支
if (expr) stmt1; else stmt2;

// 多重分支(級聯)
if (e1) s1; else if (e2) s2; else s3;

// 三元運算符(表達式級)
max = (a>b) ? a : b;

// switch-case(整型常量標籤)
switch (expr) {
    case 1: s1; break;
    case 2: s2; break;
    default: sd;
}

break 易漏導致貫穿;`default` 可選但建議保留。

循環結構

類型語法語義典型場景
for`for(init; cond; inc) body`先判斷,知次數遍歷數組、固定次數
while`while(cond) body`先判斷,可零次條件驅動、讀文件/EOF
do-while`do body while(cond);`後判斷,至少一次菜單交互、至少一次處理

嵌套循環:外層控制行/輪次,內層控制列/細節。`break` 只跳出當層,`goto` 或標誌變量可跳多層。

三、數組體系

一維數組

int a[10] = {1,2,3}; // 部分初始化,餘補 0
int b[] = {1,2,3,4,5}; // 自動推導長度 5
// 訪問:a[i] ≡ *(a+i)
// 遍歷:for(i=0;i<10;i++) 或 指針法 for(p=a;p

二維數組

int m[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 初始化可扁平:int m[3][4] = {1,2,...,12};
// 內存連續,行主序:m[i][j] 偏移 = (i*4+j)*sizeof(int)

字符數組與字符串

  • 初始化:`char s[] = "abc";` 含隱式 `\0`,長度 4。
  • 輸入:`scanf("%19s", buf);` 限寬防溢出;`fgets(buf, sizeof(buf), stdin);` 讀整行含 `\n`。
  • 輸出:`printf("%s", s);` 遇 `\0` 止。
  • 核心函數:`strlen/strcpy/strcat/strcmp`(需 ``)。

四、函數系統

定義四要素

返回類型 函數名(參數列表) {
    // 聲明部分
    // 語句部分
    return 值; // 無返回值用 void,可省略 return
}

參數傳遞:值拷貝(單向)

  • 形參 = 函數定義處變量;實參 = 調用處表達式。
  • 實參 → 形參:按值拷貝,形參修改不影響實參。
  • 需修改實參 → 傳地址(指針)。

聲明與定義分離

// 头文件 add.h
int add(int a, int b); // 聲明

// 源文件 add.c
int add(int a, int b) { return a+b; } // 定義

// main.c
#include "add.h"
int main() { printf("%d", add(1,2)); }

調用前必須見到聲明(隱式聲明 C99 廢除)。

遞歸與嵌套調用

  • 函數可相互調用、遞歸調用(需基線條件)。
  • 不可嵌套定義(GCC 擴展支持嵌套函數,非標準)。

五、作用域與存儲類別

四種存儲類別

關鍵字適用對象生命周期作用域鏈接性默認初值
auto局部變量塊執行期塊無不定值
register局部變量塊執行期塊無不定值
static局部/全局程序全期塊/文件無/內部0
extern全局變量/函數程序全期文件/跨文件外部0

關鍵區別

  • 局部 static:函數內靜態變量,保持值跨調用,僅可見於函數內。
  • 全局 static:文件級私有,外部不可見(內部鏈接)。
  • extern:聲明外部定義,跨文件共享(外部鏈接)。
  • register:建議寄存器存儲,現代編譯器自動優化,不可取地址 `&`。

內存五區對應

代碼區:函數機器碼
常量區:字面量 "abc"、const 全局
靜態/全局區:全局、static 變量
堆區:malloc/free/new/delete
棧區:auto/register 變量、函數幀、參數、返回地址

六、內部函數與外部函數

類型關鍵字可見範圍用途
內部函數`static`本文件(內部鏈接)隱藏實現細節,避免符號衝突
外部函數`extern` (默認)整個程序(外部鏈接)跨文件調用,庫 API
// a.c
static void helper(void) { ... } // 僅 a.c 可見
void api(void) { helper(); }      // 導出接口

// b.c
extern void api(void); // 聲明使用
// helper 不可見

七、綜合示例:多文件模塊化項目結構


// stack.h (接口)
#ifndef STACK_H
#define STACK_H
typedef struct Stack Stack;
Stack *stack_create(void);
void stack_push(Stack *, int);
int stack_pop(Stack *);
void stack_destroy(Stack *);
#endif

// stack.c (實現)
#include "stack.h"
#include 
struct Node { int val; struct Node *next; };
struct Stack { struct Node *top; };
// ... 實現細節隱藏,僅導出接口函數

// main.c (使用)
#include "stack.h"
#include 
int main() {
    Stack *s = stack_create();
    stack_push(s, 42);
    printf("%d\n", stack_pop(s));
    stack_destroy(s);
}

總結

C 程序 = 語句塊 + 函數 + 數據對象。掌握控制流、數組/指針/字符串、函數接口與實現分離、作用域鏈接存儲模型、內部/外部函數封裝,即掌握了 C 語言工程化構建的骨架。現代 C 開發:模塊化(.h/.c 分離)、靜態內部函數隱藏實現、const 正確性、錯誤碼/斷言防禦性編程。

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