點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!!
主頁:
一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm=1011.2682.3001.5343感悟:
? ? ? ?今天我認為最重要的就是:vim編輯器的快捷指令(使用方法)
目錄
嵌入式開發:文件和目錄相關命令
1.命令pwd
作用
示例
補充說明
2.命令ls
3.命令查看文件內容:cat
4.復制命令:cp命令
5.文件移動命令:mv
6.創建和刪除文件命令:touch和rm
7.創建和刪除目錄命令:mkdir和rm -r
8.vi編輯器的使用(1)
8.1 三種模式:
8.2 插入模式中的常用命令
a/A
i/I
o/O
8.3 便捷命令
9. vim編輯器使用(2)
嵌入式開發基礎知識
編程基礎知識
計算機基本結構
馮諾依曼模型
存儲器的分類
什么是程序
程序的定義
程序從程序員角度看
程序在處理器中的執行過程
程序設計語言的發展
機器語言
匯編語言
高級語言
程序設計步驟
總結
知識小結
數據的表示
計算機數據表示
數值數據的表示
基數與各數位的權
二進制
十六進制
八進制
應用案例
例題:十進制轉二進制
原碼、反碼和補碼
非數值數據表示
ASCII 編碼
編碼分區
編碼細節
總結與思考
知識小結
程序的編譯和調試
gcc 編譯器
實例操作
實戰演練
程序調試
基礎調試宏
調試宏使用示例
實際應用價值
C 語言基礎
程序的基本組成
算法基礎概念
簡單算法實例
代碼實現演示
總結
課程要點回顧
擴展思考
知識小結
嵌入式開發:文件和目錄相關命令
1.命令pwd
pwd
是 Linux 和 Unix 類操作系統中一個非常基礎且常用的命令,它的全稱是 Print Working Directory(打印工作目錄)。
作用
pwd
命令的核心功能是 顯示當前終端會話中你所在的目錄路徑。簡單來說,當你在終端中操作時,通過執行 pwd
可以快速知道自己當前 “身處” 文件系統的哪個位置。
示例
假設你的終端當前處于用戶主目錄下的 Documents/project
文件夾中,輸入 pwd
后,終端會輸出該路徑:
/home/你的用戶名/Documents/project
補充說明
-
該命令沒有復雜的參數,最常用的就是直接輸入
pwd
并回車。 -
它常與
cd
(切換目錄)、ls
(列出目錄內容)等命令配合使用,幫助用戶在文件系統中定位和導航。 -
在某些特殊場景下,
pwd
可能會顯示不同的路徑(如處理符號鏈接時),但默認情況下,它展示的是當前所在目錄的絕對路徑(從根目錄/
開始的完整路徑)。
總之,pwd
是一個用于 “定位自身位置” 的便捷工具,對于終端操作來說是基礎中的基礎。
2.命令ls
常用的選項是:
ls -l (列舉權限出來) ? ls -a (將隱藏文件一起列舉出來) ? ls -R (列舉包含目錄文件的遞歸)
3.命令查看文件內容:cat
cat -s :合并多個空行變成一個空行顯示 cat -b :顯示行號 ? 《 = 》 等效于:nl 文件名
4.復制命令:cp命令
-
基本語法:
-
cp 源文件 目標路徑:保留原文件名復制
-
cp 源文件 新文件名:復制并重命名
-
-
關鍵選項:
-
-i:覆蓋前交互提示(安全防護)
-
-r:遞歸復制目錄及其內容
-
-
實用技巧:
-
支持同時復制多個文件到目錄:cp file1 file2 dir/
-
路徑表示:
-
相對路徑:../表示上級目錄
-
絕對路徑:/home/linux/完整路徑
-
-
5.文件移動命令:mv
-
雙重功能:
-
移動文件:mv 文件 新路徑
-
重命名:mv 舊文件名 新文件名
-
-
復合操作:
-
移動+重命名:mv test3.c ../test_three.c
-
-
批量操作:
-
支持同時移動多個文件
-
-
注意事項:
-
與復制命令不同,移動后原位置文件會消失
-
重命名本質是在同一目錄下的移動操作
-
6.創建和刪除文件命令:touch和rm
-
touch命令:
-
創建新文件:touch 新文件名(創建0字節文件)
-
更新時間戳:對已存在文件使用會更新修改時間
-
示例:touch a.c創建空C源文件
-
-
rm命令:
-
普通文件:rm 文件名
-
目錄:必須加-r參數遞歸刪除
安全選項:
-
-i:刪除前確認(建議常備)
-
-
危險操作:
-
不加-r刪除目錄會報錯
-
無提示刪除可能導致數據丟失
-
7.創建和刪除目錄命令:mkdir和rm -r
-
mkdir命令:
-
基本創建:mkdir 目錄名
-
級聯創建:mkdir -p dir1/dir2(自動創建父目錄)
-
-
刪除目錄:
-
必須使用rm -r 目錄名遞歸刪除
-
-
操作驗證:
-
可用ls -R查看目錄樹結構確認創建結果
-
8.vi編輯器的使用(1)
8.1 三種模式:
-
命令行模式: 用戶在用vi編輯文件時最初進入的模式,可以進行復制、粘貼等操作。
-
插入模式:按“i” 進行文件編輯,按ESC鍵可以回到命令行模式。
-
底行模式: 光標位于屏幕的底行,可以進行文查找、替換、列出行號等操作。
8.2 插入模式中的常用命令
在 Vim 編輯器中,a
和 i
是進入插入模式的常用命令,用于在文本中插入或添加內容。但它們的具體插入位置有所不同:
a
/A
-
a
:在當前光標所在位置之后進入插入模式,新輸入內容會接在光標后。比如光標在 “te|st” 的|
處(即 “t” 和 “e” 間 ),按a
后輸入 “x”,就變成 “texst”。 -
A
:直接跳到當前行的行尾,然后進入插入模式,輸入內容追加在行末尾。像行內容是 “hello |world”(|
為光標位置 ),按A
輸入 “!” ,就成 “hello world!” 。
i
/I
-
i
:在當前光標所在位置之前進入插入模式,新內容插在光標前。例如光標在 “t|est” 的|
處,按i
輸入 “x” ,變為 “txest” 。 -
I
:直接跳到當前行的行首,進入插入模式,輸入內容添加在行開頭。若行是 “|hello world”(|
為光標位置 ),按I
輸入 “hi” ,就成 “hi hello world” 。
o
/O
-
o
:在當前光標所在行的下方,新建一行空白行,光標跳到這新行的行首,進入插入模式,方便在下方新增內容。比如當前行是 “第一行”,按o
后,下方出現空白行,可直接輸入 “第二行內容” 。 -
O
:在當前光標所在行的上方,新建一行空白行,光標移到新行行首進入插入模式,用于在上方插入內容。如當前行是 “第二行”,按O
后,上方出現空白行,可輸入 “第一行內容” 。
8.3 便捷命令
-
[N]x
:刪除光標位置起的 N 個字符(默認 1 個),刪除內容會存入編輯緩沖區(可理解為 “剪切”,刪的內容能粘貼 )。 -
[N]dd
:刪除(剪切)光標所在行起的 N 行內容,存入編輯緩沖區。 -
[N]yy
:復制光標所在行起的 N 行內容到編輯緩沖區(“拷貝” 核心命令 )。 -
p
/P
:從緩沖區取內容粘貼;p
貼在光標后,P
貼在光標前。 -
u
:撤銷上一步操作(比如誤刪、誤改時,快速回退 )。
這些是 vi/vim 文本編輯里常用的復制、移動、粘貼、撤銷操作,掌握后能高效處理文本~
這是 vi 編輯器的保存和退出命令說明,各命令功能如下:
命令 | 功能解釋 |
---|---|
:q | 退出未修改的文件;若文件有修改未保存,執行會無效(防止誤關丟失內容) |
:q! | 強制退出,不保存任何修改內容(需謹慎用,避免丟數據) |
:w | 保存文件,但不退出 vi 編輯器(可繼續編輯) |
:x | 等價于 :wq ,保存文件并退出(文件有修改時保存,無修改時直接退出) |
:w File | 把當前內容另存為指定文件 File (原文件內容不變) |
:r File | 把指定文件 File 的內容讀入 / 插入到當前編輯文件的光標位置 |
這些是使用 vi/vim 時管理文件保存、退出的核心命令,日常編輯文本經常會用到~
9. vim編輯器使用(2)
快速定位:在命令模式中(使用以下內容)
-
行定位:
-
1G: 移動到文件第一行
-
G: 移動到文件最后一行
-
:n: 移動到第n行(如:10到第10行)
-
行號顯示:
-
:set nu: 顯示行號
-
:set nonu: 隱藏行號
-
-
-
vim中的查找:
基本查找:
-
查找字符串:
-
/string: 查找指定字符串(如/printf查找printf)
-
n: 向下繼續查找
-
N: 向上繼續查找
-
-
正則表達式支持:
-
/^string: 查找以string開頭的行
-
/string$: 查找以string結尾的行
-
-
-
Vim中的替換
基本語法: 冒號開頭表示底行命令,格式為:
范圍s/舊字符串/新字符串/標志
-
范圍省略: 當范圍省略時,默認對當前行進行操作
-
特殊符號:
-
.表示當前行
-
$表示最后一行
-
%表示全文范圍
-
-
-
當前行替換: :s/old/new 僅替換當前行第一個匹配項
-
指定行范圍:
-
:10,15s/old/new/g 替換10-15行所有匹配項
-
:.,$s/old/new 從當前行到最后一行替換
-
-
全文替換:
-
:1,$s/old/new/g 從第一行到最后一行替換
-
:%s/old/new/g 全文替換的簡寫形式
-
-
-
-
嵌入式開發基礎知識
編程基礎知識
-
學習目的:掌握計算機基礎知識有助于后續編程時的理解和應用
-
核心內容:包括計算機基本構成、程序語言發展過程和編程步驟等常識性知識
-
學習方法:已掌握者可復習鞏固,未掌握者需認真學習這些基礎概念
計算機基本結構
馮諾依曼模型
-
核心思想:包含硬件構成和存儲程序兩大核心概念
-
硬件組成:
-
CPU:包含運算器(執行實際運算)和控制器(取指令 / 數據)
-
存儲器:主要指內存(程序運行時的臨時數據存儲)
-
輸入設備:如鍵盤、手寫板、串口等
-
輸出設備:如顯示器、文件、數據庫等
-
-
工作方式:計算機通過順序執行存儲器中的程序指令來運行
-
應用范圍:該模型適用于各類計算設備(PC、手機、開發板等)
存儲器的分類
-
主存儲器(內存):
-
功能:存儲待處理數據和運算結果
-
特點:直接影響系統運行流暢度(如 Windows 需 5-6GB 空閑內存)
-
實例:內存條(2GB/4GB/8GB/16GB 等規格)
-
-
外存儲器:
-
功能:長期保存數據的大容量存儲
-
實例:硬盤、U 盤、SD 卡、Flash 等
-
-
寄存器:
-
位置:CPU 內部
-
特點:訪問速度最快的高速存儲器
-
功能:直接參與 CPU 運算過程
-
-
層級關系:
-
外存(硬盤 / Flash)→ 2. 內存 → 3. 寄存器
-
-
數據流向:程序文件從外存加載到內存,CPU 通過寄存器處理數據
-
硬件協作:包含 MMU(內存管理單元)進行地址映射
什么是程序
程序的定義
-
本質概念:廣義上指為實現特定目標而預先設計的一組可操作工作步驟
-
英文術語:英文稱為 "program",源自馮?諾依曼計算機體系結構思想
-
控制作用:計算機通過程序控制硬件組件(輸入 / 輸出設備、運算器、控制器、存儲器)協同工作
程序從程序員角度看
-
執行文件本質:系統可直接識別的有序二進制指令集合(如 Windows 的.exe,Linux 的可執行文件)
-
存儲與加載:程序平時存儲在磁盤,執行時加載到內存運行
-
與源代碼區別:程序員常說的 "C 程序" 指源代碼文件,與最終二進制執行程序存在編譯轉換過程
程序在處理器中的執行過程
-
硬件組成:包含 CPU 核心、執行單元、內存管理單元 (MMU)、總線接口等組件
-
地址轉換:程序使用虛擬地址,由 MMU 轉換為物理地址訪問實際內存
-
學習路徑:后續課程將通過變量、指針等知識點逐步深入講解內存管理機制
程序設計語言的發展
機器語言
-
編碼形式:直接使用二進制序列表示的機器指令(如 10010101 等)
-
歷史載體:早期采用紙帶打孔方式存儲程序(60-70 年代主流)
-
主要缺陷:
-
與自然語言差異極大,難以記憶和理解
-
開發維護工作量大、效率低下
-
完全依賴特定硬件,無法移植
-
匯編語言
-
改進原理:用符號表示機器指令(如 MOV 指令操作寄存器和內存)
-
相對優勢:比機器語言更接近自然語言,降低編程門檻
-
現存局限:
-
仍需熟悉硬件架構(如寄存器操作)
-
平臺依賴性極強(x86 與 ARM 匯編不兼容)
-
嵌入式開發中主要用于閱讀和局部修改
-
高級語言
-
核心特征:
-
脫離特定計算機系統(如 BASIC、FORTRAN、C/C++ 等)
-
單條語句對應多條機器指令
-
采用類自然語言關鍵字(if/else/for 等)
-
-
發展脈絡
:
-
面向過程(C 語言)→面向對象(C++/Java/C#)
-
-
現代趨勢:腳本語言(Python/Shell 等)進一步降低開發難度
-
嵌入式應用:
-
Linux 內核采用 C 語言編寫
-
智能硬件開發主要使用 C + 匯編的混合編程模式
-
-
行業影響:語言門檻降低推動 IT 行業快速發展,催生移動互聯網、人工智能等新技術浪潮
程序設計步驟
-
基本流程:編輯→編譯→鏈接→執行→調試的循環過程(SAASE 模型)
-
工具鏈:
-
編輯工具:VI 編輯器是核心工具,需要頻繁使用
-
編譯工具:使用 GCC 編譯器進行編譯
-
鏈接工具:通過 ld 命令完成鏈接
-
-
工作特點:
-
程序員日常工作就是不斷修改代碼、調試 bug 的循環
-
需要保持專注和耐心("踏踏實實,心無旁騖")
-
調試環節尤為重要,被稱為 "bug 終結者" 階段
-
-
注意事項:
-
VI 編輯器的重要性:在整個開發過程中需要頻繁使用
-
開發過程是迭代式的,需要反復修改和測試
-
總結
-
核心內容:
-
計算機基本結構(馮?諾依曼體系)
-
程序的定義與本質
-
存儲器的工作原理
-
程序設計語言發展歷程
-
程序設計完整步驟
-
-
課程特點:
-
基礎知識覆蓋面廣但較零散
-
為后續編程實踐奠定理論基礎
-
-
重要性:
-
這些基礎知識是理解編程本質的前提
-
缺乏這些知識會導致 "不理解每天在做什么"
-
-
后續預告:
-
將逐步增加實際編程訓練量
-
重點轉向編程、調試、執行等實踐環節
-
知識小結
知識點 | 核心內容 | 考試重點 / 易混淆點 | 難度系數 |
---|---|---|---|
計算機基本結構(馮諾依曼模型) | 計算機硬件構成:輸入 / 輸出設備、運算器、控制器、存儲器(內存 / 外存 / 寄存器);程序控制思想 | 存儲器層級關系(寄存器→內存→外存)與功能區分 | ?? |
程序定義與本質 | 程序為特定功能設計的操作步驟;實際指二進制可執行文件(如.exe) | 程序源代碼≠可執行文件(編譯鏈接過程) | ?? |
編程語言發展史 | 機器語言(0101)→匯編語言(符號化)→高級語言(面向過程 / 對象) | 匯編語言平臺依賴性(x86 vs ARM)與高級語言抽象層級 | ??? |
編程實踐步驟 | 編輯→編譯→調試循環;工具鏈(VI 編輯器 / GCC 編譯器 /ld 鏈接器) | 調試環節重要性(Bug 修復占開發主要時間) | ?? |
存儲系統層級 | CPU 寄存器→內存→外存(硬盤 / Flash);MMU 虛擬地址映射機制 |
數據的表示
計算機數據表示
-
數據分類:計算機處理的數據分為數值型數據(可算術運算,如數字 )和非數值型數據(不可算術運算,如字母、符號、音視頻等 )。
-
底層原理:所有數據最終都以 0 和 1 的組合形式被計算機處理,包括文字、符號等非數值數據。
數值數據的表示
基數與各數位的權
-
基數定義:某進制中允許使用的基本數碼個數。十進制基數為 10(數碼 0 - 9 ),八進制基數為 8(數碼 0 - 7 ) 。
-
位權計算:以基數為底,數字所在位置的序號為指數的整數次冪。例如十進制數中,從右往左數第 n 位(從 0 開始計數 )的位權是 (10^n) 。
二進制
-
數碼組成:僅包含 0 和 1 兩種數碼,逢 2 進位。
-
轉換示例:二進制轉十進制,如 (101_2 = 1×2^2 + 0×2^1 + 1×2^0 = 5_{10}) 。
-
計數規律:二進制數順序如 (0, 1, 10, 11, 100\cdots) ,對應十進制 (0, 1, 2, 3, 4\cdots) 。
十六進制
-
數碼組成:包含 0 - 9 和 A - F(A 對應 10 ,F 對應 15 )共 16 種數碼,逢 16 進位。
-
前綴標識:編程中常用
0x
前綴表示十六進制數(如0x1A
)。 -
轉換關系:1 個十六進制數碼對應 4 位二進制(如
0xF
對應1111
),轉換時可直接拆分替換。
八進制
-
數碼組成:包含 0 - 7 共 8 種數碼,逢 8 進位(如 7 的下一位是 10 )。
-
前綴標識:通常以數字
0
開頭表示(如012
表示八進制數 )。 -
轉換示例:八進制
12
,計算為 (1×8^1 + 2×8^0 = 10_{10}) (十進制 )。 -
二進制關系:1 個八進制數碼對應 3 位二進制(如
07
對應111
)。
應用案例
例題:十進制轉二進制
-
轉換方法:采用 “除 2 取余,逆序排列” 法。以十進制 25 為例:
25÷2 = 12 余 1 12÷2 = 6 余 0 6÷2 = 3 余 0 3÷2 = 1 余 1 1÷2 = 0 余 1
-
結果表示:將余數逆序排列得到
11001
。 -
驗證計算:(1×2^4 + 1×2^3 + 0×2^2 + 0×2^1 + 1×2^0 = 25) 。
-
通用規則:該方法同樣適用于十進制轉八進制、十六進制等其他進制轉換。
原碼、反碼和補碼
-
正數表示:
-
規則:正數的原碼、反碼、補碼完全相同。
-
示例:十進制 5 的三種表示均為
101
(8 位表示時為00000101
)。
-
-
負數表示(以 8 位二進制表示 -5 為例):
-
原碼:符號位 1 表示負,數值部分與正數相同,示例
10000101
(最高位 1 為符號位,后 7 位0000101
表示 5 )。 -
反碼:符號位不變,數值部分按位取反,示例
11111010
。 -
補碼:反碼加 1 ,示例
11111011
。
-
-
符號位規則:最高位為符號位,0 表示正數,1 表示負數。
-
計算步驟:
-
寫出絕對值的二進制表示(原碼)。
-
符號位置 1(負數)。
-
數值部分取反(反碼)。
-
最后加 1(補碼)。
-
-
存儲原理:計算機實際存儲和運算使用的是補碼形式。
非數值數據表示
ASCII 編碼
-
編碼標準:美國國家信息交換標準代碼 (ASCII) ,將字符轉換為二進制編碼形式。
-
編碼范圍:共 256 個字符(0 - 255 ),對應 1 字節存儲空間(8 位 )。
-
字符類型:包括文字、符號、圖像、語言和邏輯信息等非數值數據。
編碼分區
-
控制字符區(00H - 1FH):共 32 個字符,用于通訊或控制,部分字符不可顯示(如 NUL、SOH 等控制符 )。
-
可顯示字符區(20H - 7FH):共 96 個字符,包含阿拉伯數字、大小寫字母及常見符號,全部可在屏幕上顯示。
-
擴展字符區(80H - FFH):共 128 個字符,由 IBM 制定,包含框線、音標等非標準字符。
編碼細節
-
編碼格式:同時顯示八進制、十進制、十六進制和對應字符。
-
特殊字符:
-
0:NUL(空字符);7:BEL(響鈴);9:HT(水平制表);10:LF(換行);13:CR(回車) 。
-
-
字符轉換原理:每個字符對應唯一整數值(如
'A' = 65
),計算機實際處理的是該數值的二進制形式,轉換方法為查表獲取十進制值→轉換為二進制。 -
存儲特性:字符型 (char) 占 1 字節(8 位 ),無符號字符范圍:(0 - 255)(計算公式:最大值 (= 2^8 - 1 = 255) )。
-
'0' 與 0 的區別:字符
'0'
的 ASCII 值為 48(十進制),整數 0 的二進制表示為00000000
;計算機處理時,字符'0'
→ 48 →00110000
。
總結與思考
-
核心要點:掌握進制轉換方法;理解 ASCII 編碼原理;區分字符與數值的存儲方式。
-
延伸思考:字符數據通過查表對應整數值表示;字符
'0'
(ASCII 48 )與整數 0 本質不同;不同編碼標準(如 Unicode )的區別。
知識小結
知識點 | 核心內容 | 考試重點 / 易混淆點 | 難度系數 |
---|---|---|---|
編程語言學習規律 | 從數據表示與存儲入手 → 數據類型 / 變量 → 運算符 / 表達式 → 控制語句 → 函數 / 指針 → 面向對象(類) | 語言共性規律 vs 面向對象特性差異 | ?? |
計算機數據分類 | 數值型數據(可算術運算) vs 非數值型數據(字符 / 音視頻等) | 二進制存儲本質與人類十進制習慣差異 | ?? |
進制系統 | 二進制(基數為 2 )、八進制(基數為 8 )、十進制(基數為 10 )、十六進制(基數為 16 ) | 進制轉換方法(除基取余法)與權值計算 | ??? |
原碼 / 反碼 / 補碼 | 正數三碼相同;負數符號位固定(1 表示負),反碼取反,補碼 +1 | 補碼的計算機存儲優勢(統一加減法) | ???? |
ASCII 編碼表 | 字符與整數的映射標準(如字符 '0' = 48 ),覆蓋 0 - 255 無符號字符范圍 | 字符 '0' 與整數 0 的本質區別(ASCII 值 48 vs 數值 0 ) | ?? |
進制轉換實操 | 十進制 25 轉二進制:11001 (通過連續除 2 取余逆序) | 高位補零規則(如 8 位二進制表示) | ??? |
非數值數據存儲 | 文字 / 符號通過編碼標準(如 ASCII )轉為二進制處理 | 音視頻等復雜數據的非數值特性 |
程序的編譯和調試
gcc 編譯器
實例操作
-
基本功能:GCC(GNU Compiler)是 GNU 推出的多平臺編譯器,可將 C、C++ 源程序編譯連接成可執行文件。
-
支持文件類型:
-
.c
:C 語言源代碼 -
.h
:程序包含的頭文件 -
.i
:已預處理過的 C 源代碼文件 -
.S
:匯編語言源代碼文件 -
.o
:編譯后的目標文件
-
-
編譯語法:
-
基本格式:
gcc 源文件 -o 輸出文件名
,示例gcc hello.c -o hello
。 -
默認輸出:不指定
-o
時生成a.out
可執行文件。 -
常用選項:
-
-c
:只生成目標文件(.o
)而不鏈接 。 -
-g
:生成調試信息(用于gdb
調試) 。 -
-Wall
:顯示所有警告信息 。
-
-
-
執行方法:使用
./可執行文件名
運行程序,如./hello
。 -
文件管理:
mkdir
創建目錄;mv
移動文件;rm
刪除文件 。 -
調試技巧:修改源代碼后必須重新編譯才能生效;建議為每個可執行文件指定不同名稱,避免默認的
a.out
互相覆蓋 。
實戰演練
-
基礎編譯流程:
-
使用
vi
編寫源代碼(test.c
)。 -
編譯:
gcc test.c -o test -Wall
。 -
執行:
./test
。
-
-
常見錯誤處理:缺少頭文件(如
stdio.h
)會導致警告;語法錯誤會在編譯時顯示具體行號;建議始終使用-Wall
選項顯示所有警告 。 -
實戰案例
(計算 1 + 2 +... + 10 的程序):
-
源代碼:
-
#include <stdio.h> int main() {int sum = 0;for (int i = 1; i <= 10; i++) {sum += i;}printf("%d\n", sum);return 0; }
-
編譯執行:
gcc test.c -o test -Wall && ./test
。 -
預期輸出:
55
。 -
開發效率技巧:
Ctrl + Shift + N
打開新終端窗口;Ctrl + Shift + T
在當前窗口新建標簽頁;可在不同窗口同時編輯和編譯代碼 。
程序調試
基礎調試宏
-
預定義宏:
__FILE__
、__LINE__
、__FUNCTION__
是 C 語言頭文件中定義好的調試宏,可直接使用 。 -
宏功能
:
-
__FILE__
:顯示當前源文件名(如test.c
)。 -
__FUNCTION__
:顯示當前函數名(如main
函數或調用的其他函數 )。 -
__LINE__
:顯示當前代碼行號 。
-
-
應用場景:在代碼較長時,可用于日志記錄,幫助定位問題發生的具體位置(文件、函數、行號 )。
調試宏使用示例
-
語法要點:必須使用雙下劃線(
__
),不是單下劃線;宏名稱全部大寫;正確拼寫:__FUNCTION__
(注意包含字母C
) 。 -
常見錯誤:拼寫錯誤會導致
undeclared identifier
編譯錯誤;參數類型不匹配會觸發格式警告(如用%s
輸出整型變量 )。 -
調試過程:編譯器會明確指出錯誤位置和類型;需要檢查宏拼寫和參數對應關系;示例中
m
是整型變量,應與%d
格式符對應 。
實際應用價值
-
輸出示例:
test2.c, main, 9 m=55
表示文件test2.c
、函數main
、行號9
、變量值55
。 -
工程實踐:服務器程序中關鍵操作應記錄日志;通過調試宏可精確定位日志來源;避免日志過長成為流水賬,增加可讀性 。
-
調試建議:編譯錯誤是正常學習過程;應學會閱讀編譯器錯誤提示;小錯誤(如拼寫、格式)可能產生大量錯誤信息 。
C 語言基礎
程序的基本組成
-
數據描述:程序中需要明確指定數據的類型和組織形式(數據結構),包括線性結構(如數組、鏈表 )、樹形結構、圖狀結構和集合結構 。
-
操作描述:即算法,指完成操作的具體步驟,如對數據結構的增刪改查等操作流程 。
算法基礎概念
-
定義:為解決特定問題而采取的有序步驟集合,強調步驟的完整性和順序性 。
-
實例說明
(判斷閏年):
-
輸入年份
year
。 -
判斷
year
能否被4
整除 。 -
若能,繼續判斷能否被
100
整除 。 -
根據條件分支得出最終結論 。
-
-
編程思維培養:通過算法訓練可提升邏輯嚴謹性,培養冷靜分析問題的能力 。
簡單算法實例
-
階乘計算原始方法:
-
步驟分解:
-
S1)
計算1×2
-
S2)
結果×3
-
S3)
結果×4
-
...
-
S9)
結果×10
-
-
局限性:代碼冗長,無法處理大規模數據(如計算
100
的階乘 )。
-
-
循環優化算法:
-
變量設計:
p
為被乘數(初始值1
);i
為乘數(初始值2
) 。 -
算法流程:
-
p = 1
-
i = 2
-
p = p × i
-
i = i + 1
-
若
i ≤ 10
則返回步驟3
-
-
優勢:通過循環結構簡化代碼,可輕松擴展計算范圍(如改為
1×100
)。
-
代碼實現演示
-
關鍵代碼:
#include <stdio.h> int main() {int p = 1;for (int i = 2; i <= 10; i++) {p *= i;}printf("%d\n", p);return 0; }
-
調試技巧:建議復制
test2.c
為test3.c
進行修改測試,使用gcc
編譯時可通過-o
指定輸出文件名 。
總結
課程要點回顧
-
工具掌握:
gcc
編譯器基本使用方法;使用__FILE__
、__FUNCTION__
、__LINE__
等宏進行基礎調試 。 -
核心概念:數據結構與算法的關系;編程邏輯思維的建立方法 。
擴展思考
-
交叉編譯:在
x86
平臺開發ARM
程序時,只需將gcc
替換為arm - gcc
交叉編譯器,源代碼無需修改 。 -
學習建議:通過大量編程實踐(建議從
1
加到100
等基礎算法開始)快速提升編程能力,建立編程思維 。
知識小結
知識點 | 核心內容 | 考試重點 / 易混淆點 | 難度系數 |
---|---|---|---|
GCC 編譯器基礎介紹 | GCC 編譯器的基本語法(gcc 源文件 -o 可執行文件 )、默認生成 a.out 、警告選項 -Wall | -o 選項的位置靈活性(可置于中間或末尾) | ?? |
編譯流程與調試 | 從源代碼到可執行文件的完整流程(預處理→編譯→匯編→鏈接 ) | 未重新編譯導致執行舊版本(需強調修改后必須重新編譯) | ??? |
基礎調試技巧 | 使用宏 __FILE__ 、__FUNCTION__ 、__LINE__ 打印調試信息,輔助定位日志 | 宏拼寫易錯(雙下劃線、大小寫敏感) | ?? |
算法與數據結構 | 程序 = 數據結構 + 算法;示例:1 到 10 求和(直接累加 vs 循環優化 ) | 循環邏輯的抽象思維(變量累乘 / 累加的實現差異) | ???? |
交叉編譯概念 | 開發板(ARM)與 PC(x86)的代碼移植,需使用 arm - gcc 交叉編譯器 | 代碼無需修改,僅更換編譯器 | ??? |
編程思維訓練 | 強調邏輯嚴謹性(如閏年判斷的算法步驟)、調試耐心(錯誤量與代碼量無關 ) | 初學者常見誤區(逐行硬編碼 vs 抽象邏輯實現) | ???? |
擴展問題:
介紹一下gcc編譯的原理
除了gcc,還有哪些常用的C/C++編譯器?
如何在Windows系統中使用命令行工具查看ASCII碼表?