NO 2 常見的十個問題

2021-08-16 07:08:28 字數 4001 閱讀 6088

linux的常用工具

1.vim編輯器  vi(是老版本)  但是我們一般都是用vim 兩者的差別並不大

2.gcc工具鏈就是編譯器

3.make和makefile 

4.gdb除錯工具

5.shell使用基礎

注意一點我們平時用的linux一般是指核心,而linux發行版則是加了一些模組使其更具有針對性,常常運用於不同的方面,也就是它的側重點不同。

vim有三種模式:命令列模式(控制游標的移動,字元 字 行的刪除)

插入模式(輸入文字)

底行模式(儲存檔案,推出,設定vi)

我們通過命令  vim /etc/vimrc 開啟red hat....

通過命令 vim /etc/vim/vimrc 開啟ubuntu

進入之後然後我們可以設定一些命令比如

set autoindent   自動縮排

set shiftwidth 

這兩個命令是設定tab鍵長度為4的  

set tabstop     

set number    行號

syntax on   設定關鍵字高亮

注意這些命令要輸入在最後的endif下方

我們在命令列模式的時候有一些快捷鍵可以使用

g:跳到最後         gg:跳到第一行           x:刪除字元       dd:剪下一行     d:剪下一行      3dd:剪下三行

yy:複製一行         3yy:複製三行            u:撤銷

在切換到插入模式的時候,按a游標會後移一位 而按 i 就不會移動

在底行模式中

set nonu  取消行號     set nu    列出行號

%s/main/***/g    可以把全文中的main替換為***

gcc實際上過程分為四步(在編譯的時候我們可以通過加-o 檔名 來改名字。比如gcc test.c -o test)

第一步是預處理

我們通過預處理來處理所有以#開頭的**(比如說標頭檔案展開)

gcc-e test.c -o test.i

第二步是編譯

我們通過編譯首先是語法檢查,然後是把c語言翻譯成組合語言。

gcc -s test.c -o test.s

第三步是彙編

我們通過彙編來把組合語言編譯成二進位制檔案

gcc -c test.s -o test.o

第四步是鏈結

我們通過鏈結把該檔案所需要的庫檔案鏈結過來

gcc test.o -o test

makefile(工程管理器)

make是乙個命令  在當前目錄找makefile檔案(乙個資料夾只能有乙個)

target(目標):dependency(依賴)

(tab字元)command

注意一點這個comman前面一定不是空格,而是乙個tab字元。

gdb也就是一種除錯工具

我們可以先建立乙個test.c的檔案,然後對它進行編譯也就是 gcc test -o test -g 。這樣我們就能得到乙個命名為test的檔案,

然後我們打出 gdb test 這個命令,然後就會進入gdb模式可以對這個檔案進行操作。

在這個模式下我們也有一套指令可以使用,比如:

list(l)列出原始碼     l 5 就是以第五行為中間行列出十行原始碼

break(b)設定斷點      b 5 就是在第五行設定斷點(在第五行是不執行的)

run(r)執行     

contine(c)繼續執行

next(n)執行一句(不進入被調函式中)

step(s)向下執行一句(可進入被調函式中)

info 檢視資訊  info b 檢視斷點資訊

delete 刪除斷點  (有的電腦需要在後面加b)(在後面加數字可以選擇刪除第幾個斷點)

print(p)顯示變數值

quit(q)退出

return 返回 (剩下的函式執行完,再跳出)

shell(指令碼的一種)是命令解析器,將使用者輸入指令轉化為機器執行程式

我們在建立檔案時可以這樣,比如說 vim test.sh 。然後在寫程式開頭時注意一定要寫絕對路徑,比如

#!/bin/bash  

在完成檔案之後需要更改一下檔案許可權。

1.全域性變數與區域性變數的區別以及兩者的優先順序關係

區別:全域性變數作用於整個源程式檔案,而區域性變數只是作用於某個具體的函式內。在c語言中,main函式的區域性變數也僅能在main函式中使用,在其他函式中亦不可使用。

優先順序關係:當在同乙個原始檔中時,若外部變數和區域性變數同名,則在區域性變數的作用範圍內,外部變數被遮蔽,不起作用。

2.宣告與定義的區別

定義的形象的理解就是一旦乙個物件被分配到乙個記憶體,那麼這個名字就和這塊記憶體匹配起來,永遠只能

定義一次

;至於宣告的理解需要分為兩個層面:第一點,宣告可以

出現多次

;第二點,別的地方不可再用它作為變數名或物件名。

3.關於邏輯運算子

則整個事件也就為假;同時只要a為  對於||而言,只要a||b中,a事件為真,則b事件就不需要再考慮,則整個事件也就為

真;a事件為

假,則整個事件也就為假。書中例子:if((++i>0)||(++j>0)),如果(++i)>0,如果為真則不再計算。

4.關於條件運算子

條件運算子的一般形式是:表示式1?表示式2:表示式3

其含義很簡單,若表示式1為真,則以表示式2的值作為表示式的值,否則是表示式3的值作為返回值;其次要注意條件表示式的優先順序雖然低於關係運算子和算術運算子,但是要高於賦值符。

5.關於(++i)和(i++)的區別

如果有表示式a=i++,則其等價於a=i; i=i+1;如果有表示式a=++i ,則其等價於 i=i+1;a=i;

6.c語言中什麼意思?

這相當於while(1);死迴圈。for語句的一般形式如下:for(表示式1;表示式2;表示式3)(需要執行的語句); 其執行過程是:表示式1首先執行且只執行一次;然後執行表示式2,通常都是乙個用於判定條件的表示式,如果表示式2條件成立,就執行(需要執行的語句);然後再執行表示式3;再判斷表示式2,再執行表示式3…..一直到表示式2不成立時,跳出迴圈往下執行。

7.關於常量以及const int *p以及 int * const p的區別

常量所在記憶體空間被加上了唯讀屬性,因此其值不會變;對於const的處理:將除了const的語句外的型別修飾符去掉即可。  const int *p去掉int後就是

const *p

,因而p指向的空間的值不會變;然而,int * const p去掉int *之後就變得不一樣了。const p

即p不可再變,p不可指向別的位址,但是p所指向的內容可變。

8.暫存器變數的使用

程式是儲存在記憶體中的,因為cpu的速度遠遠快於記憶體和暫存器,而暫存器的速度又要遠遠快於記憶體(與兩者的物理結構和造價體積大小有關),因此在操作過程中一般是cpu先從記憶體取出資料到暫存器中,運算完後再送回到記憶體中。在我們設定暫存器變數的過程中,考慮到

暫存器的速度快

,因此暫存器變數的優勢在此。

但是暫存器變數不可設定太多,一方面因為暫存器可能被其他程式占用;另一方面暫存器變數必須是cpu能接收的型別。我們還要注意到暫存器變數是沒有位址的,因而不可以使用區位址符。

9.typedef與#define的區別和聯絡

兩者的聯絡typedef與#define兩者都可以用來定義,兩者的區別也很明顯,對於

typedef

是為乙個

新的型別起新名字

,但是對於

#define

只是簡單的

字串替換

。因而在涉及到有

指標最好用typedef,當有

表示式則必須加個括號

才能成功定義。

10.關於運算子優先順序的記憶方法

!>算術運算子》關係運算子》&&>||>賦值運算子

指標的十個問題

1.如何判斷指標的型別和指標指向的型別?從語法角度看,只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別 把指標宣告語句中的指標名字和名字左邊的指標宣告符 去掉,剩下的就是指標所指向的型別 2.指標的值是什麼?乙個指標的值是xx,就是說該指標指向了一xx為首位址的一片記憶體區域 3.常...

佇列的十個問題

1 佇列與棧的區別 棧是先進後出,而佇列是先進先出。佇列是特殊的線性表,僅能從隊頭和隊尾進行操作。隊頭 取出資料的資料的一端,隊尾 放入資料的一端。而棧僅能從棧頂進行操作。2 常見的佇列的操作 建立佇列 create queue 引數指定佇列可以儲存的元素的最大數量,此函式只適用於動態分配陣列的佇列...

監控系統常見十個問題解析

網路監控攝像頭已經進入了我們生活的方方面面,它以安裝使用方便及 低廉,在現代社會得到了極大的普及。在監控系統使用過程中,有很多需要注意的問題,下面簡要介紹十個問題及解決方法。監控系統 1 供電系統中為什麼要使用穩壓電源?防止由於供電電源電壓波動 過高 過低 對監控裝置的損害。2 供電電源是否穩定對伺...