iOS 面試-- C 語言

1.寫出下面代碼的運行結(jié)果

? ? int array[5] = {1, 2, 3, 4, 5};int *p = &array[0];

? ? int max = Max(*p++, 1);

? ? printf("%d ,%d", max, *p);

? ? 答案:1,2

? ? #define Max(X, Y) ((X) > (Y) ? (X) : (Y)) 對于++摄乒、--在宏定義當中使用最容易產(chǎn)生副作用

2.define 定義的宏和const 定義的常量的區(qū)別

? ? ?#define定義的宏,程序在預(yù)處理階段將宏定義內(nèi)容僅進行了替換叠纷,因此程序運行時,常量表中沒有用 ? ? #define所定義的宏,系統(tǒng)并不會為它分配內(nèi)存,而且在編譯時不會檢查數(shù)據(jù)類型陋率,出錯的概率要大一些。

? ? const 定義的常量秽晚,在程序運行的時候是存放在常量表中瓦糟,系統(tǒng)會為它分配內(nèi)存,而且在編譯時進行數(shù)據(jù)類型檢查赴蝇。

? ? #define 定義的表達式時要注意“邊緣效應(yīng)”菩浙,例如如下定義:

? ? #define N 2+3 // 我們預(yù)想的 N 值是5,我們這樣使用N

? ? int a = N / 2 ; // 我們預(yù)想的 a 的值是2.5,可實際上 a 的值是3.5

3.strcpy , memcpy , sprintf 使用注意事項

? ? strcpy 是一個字符串拷貝函數(shù)劲蜻,原型為:strcpy ( char destr, const char str ) ,結(jié)束標志為?‘\0’ ,由于拷貝的長度不是我們控制的陆淀,所以拷貝容易出錯。

? ? Memcpy 是一個內(nèi)存拷貝函數(shù)先嬉,函數(shù)原型為:memcpy (char destrc , const char str, unsigned int len ),講長度為 len 的一段內(nèi)存轧苫,從str 拷貝到 destrc 中去,這個函數(shù)的長度可控疫蔓,但是會有內(nèi)存讀寫錯誤含懊,(比如 len 的長度大于要拷貝的空間或者目的空間)

? ? sprintf 是一個格式化函數(shù),將一段數(shù)據(jù)從通過特定的格式衅胀,格式化到一個字符串緩沖區(qū)中去岔乔。sprintf 格式化的函數(shù)的長度不可控制,有可能格式化后的字符串會超出緩沖區(qū)的大小滚躯,造成溢出雏门。

4.static 關(guān)鍵字的作用

? ? · 隱藏。編譯多個文件時掸掏,所有未加 static 前綴的全局變量和函數(shù)都全局可見茁影。

? ? · 保持變量內(nèi)容的持久。全局變量和 static 變量都存儲在靜態(tài)存儲區(qū)阅束,程序開始運行就初始化呼胚,只初始化一次。static 控制了變量的作用范圍息裸。

? ? · 默認初始化為0蝇更。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中的所有字節(jié)都是0x00呼盆,全局變量和 static 變量都是默認初始化為0年扩。

5.static 關(guān)鍵字的區(qū)別

? ? · 全局變量方面:static 全局變量只初始化一次,防止在其他文件單元中被引用访圃;

? ? · 局部變量方面:static 局部變量只被初始化一次厨幻,下一次依據(jù)上一次結(jié)果的值;

? ? · 函數(shù)方面 :static 函數(shù)在內(nèi)存中只有一份腿时,普通函數(shù)在每個被調(diào)用中維持一份拷貝

6.關(guān)鍵字 const

? ? · int const a 况脆;const int a :作用一樣,a 是一個常整型數(shù)

? ? · int const * a 批糟;const int * a :a 是一個指向常整型數(shù)的指針(整型數(shù)不可變格了,指針可變)

? ? · int * const a :a 是一個指向整型數(shù)的常指針(整型數(shù)可變,指針不可變)

? ? · int const *const a :是一個指向常整型數(shù)的常指針(指針徽鼎、整型數(shù)均不可變)

7.堆和棧

? ? · 管理方式:

? ? ? ? 棧:由編譯器自動管理盛末,無需我們手工控制

? ? ? ? 堆:釋放工作由程序員控制弹惦,容易產(chǎn)生內(nèi)存泄漏(memory leak)。

? ? · 申請大星牡:

? ? ? ? 棧:在 Windows 下棠隐,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存區(qū)域檐嚣,即棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的助泽,在 Windows 下棧的大小是2M (也有的說是 1 M ),如果申請的空間超過棧的剩余空間時净嘀,將提示 overflow报咳。因此能從棧獲取的空間比較小侠讯。

? ? ? ? 堆:是向高地址擴展的數(shù)據(jù)結(jié)構(gòu)挖藏,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表存儲空閑的內(nèi)存地址的厢漩,自然不連續(xù)膜眠,而鏈表的遍歷方式是由低地址向高地址。堆得大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存溜嗜,所以堆獲得的空間比較靈活宵膨,也比較大。

? ? · 碎片問題:

? ? ? ? 棧:不存在該問題炸宵,因為棧是先進后出的隊列辟躏,他們是如此一一對應(yīng),以至于沒有一個內(nèi)存塊從棧中間彈出

? ? ? ? 堆:頻繁的 new/delete 勢必造成空間的不連續(xù)土全,從而造成大量的碎片捎琐,使程序效率降低

? ? · 分配方式:

? ? ? ? 棧:有2種方式:靜態(tài)和動態(tài)分配。靜態(tài)分配是由編譯器完成的裹匙,比如局部變量的分配瑞凑。動態(tài)分配由 alloc 函數(shù)進行分配,但棧的動態(tài)分配和棧不同概页,是由編譯器進行釋放籽御,無需程序員手工實現(xiàn)

? ? ? ? 堆:只有動態(tài)分配

? ? · 分配效率:

? ? ? ? 棧:是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址惰匙,壓棧出棧都有專門的指令執(zhí)行技掏,所以效率比較高

? ? ? ? 堆:是C/C++ 函數(shù)庫提供的,機制很復(fù)雜

8.引用和指針的區(qū)別

? ? · 指針指向一塊內(nèi)存项鬼,內(nèi)容存儲所指內(nèi)存的地址哑梳;引用是某塊內(nèi)存的別名。

? ? · 指針使用時需(*)秃臣,引用不需要涧衙。

? ? · 引用只在定義時被初始化哪工,之后不可變;指針可變弧哎。

? ? · 引用沒有const雁比。

? ? · 引用不能為空坟冲。

? ? · sizeof 引用得到的是所指向變量(對象)的大小钦幔,sizeof 指針是指針本身的大小。

? ? · 引用 ++ 為引用對象自己 ++ 讳癌,指針 ++ 是指向?qū)ο蠛竺娴膬?nèi)存序攘。

? ? · 程序需要為指針分配內(nèi)存區(qū)域茴她,引用不需要。

9.用變量 a 給出下面的定義

? ? · 一個有10個整型數(shù)的數(shù)組:

? ? ? int a [10]

? ? · 一個有10個指針的數(shù)組程奠,該指針是一個指向一個整型數(shù)的:

? ? ? int * a [10]

? ? · 一個指向10個整數(shù)數(shù)組的指針:

? ? ? int ( * ) a [10]

? ? · 一個指向函數(shù)的指針丈牢,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù):

? ? ? int ( * ) a ( int )

? ? · 一個有10個指針的數(shù)組,該指針指向一個函數(shù)瞄沙,該函數(shù)有一個整型參數(shù)并返回一個整型參數(shù)

? ? ? int ( * a [10] ) ( int )

10.寫出以下代碼的輸出

? ? int a [5] = {1, 2, 3, 4, 5} ;

? ? int *ptr = ( int *) ( &a + 1) ;

? ? printf ("%d, %d ",*( a + 1) , *(ptr + 1));

? ? 參考答案:2己沛,隨機值

? ? 分析:

? ? ? ? a 代表有 5 個元素的數(shù)組首地址,a[ 5 ] 的元素分別是1距境,2申尼,3,4垫桂,5师幕。a + 1 表示數(shù)據(jù)首地址加 1,即 a[ 1 ],值為2诬滩。但這里是&a + 1霹粥,因為 a 代表的是整個數(shù)組,它的空間大小為5 * sizeof ( int )碱呼,因此 &a + 1就是 a + 5蒙挑。a 是個常量指針,指向當前數(shù)組的首地址愚臀,忆蚀,指針 + 1就是移動sizeof( int )個字節(jié)。因此 ptr 是指向 int * 類型的指針姑裂,而 ptr 指向的就是 a + 5馋袜,那么 ptr +1 也相當于 a + 6,所以最后的 *( ptr +1)就是一個隨機值了舶斧。而 *( ptr - 1 )就相當于 a + 4欣鳖,對應(yīng)值為5。

11.內(nèi)存分區(qū)情況

? ? · 代碼區(qū):存放函數(shù)二進制代碼

? ? · 數(shù)據(jù)區(qū):系統(tǒng)運行時申請內(nèi)存并初始化茴厉,系統(tǒng)退出時由系統(tǒng)釋放泽台,存放全局變量什荣、靜態(tài)變量、常量

? ? · 堆區(qū):通過 malloc 等函數(shù)或 new 等操作符動態(tài)申請得到怀酷,需程序員手動申請和釋放

? ? · 棧區(qū):函數(shù)模塊申請稻爬,函數(shù)結(jié)束時由系統(tǒng)自動釋放,存放局部變量蜕依、函數(shù)參數(shù)

12.用NSLog輸出一個浮點類型桅锄,結(jié)果四舍五入,并保留一位小數(shù)

? ? float money = 1.011样眠;

? ? NSLog ( @"%.1f", money ) ;

13.指針和數(shù)組的區(qū)別

? ? · 數(shù)組可以申請在棧區(qū)和數(shù)據(jù)區(qū)友瘤;指針可以指向任意類型的內(nèi)存塊。sizeof 作用于數(shù)組時檐束,得到是數(shù)組所占的內(nèi)存大斜柩怼;作用于指針時厢塘,得到的都是4個字節(jié)的大小

? ? · 數(shù)組名表示數(shù)組首地址茶没,是常量指針,不可修改指向晚碾;普通指針的值可以改變

? ? · 用字符串初始化字符數(shù)組是將字符串的內(nèi)容拷貝到字符數(shù)組中;用字符串初始化字符指針是將字符串的首地址賦給指針喂急,也就是指向了該字符串

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末格嘁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子廊移,更是在濱河造成了極大的恐慌糕簿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡孔,死亡現(xiàn)場離奇詭異懂诗,居然都是意外死亡,警方通過查閱死者的電腦和手機苗膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門殃恒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辱揭,你說我怎么就攤上這事离唐。” “怎么了问窃?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵亥鬓,是天一觀的道長。 經(jīng)常有香客問我域庇,道長嵌戈,這世上最難降的妖魔是什么覆积? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮熟呛,結(jié)果婚禮上技健,老公的妹妹穿的比我還像新娘。我一直安慰自己惰拱,他們只是感情好雌贱,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偿短,像睡著了一般欣孤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昔逗,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天降传,我揣著相機與錄音,去河邊找鬼勾怒。 笑死婆排,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笔链。 我是一名探鬼主播段只,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鉴扫!你這毒婦竟也來了赞枕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坪创,失蹤者是張志新(化名)和其女友劉穎炕婶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莱预,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡柠掂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了依沮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯贞。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悉抵,靈堂內(nèi)的尸體忽然破棺而出肩狂,到底是詐尸還是另有隱情,我是刑警寧澤姥饰,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布傻谁,位于F島的核電站,受9級特大地震影響列粪,放射性物質(zhì)發(fā)生泄漏审磁。R本人自食惡果不足惜谈飒,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望态蒂。 院中可真熱鬧杭措,春花似錦、人聲如沸钾恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘩蚪。三九已至泉懦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疹瘦,已是汗流浹背崩哩。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留言沐,地道東北人邓嘹。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像险胰,于是被迫代替她去往敵國和親汹押。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型鸯乃。 運用指針編程是C語言最主要的風格之一鲸阻。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,446評論 3 44
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別缨睡? C沒有Protection行為...
    阿面a閱讀 7,660評論 0 10
  • 1.語言中變量的實質(zhì) 要理解C指針,我認為一定要理解C中“變量”的存儲實質(zhì)陈辱, 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,779評論 0 9
  • 欲望被陣雨澆熄 抬頭望天想捕捉一張不合時宜的梨花帶雨 亂入一只搖頭晃腦彩虹傘 吹著口哨的少年郎
    三石怪人閱讀 220評論 0 0
  • HTML奖年、XML、XHTML 有什么區(qū)別 html即是超文本標記語言(Hyper Text Markup Lang...
    饑人谷_嚴琰閱讀 154評論 0 0