iOS 面試-- C 語言

1.寫出下面代碼的運行結果

? ? 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)) 對于++、--在宏定義當中使用最容易產生副作用

2.define 定義的宏和const 定義的常量的區別

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

? ? const 定義的常量,在程序運行的時候是存放在常量表中,系統會為它分配內存,而且在編譯時進行數據類型檢查。

? ? #define 定義的表達式時要注意“邊緣效應”,例如如下定義:

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

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

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

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

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

? ? sprintf 是一個格式化函數,將一段數據從通過特定的格式,格式化到一個字符串緩沖區中去。sprintf 格式化的函數的長度不可控制,有可能格式化后的字符串會超出緩沖區的大小,造成溢出。

4.static 關鍵字的作用

? ? · 隱藏。編譯多個文件時,所有未加 static 前綴的全局變量和函數都全局可見。

? ? · 保持變量內容的持久。全局變量和 static 變量都存儲在靜態存儲區,程序開始運行就初始化,只初始化一次。static 控制了變量的作用范圍。

? ? · 默認初始化為0。在靜態數據區,內存中的所有字節都是0x00,全局變量和 static 變量都是默認初始化為0。

5.static 關鍵字的區別

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

? ? · 局部變量方面:static 局部變量只被初始化一次,下一次依據上一次結果的值;

? ? · 函數方面 :static 函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

6.關鍵字 const

? ? · int const a ;const int a :作用一樣,a 是一個常整型數

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

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

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

7.堆和棧

? ? · 管理方式:

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

? ? ? ? 堆:釋放工作由程序員控制,容易產生內存泄漏(memory leak)。

? ? · 申請大小:

? ? ? ? 棧:在 Windows 下,棧是向低地址擴展的數據結構,是一塊連續的內存區域,即棧頂的地址和棧的最大容量是系統預先規定好的,在 Windows 下棧的大小是2M (也有的說是 1 M ),如果申請的空間超過棧的剩余空間時,將提示 overflow。因此能從棧獲取的空間比較小。

? ? ? ? 堆:是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表存儲空閑的內存地址的,自然不連續,而鏈表的遍歷方式是由低地址向高地址。堆得大小受限于計算機系統中有效的虛擬內存,所以堆獲得的空間比較靈活,也比較大。

? ? · 碎片問題:

? ? ? ? 棧:不存在該問題,因為棧是先進后出的隊列,他們是如此一一對應,以至于沒有一個內存塊從棧中間彈出

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

? ? · 分配方式:

? ? ? ? 棧:有2種方式:靜態和動態分配。靜態分配是由編譯器完成的,比如局部變量的分配。動態分配由 alloc 函數進行分配,但棧的動態分配和棧不同,是由編譯器進行釋放,無需程序員手工實現

? ? ? ? 堆:只有動態分配

? ? · 分配效率:

? ? ? ? 棧:是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,所以效率比較高

? ? ? ? 堆:是C/C++ 函數庫提供的,機制很復雜

8.引用和指針的區別

? ? · 指針指向一塊內存,內容存儲所指內存的地址;引用是某塊內存的別名。

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

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

? ? · 引用沒有const。

? ? · 引用不能為空。

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

? ? · 引用 ++ 為引用對象自己 ++ ,指針 ++ 是指向對象后面的內存。

? ? · 程序需要為指針分配內存區域,引用不需要。

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

? ? · 一個有10個整型數的數組:

? ? ? int a [10]

? ? · 一個有10個指針的數組,該指針是一個指向一個整型數的:

? ? ? int * a [10]

? ? · 一個指向10個整數數組的指針:

? ? ? int ( * ) a [10]

? ? · 一個指向函數的指針,該函數有一個整型參數并返回一個整型數:

? ? ? int ( * ) a ( int )

? ? · 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型參數

? ? ? 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 個元素的數組首地址,a[ 5 ] 的元素分別是1,2,3,4,5。a + 1 表示數據首地址加 1,即 a[ 1 ],值為2。但這里是&a + 1,因為 a 代表的是整個數組,它的空間大小為5 * sizeof ( int ),因此 &a + 1就是 a + 5。a 是個常量指針,指向當前數組的首地址,,指針 + 1就是移動sizeof( int )個字節。因此 ptr 是指向 int * 類型的指針,而 ptr 指向的就是 a + 5,那么 ptr +1 也相當于 a + 6,所以最后的 *( ptr +1)就是一個隨機值了。而 *( ptr - 1 )就相當于 a + 4,對應值為5。

11.內存分區情況

? ? · 代碼區:存放函數二進制代碼

? ? · 數據區:系統運行時申請內存并初始化,系統退出時由系統釋放,存放全局變量、靜態變量、常量

? ? · 堆區:通過 malloc 等函數或 new 等操作符動態申請得到,需程序員手動申請和釋放

? ? · 棧區:函數模塊申請,函數結束時由系統自動釋放,存放局部變量、函數參數

12.用NSLog輸出一個浮點類型,結果四舍五入,并保留一位小數

? ? float money = 1.011;

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

13.指針和數組的區別

? ? · 數組可以申請在棧區和數據區;指針可以指向任意類型的內存塊。sizeof 作用于數組時,得到是數組所占的內存大小;作用于指針時,得到的都是4個字節的大小

? ? · 數組名表示數組首地址,是常量指針,不可修改指向;普通指針的值可以改變

? ? · 用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指向了該字符串

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容

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