Third Week:LInux下的C語言
阿新 • • 發佈:2020-12-21
Linux下的C語言
1. 搭建C語言開發環境/執行環境
- 文字編輯
Linux下文字編輯器常用emacs和vim,由於本人常用vim,因此暫時只講述vim的用法,vim需要自行安裝。
#安裝命令
sudo apt-get update #將系統內所有資源更新為最新版本
sudo apt-get install vim
vim的使用是一門深奧的學問,將vim使用好是現階段的目標,讓我們一起來看一下吧!
#vim編輯器的使用
vim **.c #進入某個檔案
#進入後為命令模式,需要按英文輸入模式下的i進入插入模式,才能夠編輯文件
#如果想要退出編輯模式,按esc鍵回到命令模式,shift+:進入輸入命令模式,w表示儲存,q表示退出,通常情況下wq一起使用
#一些小快捷鍵
I 當前游標前
a 當前游標後面插入
shift + a / A 行位插入
shift +i / I 行首插入
o 下一行插入
shift + o / O 上一行插入
x 刪除游標所在位置的
dd 整行刪除
number + dd 剪切當前游標下面的number行,放到貼上板上
p 貼上
set nu 顯示行號
當我們想要編輯多個檔案的時候怎麼辦呢?— 多個原始檔分而治之
命令模式下:
sp 檔名.c
ctrl + w + 上箭頭 進入上面的程式碼塊
ctrl + w + 下箭頭 進入下面的程式碼塊
wqa 所有檔案都儲存並退出
- 編譯器
Linux下C語言編譯器常使用cc或者gcc,一般的Linux系統已經為我們安裝好了,可以通過命令進行檢視。#檢視cc和gcc版本資訊 cc -v gcc -v #編譯命令 cc / gcc **.c 引數:-c **.c -o ***.out 編譯後的檔名 #執行命令 ./***.out
- 標頭檔案和系統預裝檔案
<> 這樣檔案匯入,表示為系統預裝檔案
“” 這樣匯入的檔案表示是在當前路徑下的檔案
標頭檔案的作用:不會在修改的函式 公共框架/公共類 打包做成一個靜態庫,提前編譯好,因為編譯後就無法看到原始碼了,可以寫成標頭檔案,便於其他人使用
例如:max的標頭檔案max.h
int max(int a , int b);
- make 工具
make工具可以將大型的開發專案分成若干個模組,可以清晰和快捷的整理原始檔,內部使用gcc
#檢查make版本資訊
make -v
makefile 檔案 每次只需要修改該檔案即可
結構:
**註釋
最終需要的檔案:需要那些檔案
執行什麼命令
需要檔案1:原始檔
[tab/6空格]執行什麼檔案**
儲存並退出
**make命令執行該檔案**
eg:
# this is makefile
hello.out:max.o min.o hello.c
gcc max.o min.o hello.c
max.o:max.c
gcc -c max.c
min.o:min.c
gcc -c min.c
5. echo
gcc main.c -o main.out && ./main.out && 符號表示前面表示式返回0後面語句才能夠執行
echo $? 輸出0表示程式執行成功,其他表示失敗
2. 標準輸入流/輸出流/錯誤流
例子:
fprintf(stdout,"please input the value a:\n");
int a;
/*scanf("%d",&a);*/
fscanf(stdin,"%d",&a);
if(a<0){
fprintf(stderr,"the value must > 0\n");
return 1;
}
- 重定向機制
輸出流重定向到某個檔案,追加 不是覆蓋
覆蓋
< 輸入重定向
- 管道 | 將前部分輸出傳入到後半部分程式碼中
3.指標和記憶體以及GDB除錯工具的使用
- GDB 除錯工具的使用
注:gcc -g 編譯的才能夠進行除錯
gdb 檔名.out
start 開始除錯
l 列出原始碼
n 繼續執行
p 變數名 顯示變數值
bt 檢視函式堆疊
- 記憶體
32位的系統最大隻支援4g的記憶體,2^32 只有32條地址匯流排
64位的系統最大支援2^64的記憶體
系統記憶體分配示意圖
位元組順序是指佔記憶體多於一個位元組型別的資料在記憶體中的存放順序,通常有小端、大端兩種位元組順序。小端位元組序指低位元組資料存放在記憶體低地址處(由右向左),高位元組資料存放在記憶體高地址處;大端位元組序是高位元組資料存放在低地址處,低位元組資料存放在高地址處(由左向右)。
- 指標
int *p = &a;
# p 存放a的地址
# *p存放a值
- 函式指標:(*函式名)(引數的型別 引數)
int (*pquadrate) (int a) = &quadrate;
Array陣列其實是一種指標常量,而p則是一種指標變數(陣列和指標有一定的通用性,又有一定的差別,指標可以表達陣列,而陣列不可以表達指標);
p++:指標偏移,執行效率比陣列高;