啊C啊C我愛你-2
C++軟件與嵌入式軟件面經(jīng)解析大全(蔣豆芽的秋招打怪之旅)
本章講解點(diǎn)
1.1 熟悉的陌生人——main函數(shù)
1.2 If else——易錯細(xì)節(jié)分辨
1.3 Switch、break——相愛相殺的故事
1.4 For、while、do-while——傻傻分不清楚
1.5 枚舉
1.6 結(jié)構(gòu)體與共用體
1.7 函數(shù)——原來你是這樣的函數(shù)
1.8 全局變量與靜態(tài)變量詳解
1.9 數(shù)據(jù)類型詳解
1.10 類型轉(zhuǎn)換
1.11 誰先誰后——把人搞瘋的優(yōu)先級
1.12 震驚——位運(yùn)算還可以這樣用
1.13 面試技巧講解
1.14 數(shù)組指針與指針數(shù)組
1.15 指針與字符串
1.16 指針與函數(shù)
1.17 指針與結(jié)構(gòu)體
1.18 內(nèi)存布局
1.19 野指針與內(nèi)存泄露
1.20 野指針與內(nèi)存申請
1.21 內(nèi)存碎片
受眾:本教程適合于C/C++已經(jīng)入門的學(xué)生或人士,有一定的編程基礎(chǔ)。
本教程適合于互聯(lián)網(wǎng)、嵌入式軟件求職的學(xué)生或人士。
故事背景
蔣 豆 芽:小名豆芽,芳齡十八,蜀中人氏。卑微小碩一枚,科研領(lǐng)域茍延殘喘,研究的是如何炒好一盤豆芽。與大多數(shù)人一樣,學(xué)習(xí)道路永無止境,間歇性躊躇滿志,持續(xù)性混吃等死。會點(diǎn)編程,對了,是面對對象的那種。不知不覺研二到找工作的時候了,同時還在忙論文,豆芽都禿了,不過豆芽也沒頭發(fā)啊。
隔壁老李:大名老李,蔣豆芽的好朋友,技術(shù)高手,代碼女神。給了蔣豆芽不少的人生指導(dǎo)意見。
導(dǎo) 師:蔣豆芽的老板,研究的課題是每天對豆芽噓寒問暖。
故事引入
蔣 豆 芽:今天周五了,嘿嘿,周末要到了,趁著周末好好復(fù)習(xí)下,迎接下周的筆試面試,剛把跌?。。。ǘ寡磕樕闲ξ?#^.^#))
蔣 豆 芽:老李,馬上周末了,上次你給我講的C語言細(xì)節(jié)知識,還有嗎?再給我講講吧。大佬,哦吶桑(姐姐),拜托。
隔壁老李:(一臉嫌棄)本來是周末陪男朋友的,看你這么誠懇,就給你講講吧,我讓男朋友晚點(diǎn)來。
蔣 豆 芽:(小聲嘀咕)原來如此,呵,女人,重色輕友。
隔壁老李:(目光凌厲)你說啥?
蔣 豆 芽:(一臉嬉笑)沒啥啊,我說你才貌與智慧并重,狹義與柔情化身。豆芽滯銷,快救救豆芽吧,求求了。
隔壁老李:(一臉無奈)行啦行啦,豆芽,我們就開始吧。
蔣 豆 芽:好好好!
隔壁老李:上次我們一直探討了一些C語言的細(xì)節(jié)知識,如果忘了,豆芽你再回去復(fù)習(xí)復(fù)習(xí),這次我們接著講幾個內(nèi)容。
1.7 函數(shù)——原來你是這樣的函數(shù)
隔壁老李:上次我們將了熟悉的陌生人——main函數(shù)。這次我們講講函數(shù)的細(xì)節(jié)知識。
隔壁老李:講之前,關(guān)于函數(shù)的基礎(chǔ)知識,我們先提一下。函數(shù)是一個獨(dú)立的代碼塊,實(shí)現(xiàn)某一功能,可以傳入?yún)?shù),返回結(jié)果。函數(shù)定義的一般格式是:
返回值類型 函數(shù)名([形參]){ 函數(shù)體 }
函數(shù)可以沒有返回值。
行,豆芽,C語言你是有基礎(chǔ)的,所以這里點(diǎn)到為止。
隔壁老李:豆芽,函數(shù)的入門知識你應(yīng)該是沒問題的,但是有一個東西不知道你有沒有注意過,那就是實(shí)參與形參。
蔣 豆 芽:這個簡單,比如一個函數(shù)聲明為:double cylinder(double r, double h)
,這個時候r
和h
就是形參,而當(dāng)我們調(diào)用該函數(shù)時,如volume = cylinder(radius, height)
,這個時候傳入的參數(shù)radius
和height
就是實(shí)參。函數(shù)調(diào)用時,實(shí)參radius
和height
的值將被依次傳給形參r
和h
。
蔣 豆 芽:函數(shù)的形參必須是變量,用于接受實(shí)參傳遞過來的值;而實(shí)參可以是常量、變量或表達(dá)式,其作用是把常量、變量或表達(dá)式的值傳遞給形參。如果實(shí)參是變量,它與所對應(yīng)的形參是兩個不同的變量。
比如:
//函數(shù)聲明,函數(shù)的形參必須是變量 double cylinder(double r, double h); //函數(shù)調(diào)用,實(shí)參可以是常量、變量或表達(dá)式 volume = cylinder(radius, height); volume = cylinder(3, 4); volume = cylinder(radius+3, height*4);
實(shí)參是主調(diào)函數(shù)的,形參是自定義函數(shù)的,這兩者可以同名,也可以不同名。實(shí)參和形參一一對應(yīng),數(shù)量應(yīng)相同,建議類型也保持一致。
隔壁老李:豆芽,你的基礎(chǔ)還不錯嘛。
蔣 豆 芽:嘻嘻。勉強(qiáng)勉強(qiáng)。
隔壁老李:那我問下你,以你的例子為例,當(dāng)r
,h
的值改變時,radius
和height
的值會改變嗎?
蔣 豆 芽:(不太確定)不會吧。
隔壁老李:你的樣子看起來不太確定哈。正確答案是不會的。我們在學(xué)習(xí)語言時,都會想當(dāng)然先入為主,平時習(xí)以為常,并沒有去關(guān)注細(xì)節(jié),但是有人問起細(xì)節(jié)時,就感覺不確定了,所以我們要弄懂細(xì)節(jié),使得我們更有自信地去用好一門語言,筆試面試更不在話下。
隔壁老李:豆芽你來說說radius
和height
的值為什么不會改變。
蔣 豆 芽:我想起來了,因為在函數(shù)傳參的過程中,函數(shù)會為形參申請新的內(nèi)存空間,并將實(shí)參的值復(fù)制給形參。如下:
因為實(shí)參和形參是不同的變量,各自占有自己的內(nèi)存,當(dāng)然形參的值發(fā)生改變但不會影響實(shí)參了啊。
隔壁老李:沒錯,我們來驗證一下。下面是我給的參考例子。
#include <stdio.h> using namespace std; double cylinder(double r, double h) { double *address_r = &r;//展示地址 double *address_h = &h; r = 1.1; h = 2.2;//改變形參值 return 1.0; } int main() { double radius = 3.2; double height = 4.2; double *address_radius = &radius;//展示地址 double *address_height = &height; double volume = cylinder(radius, height); return 0; }
我們通過斷點(diǎn)調(diào)試,先到double volume = cylinder(radius, height);
處,我們先記錄一下radius
和height
的值和地址,
然后進(jìn)入cylinder
函數(shù)。
記錄一下r
和h
的值和地址:
我們可以清楚看到,C語言將實(shí)參的值復(fù)制給了形參,專門為形參變量開辟了新的內(nèi)存空間,實(shí)參與形參的內(nèi)存地址是不一樣的。然后我們運(yùn)行完cylinder
函數(shù)時,我們的形參值發(fā)生了改變,最后我們退出函數(shù),發(fā)現(xiàn)我們的實(shí)參值是沒有改變的。
原因很簡單,形參和實(shí)參擁有不同的內(nèi)存空間。
隔壁老李:(眼光一閃)豆芽,我問你個問題,那如果我們想讓實(shí)參隨著形參的值改變應(yīng)該怎么辦呢?
蔣 豆 芽:(絲毫不慌)那就使用指針變量。如double cylinder(double *r, double *h)
,當(dāng)我們調(diào)用該函數(shù)時傳入變量地址,volume = cylinder(&radius, &height)
。
隔壁老李:沒錯,那我們再來驗證一下。
#include <stdio.h> using namespace std; double cylinder(double *r, double *h) { *r = 1.1; *h = 2.2;//改變形參值 return 1.0; } int main() { double radius = 3.2; double height = 4.2; double *address_radius = &radius;//展示地址 double *address_height = &height; double volume = cylinder(&radius, &height); return 0; }
依然按照我們之前的思路依次查看形參實(shí)參的地址和值。
可以非常清楚地看到,這時的形參和實(shí)參內(nèi)存地址是一樣的,那么改變形參的值,實(shí)參的值也會被改變。豆芽你說說這是為什么?
蔣 豆 芽:根據(jù)指針的特性,是因為函數(shù)調(diào)用時,將實(shí)參地址賦值給了形參變量,使得形參指針指向了實(shí)參的地址空間,所以實(shí)參和形參指向了同一個內(nèi)存空間。如圖:
可以很清楚地看到,函數(shù)為形參*r
申請新的內(nèi)存空間,然后將實(shí)參radius
的地址賦值給了r
,所以r=0x0001
,這樣r
就指向了radius
的內(nèi)存空間,通過改變*r
的值,也就是改變了radius
的值,因為它們指向了同一個內(nèi)存空間。
隔壁老李:豆芽,那你看看下面的代碼,最后radius
和height
的值又是多少呢?
#include <stdio.h> using namespace std; double cylinder(double *r, double *h) { r = new double(0.1); h = new double(0.2); *r = 1.1; *h = 2.2;//改變形參值 return 1.0; } int main() { double radius = 3.2; double height = 4.2; double *address_radius = &radius;//展示地址 double *address_height = &height; double volume = cylinder(&radius, &height); return 0; }
蔣 豆 芽:這不是一樣的嗎?指針形參嘛,最后radius=1.1
,height=2.2
隔壁老李:你確定嗎?我們看看最后的結(jié)果吧
蔣 豆 芽:(一臉疑惑)咦?沒變?形參不是值改變了嗎?這是怎么回事?
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
<p> - 本??m合于C/C++已經(jīng)入門的學(xué)生或人士,有一定的編程基礎(chǔ)。 - 本??m合于互聯(lián)網(wǎng)C++軟件開發(fā)、嵌入式軟件求職的學(xué)生或人士。 - 本??依薈語言、C++、操作系統(tǒng)、計算機(jī)網(wǎng)絡(luò)、嵌入式、算法與數(shù)據(jù)結(jié)構(gòu)等一系列知識點(diǎn)的講解,并且最后總結(jié)出了高頻面試考點(diǎn)(附有答案)共近400道,知識點(diǎn)講解全面。不僅如此,教程還講解了簡歷制作、筆試面試準(zhǔn)備、面試技巧等內(nèi)容。 </p> <p> <br /> </p>