程序如果要被CPU執(zhí)行,就得編譯成CPU可以執(zhí)行的指令,一大堆的程序就變成了一堆的指令。一個操作系統(tǒng)它也是一堆程序組成的,可以想象CPU的指令是很多的,但是這么多的指令中,有些指令涉及到系統(tǒng)底層的東西,如果有些指令錯用或者使用不當(dāng)是非常危險的,比如清內(nèi)存、設(shè)置時鐘、修改用戶訪問權(quán)限、分配系統(tǒng)資源等等,可能導(dǎo)致系統(tǒng)崩潰。CPU將這些指令進行了分類,分為特權(quán)指令和非特權(quán)指令,不讓所有程序都能使用所有指令,如果所有程序都能使用,那系統(tǒng)崩潰就會變得非常常見了。
我們常常說到的操作系統(tǒng)有Linux、Windows、mac OS等等,手機的安卓系統(tǒng)就是基于Linux操作系統(tǒng),這些操作系統(tǒng)從內(nèi)核的角度分為宏內(nèi)核和微內(nèi)核,Linux是典型的宏內(nèi)核的操作系統(tǒng),Windows是典型的微內(nèi)核操作系統(tǒng)。
指針使得 C 語言能夠更高效地實現(xiàn)對計算機底層硬件的操作,而計算機硬件的操作很大程度上依賴地址,指針便提供了一種對地址操作的方法,在一定意義上,指針是c語言的精髓,所以一定要耐心看完。指針對于很多c語言初學(xué)者來說可能難以理解,一不小心可能被指針的指向關(guān)系繞進去,在這里就對指針做一些總結(jié),寫一下自己的理解。
半個月前這位同學(xué)找到我,他當(dāng)時準(zhǔn)備參加面試,就和我聊了很多,總體感覺這位同學(xué)基礎(chǔ)還是不錯。我那時候也就順便給他找了一些C語言、Linux等等筆試題,后面也教他稍微修改過幾次簡歷??傮w來說,這位同學(xué)能有現(xiàn)在的三個比較好的offer很大原因在于他自身的基礎(chǔ)不錯,肯付出、肯努力的結(jié)果。前幾天和我分享了他參加面試遇到的一道c語言筆試題,他說當(dāng)時有點整不會了,竟然做錯了,然后面試官也讓他自己回去想想。因為大部分題做的還可以,最后也通過了面試。題目是這樣的:
I2C(IIC)屬于兩線式串行總線,由飛利浦公司開發(fā)用于微控制器(MCU)和外圍設(shè)備(從設(shè)備)進行通信的一種總線,屬于一主多從(一個主設(shè)備(Master),多個從設(shè)備(Slave))的總線結(jié)構(gòu),總線上的每個設(shè)備都有一個特定的設(shè)備地址,以區(qū)分同一I2C總線上的其他設(shè)備。
如果有一天你們公司很重要的一臺Linux服務(wù)器突然啟動不了了,重裝系統(tǒng)又浪費時間,如果是啟動過程有問題,那么你知道啟動過程可以快速定位系統(tǒng)問題,很快就可以解決。
由上圖中可以知道進程地址空間中最頂部的段是棧,代碼中調(diào)用函數(shù)、定義局部變量(但不包含static修飾的變量)或聲明的類的實例等等都要使用??臻g,當(dāng)函數(shù)執(zhí)行完(也就是程序執(zhí)行超過了這個函數(shù)的作用范圍的時候),操作系統(tǒng)會把該函數(shù)在棧中存放的數(shù)據(jù)出棧,也就是函數(shù)執(zhí)行完需要return的時候系統(tǒng)會自己釋放內(nèi)存。但是如果不斷的向棧中壓入數(shù)據(jù),達到最大的棧空間大小的話就會棧溢出(stack overflow),這時候程序運行就會出現(xiàn)段錯誤(Segmentation Fault)。
其實在 c++語言里面const修飾的才算是一個真正的常量,在 c 語言中 const 可以說是個“冒牌貨”。為什么會這樣?其實是 c++ 編譯器對 const 進行了加強,當(dāng) c++ 編譯器遇到常量聲明時,不會像 c 語言一樣給這樣const對象單獨分配內(nèi)存,c 語言一般是放在只讀數(shù)據(jù)區(qū),而 c ++ 編譯器是把const對象放在一個符號表里面(我個人覺得放在符號表里面的其中一個原因可能是想減少一些存儲操作次數(shù)),至于符號表是屬于內(nèi)存布局(文章:你該知道你寫的程序的內(nèi)存布局)中的哪一塊,我也不知道,寫 c++ 編譯器的人才知道。
TCP 是基于連接的數(shù)據(jù)流的協(xié)議,先建立連接再進行通信,而且在通信過程中會檢查數(shù)據(jù)是否發(fā)送成功。優(yōu)點就是保證數(shù)據(jù)的完整性和準(zhǔn)確性,缺點就是效率較低。
定義一個變量,就是在內(nèi)存中為你定義的這個變量開辟一段內(nèi)存空間,如果這個變量沒有初始化,那么系統(tǒng)會隨機給這個變量賦一個值,這個值我一般稱它為"垃圾數(shù)"。沒有初始化的變量我認為它是沒有意義的,是在浪費內(nèi)存,就比如人剛出生的時候上帝需要給他賦予點東西,比如條件反射,比如哭,比如吮吸........這樣人的意義得以體現(xiàn)。對于類的成員來說,我們最好的做法就是在構(gòu)造函數(shù)中對每一個類成員進行初始化。
返回函數(shù)的引用去初始化一個新的引用這個和前面一樣,都是不會產(chǎn)生副本,但是現(xiàn)在是用返回值去初始化一個引用聲明c,也就是說這時候變成了變量temp的別名,在c的生命周期內(nèi)temp是一直有效的,這樣做完全可以。
一想起這個話題,不禁想起剛上大一被洗腦的畫面:自動化這個專業(yè)就業(yè)前景廣闊,擇業(yè)面寬。哇!聽起來還不錯,看來以后找工作應(yīng)該挺好找的,看來當(dāng)初填志愿還是選了一個好專業(yè)!現(xiàn)在想想,好像還真是這樣,樣樣都學(xué)過,學(xué)的確實挺寬的,擇業(yè)面寬說的好像沒有一點毛病。
如果你是在Linux下做開發(fā),你就必須知道Makefile是什么東西,如果不知道那就可以說你不是一個合格的Linux開發(fā)工程師,因為Makefile是必備的一項技能。那么,Makefile到底有什么作用呢?首先,gcc大家應(yīng)該知道吧,gcc(GNU Compiler Collection,GNU編譯器套件)是由GNU開發(fā)的編程語言編譯器。使用gcc命令編譯你會遇到一些麻煩:
什么是硬鏈接和軟鏈接,要想知道什么是硬鏈接和軟鏈接的話,讓我?guī)阊芯俊?赐赀@篇文章,讓你徹底明白什么是硬鏈接,什么是軟鏈接?。?!首先,在Linux系統(tǒng)下,有兩種鏈接文件,一種是硬鏈接(Hard Link),一種是軟鏈接,也稱為符號鏈接(Symbolic Link)。
通信協(xié)議類似于交通規(guī)劃,就是在規(guī)劃路上的司機怎么走。假如你在某寶上買了一個東西,商家就會把你買的東西發(fā)一個快遞給你,那么要如何通過網(wǎng)絡(luò)投遞到你的手上?