C語言基礎教程--從入門到精通

C語言基礎教程–從入門到精通(總體概括)

接下來會對每一個章節進行詳細的總結與整理,希望對大家有用!大家一起學習!

目錄

  • C語言基礎教程--從入門到精通(總體概括)
    • **`接下來會對每一個章節進行詳細的總結與整理,希望對大家有用!大家一起學習!`**
  • 第一章:C 語言概述與環境搭建
    • 1.1 C 語言簡介
    • 1.2 開發環境搭建
    • 1.3 第一個 C 程序
  • 第二章:基本語法與數據類型
    • 2.1 變量與常量`int age = 25; // 整型變量
    • 2.2 基本數據類型
    • 2.3 輸入輸出
  • 第三章:運算符與表達式
    • 3.1 算術運算符
    • 3.2 關系運算符
    • 3.3 邏輯運算符
  • 第四章:控制結構
    • 4.1 條件語句
    • 4.2 循環結構
  • 第五章:函數
    • 5.1 函數定義與調用
    • 5.2 遞歸函數
  • 第六章:數組與字符串
    • 6.1 一維數組
    • 6.2 多維數組
    • 6.3 字符串處理
  • 第七章:指針
    • 7.1 指針基礎
    • 7.2 指針與數組
    • 7.3 指針與函數
  • 第八章:結構體與聯合體
    • 8.1 結構體定義與使用
    • 8.2 聯合體
  • 第九章:文件操作
    • 9.1 文件讀寫基礎
    • 9.2 二進制文件操作
  • 第十章:動態內存管理
    • 10.1 malloc 和 free
    • 10.2 calloc 和 realloc
  • 第十一章:高級主題
    • 11.1 函數指針
    • 11.2 多文件編程
  • 第十二章:最佳實踐與調試
    • 12.1 代碼規范
    • 12.2 調試技巧
    • 12.3 常見錯誤

第一章:C 語言概述與環境搭建

1.1 C 語言簡介

C 語言由 Dennis Ritchie 于 1972 年在貝爾實驗室開發,是一種高效靈活的通用編程語言。它結合了低級語言的高效性和高級語言的可讀性,被稱為"系統編程語言"的基石。

主要特點:

1.結構化編程
2.內存直接訪問
3.高效執行速度
4.豐富的運算符
5.可移植性強

1.2 開發環境搭建

Windows 環境:

1.安裝 MinGW(GCC for Windows)
2.安裝代碼編輯器(VS Code、Dev-C++)
3.配置環境變量

Linux/macOS 環境:

# 安裝 GCC
sudo apt-get install gcc   # Ubuntu/Debian
brew install gcc           # macOS# 驗證安裝
gcc --version

1.3 第一個 C 程序

#include <stdio.h>  // 標準輸入輸出頭文件int main() {         // 程序入口函數printf("Hello, World!\n");  // 輸出語句return 0;        // 程序正常結束
}

編譯與運行:

gcc hello.c -o hello  # 編譯
./hello               # 運行 (Linux/macOS)
hello.exe             # 運行 (Windows)

第二章:基本語法與數據類型

2.1 變量與常量`int age = 25; // 整型變量

float salary = 8500.50; // 浮點型變量
const double PI = 3.14159; // 常量
char grade = ‘A’; // 字符變量`

2.2 基本數據類型

類型大小 (字節)范圍格式說明符
char1-128 到 127%c
int4-2^31 到 2^31-1%d
float43.4E-38 到 3.4E+38%f
double81.7E-308 到 1.7E+308%lf
void無值

2.3 輸入輸出

#include <stdio.h>int main() {int num;printf("請輸入一個整數: ");scanf("%d", &num);  // 讀取輸入printf("你輸入的是: %d\n", num);printf("浮點數: %.2f\n", 3.14159); // 保留兩位小數return 0;
}

第三章:運算符與表達式

3.1 算術運算符

int a = 10, b = 3;
int sum = a + b;      // 13
int diff = a - b;     // 7
int product = a * b;  // 30
int quotient = a / b; // 3 (整數除法)
int remainder = a % b; // 1

3.2 關系運算符

int x = 5, y = 10;
printf("%d\n", x == y); // 0 (false)
printf("%d\n", x != y); // 1 (true)
printf("%d\n", x > y);  // 0
printf("%d\n", x < y);  // 1

3.3 邏輯運算符

int age = 25;
int hasLicense = 1; // trueif (age >= 18 && hasLicense) {printf("可以開車\n");
}if (age < 18 || !hasLicense) {printf("不能開車\n");
}

第四章:控制結構

4.1 條件語句

// if-else
int score = 85;
if (score >= 90) {printf("優秀\n");
} else if (score >= 60) {printf("及格\n");
} else {printf("不及格\n");
}// switch-case
char grade = 'B';
switch(grade) {case 'A': printf("優秀\n");break;case 'B': printf("良好\n");break;default:printf("其他\n");
}

4.2 循環結構

// for 循環
for(int i = 0; i < 5; i++) {printf("%d ", i); // 0 1 2 3 4
}// while 循環
int count = 5;
while(count > 0) {printf("%d ", count--); // 5 4 3 2 1
}// do-while 循環
int num;
do {printf("請輸入正數: ");scanf("%d", &num);
} while(num <= 0);

第五章:函數

5.1 函數定義與調用

#include <stdio.h>// 函數聲明
int add(int a, int b);int main() {int result = add(5, 3);printf("5 + 3 = %d\n", result);return 0;
}// 函數定義
int add(int a, int b) {return a + b;
}

5.2 遞歸函數

// 計算階乘
int factorial(int n) {if (n == 0 || n == 1)return 1;elsereturn n * factorial(n - 1);
}int main() {printf("5! = %d\n", factorial(5)); // 120return 0;
}

第六章:數組與字符串

6.1 一維數組

// 聲明與初始化
int numbers[5] = {1, 2, 3, 4, 5};// 訪問元素
printf("第一個元素: %d\n", numbers[0]); // 1// 遍歷數組
for(int i = 0; i < 5; i++) {printf("%d ", numbers[i]);
}

6.2 多維數組

// 二維數組(矩陣)
int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
};// 訪問元素
printf("第二行第一列: %d\n", matrix[1][0]); // 4

6.3 字符串處理

注意:這段代碼在運行時可能會報錯,主要原因是緩沖區溢出問題。

#include <string.h>char str1[20] = "Hello";
char str2[] = "World";// 字符串連接
strcat(str1, " ");
strcat(str1, str2); // "Hello World"// 字符串長度
int len = strlen(str1); // 11// 字符串比較
if(strcmp(str1, "Hello World") == 0) {printf("字符串相等\n");
}

錯誤原因分析:

1.內存計算錯誤:

初始str1內容:“Hello”(5字符) + ‘\0’ = 6字節
添加空格后:"Hello "(6字符) + ‘\0’ = 7字節
添加"World"后:“Hello World”(11字符) + ‘\0’ = 12字節
雖然12 < 20,但問題出在strcat的工作機制

2.strcat函數的工作方式:

strcat會從目標字符串的結束符’\0’處開始追加新內容
第一次strcat(str1, " “)后:str1變為"Hello \0”
第二次strcat(str1, str2)時:
從’ ‘后的’\0’開始覆蓋
追加"World"(5字符)和結束符’\0’
最終得到"Hello World\0"(12字節)

緩沖區溢出風險:

雖然本例最終長度12 < 20,但如果初始數組更小(如char str1[12]),會溢出
實際開發中這種寫法有隱患

解決方案
方法1:確保足夠緩沖區 + 安全初始化

#include <stdio.h>
#include <string.h>int main() {// 增大緩沖區并初始化為全零char str1[20] = {0};char str2[] = "World";// 安全拷貝初始值strcpy(str1, "Hello");strcat(str1, " ");strcat(str1, str2);printf("連接結果: %s\n", str1); // Hello Worldprintf("長度: %zu\n", strlen(str1)); // 11if(strcmp(str1, "Hello World") == 0) {printf("字符串相等\n");}return 0;
}

方法2:使用更安全的 snprintf (推薦)

#include <stdio.h>
#include <string.h>int main() {char str1[20];const char* str2 = "World";// 安全格式化拼接snprintf(str1, sizeof(str1), "%s %s", "Hello", str2);printf("結果: %s\n", str1);return 0;
}

方法3:手動控制拼接過程

#include <stdio.h>
#include <string.h>int main() {char str1[20] = "Hello";char str2[] = "World";// 計算剩余空間size_t remain = sizeof(str1) - strlen(str1) - 1; // 安全追加strncat(str1, " ", remain);remain -= 1;  // 更新剩余空間strncat(str1, str2, remain);printf("%s\n", str1);return 0;
}

為什么原始代碼可能崩潰:

如果編譯器在內存中布局時,str1后面緊跟著受保護的內存區域,即使12<20,連續兩次strcat操作可能觸發內存保護機制(如Stack Canary)。使用安全函數可避免這類問題。

第七章:指針

7.1 指針基礎

int num = 10;
int *ptr = &num; // ptr指向num的地址printf("num的值: %d\n", num);     // 10
printf("num的地址: %p\n", &num);  // 內存地址
printf("ptr的值: %p\n", ptr);     // 與&num相同
printf("ptr指向的值: %d\n", *ptr); // 10

7.2 指針與數組

int arr[3] = {10, 20, 30};
int *ptr = arr; // 指向數組首元素printf("第一個元素: %d\n", *ptr);      // 10
printf("第二個元素: %d\n", *(ptr+1));  // 20

7.3 指針與函數

// 通過指針交換兩個變量的值
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int x = 5, y = 10;swap(&x, &y);printf("x=%d, y=%d", x, y); // x=10, y=5return 0;
}

第八章:結構體與聯合體

8.1 結構體定義與使用

// 定義結構體
struct Student {char name[50];int age;float gpa;
};int main() {// 聲明結構體變量struct Student stu1;// 訪問成員strcpy(stu1.name, "張三");stu1.age = 20;stu1.gpa = 3.8;// 結構體指針struct Student *ptr = &stu1;printf("姓名: %s\n", ptr->name); // 張三return 0;
}

8.2 聯合體

union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("整數: %d\n", data.i);data.f = 3.14;printf("浮點數: %.2f\n", data.f); // 覆蓋之前的值return 0;
}

第九章:文件操作

9.1 文件讀寫基礎

#include <stdio.h>int main() {FILE *file;// 寫入文件file = fopen("test.txt", "w");if(file != NULL) {fprintf(file, "Hello, File!\n");fclose(file);}// 讀取文件char buffer[100];file = fopen("test.txt", "r");if(file != NULL) {while(fgets(buffer, 100, file) != NULL) {printf("%s", buffer);}fclose(file);}return 0;
}

9.2 二進制文件操作

struct Product {int id;char name[50];float price;
};int main() {// 寫入二進制數據struct Product p1 = {1, "Laptop", 999.99};FILE *file = fopen("products.dat", "wb");fwrite(&p1, sizeof(struct Product), 1, file);fclose(file);// 讀取二進制數據struct Product p2;file = fopen("products.dat", "rb");fread(&p2, sizeof(struct Product), 1, file);printf("產品: %s, 價格: %.2f\n", p2.name, p2.price);fclose(file);return 0;
}

第十章:動態內存管理

10.1 malloc 和 free

#include <stdlib.h>int main() {// 分配內存int *arr = (int*)malloc(5 * sizeof(int));if(arr == NULL) {printf("內存分配失敗\n");return 1;}// 使用內存for(int i = 0; i < 5; i++) {arr[i] = i * 10;}// 釋放內存free(arr);return 0;
}

10.2 calloc 和 realloc

int main() {// 分配并初始化內存int *arr = (int*)calloc(5, sizeof(int));// 重新分配內存arr = (int*)realloc(arr, 10 * sizeof(int));// 使用更大的數組for(int i = 5; i < 10; i++) {arr[i] = i * 10;}// 釋放內存free(arr);return 0;
}

第十一章:高級主題

11.1 函數指針

#include <stdio.h>// 加法函數
int add(int a, int b) {return a + b;
}// 減法函數
int subtract(int a, int b) {return a - b;
}int main() {// 聲明函數指針int (*operation)(int, int);// 指向加法函數operation = add;printf("5 + 3 = %d\n", operation(5, 3));// 指向減法函數operation = subtract;printf("5 - 3 = %d\n", operation(5, 3));return 0;
}

11.2 多文件編程

main.c:

#include <stdio.h>
#include "math_operations.h"int main() {printf("5 + 3 = %d\n", add(5, 3));printf("5 - 3 = %d\n", subtract(5, 3));return 0;
}

math_operations.h:

#ifndef MATH_OPERATIONS_H
#define MATH_OPERATIONS_Hint add(int a, int b);
int subtract(int a, int b);#endif

math_operations.c:

#include "math_operations.h"int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}

編譯命令:

gcc main.c math_operations.c -o program

第十二章:最佳實踐與調試

12.1 代碼規范

1.使用有意義的變量名
2.添加必要的注釋
3.保持函數簡潔(不超過50行)
4.使用適當的縮進(推薦4空格)
5.避免使用全局變量

12.2 調試技巧

1.使用printf調試
2.編譯器警告選項:

gcc -Wall -Wextra -pedantic program.c -o program

3.使用GDB調試器:

gcc -g program.c -o program
gdb ./program

12.3 常見錯誤

// 1. 數組越界
int arr[5] = {1,2,3,4,5};
printf("%d", arr[5]); // 無效訪問// 2. 未初始化指針
int *ptr;
printf("%d", *ptr); // 未定義行為// 3. 內存泄漏
int *data = malloc(100 * sizeof(int));
// 忘記 free(data)// 4. 懸空指針
int *ptr = malloc(sizeof(int));
free(ptr);
printf("%d", *ptr); // 訪問已釋放內存

結語:C 語言學習路徑

基礎階段:掌握語法、數據類型、控制結構
進階階段:深入指針、內存管理、文件操作
高級階段:學習數據結構、算法、系統編程
精通階段:研究操作系統內核、編譯器開發

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914238.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單細胞分析教程 | (二)標準化、特征選擇、降為、聚類及可視化

在完成質控&#xff08;QC&#xff09;后&#xff0c;我們已經過濾掉了低質量細胞、雙細胞和低表達基因&#xff0c;獲得了較為干凈的單細胞數據集單細胞分析教程 | &#xff08;一&#xff09;Python單細胞質控全流程。接下來&#xff0c;我們將進行以下關鍵步驟&#xff1a; …

大模型 Agent(智能體)技術簡介

大模型 Agent&#xff08;智能體&#xff09;技術 是當前人工智能領域的前沿方向&#xff0c;它賦予大型語言模型&#xff08;LLM&#xff09;自主感知、規劃、決策和行動的能力&#xff0c;使其不再局限于“被動應答”&#xff0c;而是能主動完成復雜任務。簡單來說&#xff0…

OneCode 3.0架構深度剖析:工程化模塊管理與自治UI系統的設計與實現

引言 OneCode 3.0作為新一代低代碼開發平臺&#xff0c;其架構設計圍繞"工程模塊化"與"UI自主化"兩大核心目標展開。本文將從底層接口到上層應用&#xff0c;全面解析OneCode 3.0的技術架構&#xff0c;包括核心工廠類、工程管理接口、數據倉庫設計以及動態…

功耗校準數據PowerProfile測試方法建議

場景步驟版本:xxxxA1A2結果&#xff08;mA&#xff09;screen,full1.打開飛行模式&#xff0c;滅屏時間最長&#xff0c;其他的基礎功能關2.進入到日歷應用界面3.將亮度設置至最大&#xff08;4095&#xff09;&#xff0c;待電流穩定后&#xff0c;測試5分鐘&#xff0c;記錄電…

[附源碼+數據庫+畢業論文]基于Spring+MyBatis+MySQL+Maven+vue實現的供電公司安全生產考試管理系統,推薦!

摘 要 使用舊方法對安全生產考試信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在安全生產考試信息的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。 這次開發的供電公…

輸入框過濾選項列表,el-checkbox-group單選

需求&#xff1a;根據輸入的文本動態過濾選項列表&#xff0c;并在下方顯示匹配到的選項。當用戶勾選匹配到的選項時&#xff0c;把該選項的值賦值給輸入框中綁定的值。當用戶取消選擇時&#xff0c;輸入框中的字段可以隨意編輯。組件&#xff1a;el-input、el-checkbox-group、…

身份認證缺陷

Authentication Bypasses審計創建AccountVerificationHelper實例&#xff0c;用于處理賬戶驗證邏輯parseSecQuestions函數的作用是從請求體中遍歷參數名&#xff0c;找到包含secQuestion的參數&#xff0c;將其值存入Map中并返回這里直接把AccountVerificationHelper整個分析一…

火山引擎:字節跳動的技術賦能初解

火山引擎是字節跳動旗下的企業級智能技術服務平臺&#xff0c;于2020年6月正式上線。它通過開放字節跳動在大數據、人工智能、視頻云等領域的核心技術&#xff0c;助力企業實現數字化轉型與業務增長。火山引擎界面核心能力與技術亮點:1.全棧云服務公有云與混合云&#xff1a;提…

VUE 帶有搜索功能的穿梭框(簡單demo)

一、template/ 組件代碼<el-dialog :title"title" :visible.sync"dialogVisible" width"60%" :before-close"handleClose" class"custom-dialog-line" ><div style"text-align: center ; width: 100%; height…

寫個掃雷小游戲

1.test.c&#xff08;測試源文件&#xff09;2.game.c&#xff08;游戲源文件&#xff09;3.頭文件

【Linux庖丁解牛】— system V共享內存!

1. 什么是system VSystem V IPC&#xff08;Interprocess Communication&#xff0c;進程間通信&#xff09;是Unix系統中一種經典的進程間通信機制&#xff0c;由AT&T在System V.2版本中引入&#xff0c;并廣泛應用于Linux等現代操作系統中。它通過三種核心機制實現進程間…

從輸入到路徑:AI賦能的地圖語義解析與可視化探索之旅(2025空間智能全景)

??摘要??在空間智能爆發的2025年&#xff0c;地圖系統已從靜態導航工具進化為??實時決策中樞??。本文深度解析AI如何重構地理信息處理全鏈路&#xff1a;通過??多模態語義理解??&#xff08;文本/語音/圖像→空間意圖&#xff09;、??動態路網建模??&#xff0…

安全運維新趨勢:AI 驅動的自動化威脅檢測

在數字化浪潮中&#xff0c;網絡攻擊正從 “單點突破” 進化為 “鏈狀打擊”&#xff1a;2024 年某金融機構遭遇供應鏈攻擊&#xff0c;惡意代碼通過運維通道潛伏 3 個月&#xff0c;傳統規則引擎因未識別 “正常運維指令中的異常參數”&#xff0c;導致數據泄露損失過億。這背…

數據庫復合索引設計:為什么等值查詢列應該放在范圍查詢列前面?

前言作為后端開發工程師&#xff0c;我們經常會遇到數據庫查詢性能問題。在一次系統優化中&#xff0c;我發現一個簡單的索引順序調整竟然讓查詢速度提升了10倍&#xff01;這讓我意識到復合索引列順序的重要性。今天&#xff0c;我就來分享一下這個經驗&#xff0c;希望能幫助…

【PMP備考】每日一練 - 2

1、一個建筑項目的項目經理發現&#xff0c;他管理的項目所在地附近正在新建一條新的水管線。公司政策要求&#xff0c;在他的團隊繼續完成這個項目之前&#xff0c;必須先填寫一系列有關城市環境變化的表格。這是那兩種情況的例子&#xff1f;&#xff08;選2個選項&#xff0…

【三】ObservableCollection 與 List 的區別

文章目錄前言一、核心概念簡介ObservableCollectionList二、關鍵差異對比三、典型使用場景ObservableCollection 的適用場景List 的適用場景四、在Community Toolkit MVVM中使用ObservableCollection<Data>和List<Data>場景1&#xff1a;動態列表&#xff08;Obser…

網安-SSRF-pikachu

目錄 SSRF:Server-Side Request Forgery PHP curl PHP 可能引起SSRF的函數 PHP其他函數 CURL其他協議 SSRF利用&#xff1a; SSRF的發現 工具 SSRF的防御 pikachu-SSRF 一&#xff1a;curl 1.訪問連接&#xff1a; 2.讀取本地文件 3.dict協議掃描主機端口 二&…

在Centos系統上如何有效刪除文件和目錄的指令匯總

CentOS系統是一款開源的類Unix操作系統&#xff0c;極其親和程序員和技術人員。這個系統最大的優勢就是其高度自由化的特性&#xff0c;世界各地的開發者可以依照實際需求去修改和運行。在這個操作系統中&#xff0c;如果你想刪除文件和目錄&#xff0c;你可以使用各式各樣的命…

Spring(四) 關于AOP的源碼解析與思考

Spring&#xff08;四&#xff09; 關于AOP的源碼解析與思考 每種語言都有其獨特的機制和特點&#xff0c;那么說到Java你可能會首先想到反射&#xff0c;反射是Java語言提供的一種能夠在程序運行時動態操作類或對象的能力&#xff0c;比如獲取某個對象的類定義、獲取類聲明的屬…

Android 15 Settings 搜索框:引入關鍵字過濾功能

在日常使用 Android 手機時,我們經常會用到“設置”應用中的搜索功能來快速定位所需選項。然而,有時搜索結果可能會包含一些我們不希望看到或者過于寬泛的條目。 本文將深入探討這一變化,通過分析 SearchResultsAdapter.java 文件中的代碼修改,揭示 Android 如何實現對特定…