




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、3 a34哪個(gè)不能表示 a11: *(&a00) *(*(a+1)+1) *(&a1+1) *(&a00+4) 4 for(int i.) for(int j.) printf(i,j); printf(j) 會(huì)出現(xiàn)什么問(wèn)題 32 位機(jī)上根據(jù)下面的代碼,問(wèn)哪些說(shuō)法是正確的?signed char a = 0xe0;unsigned int b = a;unsigned char c = a;A. a>0 && c>0 為真 B. a = c 為真 C. b 的十六進(jìn)制表示是:0xffffffe0 D. 上面都不對(duì)分析:坑爹丫,有木有!10 個(gè)
2、人 9 個(gè)這個(gè)恐怕都不敢確定!(敢肯定的要么是高手,要么就是錯(cuò)的!) B me 認(rèn)為是錯(cuò)的,一個(gè) uchar 和一個(gè) schar 比較,真的就是一個(gè)字節(jié)在比較嗎?C me 認(rèn)為是對(duì)的,將一個(gè) schar 賦值給一個(gè) uint,要不要符號(hào)擴(kuò)展呢?是絕對(duì)會(huì)還是可能會(huì)呢?細(xì)節(jié)到底是神馬?O_O"A 貌似比較確定,肯定是錯(cuò)的,肯定?揭露真相:A 確實(shí)是錯(cuò)的,B 也是錯(cuò)的,C 是對(duì)的,所以 D 也是錯(cuò)的。理由?A 錯(cuò)是因?yàn)?,a 是負(fù)數(shù),c 是正數(shù),即使跟 0 比較要轉(zhuǎn)換到 int(后面暫不區(qū)分轉(zhuǎn)換和類型提升,總之就是類型變了),也是一負(fù)一正,所以 A 錯(cuò)。B 呢?是說(shuō)一正一負(fù)不會(huì)相等,難道是因
3、為這嗎?難道不是嗎?首先說(shuō) a 和 c 的二進(jìn)制表示一模一樣,都是 0xe0,那么比較就不相等?!是的,比較的時(shí)候全部轉(zhuǎn)換為 int,所以呢,a 還是作為一個(gè)負(fù)數(shù)存在,c 作為一個(gè)正數(shù)存在,于是就不相等了,所以 B 錯(cuò)。C 腫么就對(duì)了?a 是一個(gè) schar,賦值給 uint 的 b,前若干個(gè)字節(jié)不是補(bǔ) 0 嗎?首先 schar 轉(zhuǎn)換為 int,然后 int 轉(zhuǎn)換成 uint,所以最初是符號(hào)擴(kuò)展,然后一個(gè) int 賦值給了 uint,C correct!me 曾經(jīng)要寫(xiě)一篇關(guān)于c的類型以及指針的 blog,不過(guò)最后沒(méi)有完成,不過(guò)還是可以參考一下的。下面哪些選項(xiàng)能編譯通過(guò)?int i;char a
4、10;string f();string g(string &str);A. if(!i)f(); B. g(f(); C. a=a+1; D. g("abc");分析:再次坑爹有木有!(其實(shí) me 比較確信這道題,是坑別人的爹,O_O")A 絕對(duì)是正確的,C 絕對(duì)是錯(cuò)的,D 基本肯定是錯(cuò)的,那 B 呢?要么 error ,要嚒 warning!如果是 warning 但是沒(méi)有 error ,這算神馬情況呢?B 確實(shí)不應(yīng)該選,至少語(yǔ)義上不該選!f() 返回一個(gè)臨時(shí)量,然后傳給 g 函數(shù),而 g 的參數(shù)是非 const 引用,是不能引用臨時(shí)量的!為嘛,如果
5、g 中修改了傳進(jìn)來(lái)的 string,那么會(huì)是怎么一回事呢?修改了一個(gè)臨時(shí)量的值?那這意義何在呢?但是如果將 g 的原型修改為 string g(const string&); 就是可以的,為么可以?訪問(wèn)(只讀)臨時(shí)量就是正確的?那必須的,比如 u 可能想知道 a+b 的結(jié)果是多少,然后輸出!a+b 的結(jié)果就是一個(gè)臨時(shí)量。如果說(shuō)修改 a+b 的結(jié)果,這是神馬個(gè)邏輯?!真相:C 錯(cuò)是以為 a 是一個(gè)地址常量,不可能再被賦值。D 為嘛錯(cuò)呢?"abc" 的類型可是 const char* 呢,是個(gè)常量指針呢!(可以用來(lái)初始化 string。)int a10; 問(wèn)下面哪些不可
6、以表示 a1 的地址?A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)分析:奇葩丫!(其實(shí)并不奇葩!)騰訊的題目有時(shí)候出的的確有水平丫,雖然出的太有水平了分就考不高了。me 想哭丫,想來(lái)想去還是在 A 和 B 中選錯(cuò)了,%>_<%,當(dāng)時(shí)還特意提醒自己來(lái)著的,O_O"c+ 中的 sort 如何用來(lái)排序 a 數(shù)組呢?sort(a, a+N); 或是 sort(a, a+sizeof(a)/sizeof(a0); 當(dāng)時(shí)懵了,實(shí)際上 a+1,就是 a1 的地址呢!a
7、 的類型是 int10,a+1 和一個(gè) int* 類型的 +1 效果一樣,都表示偏移 1 個(gè)元素,所以 A 不能表示。(選錯(cuò)誤的!) C 能表示是因?yàn)槿×耸椎刂纷鳛橐粋€(gè) int* 然后 +1,就是偏移一個(gè)元素,所以不選。B 腫么說(shuō)呢,me 一直一位&a0 是一個(gè)普普通通的地址,+1 就是 +1個(gè)字節(jié),實(shí)際上是 +1 個(gè)元素!D 也能表示?將 a 的首地址轉(zhuǎn)換為一個(gè) char* 指針,這個(gè)時(shí)候 +1 是偏移一個(gè) char,也就是一個(gè)字節(jié),實(shí)際上應(yīng)該偏移 sizeof(int) 個(gè)字節(jié)才能到達(dá) a1,所以 D 可以表示(不選)。不多說(shuō)了。(如果是二維數(shù)組是不是會(huì)更懵呢,O_O")
8、問(wèn)下面的數(shù)據(jù)都存放在哪些存儲(chǔ)區(qū)?int main() char *p = "hello,world" return 0;A. . B. . C. 棧和常量區(qū) D. 棧和堆分析:"hello,world" 是常量,趕腳應(yīng)該就是 C 吧,應(yīng)該大家感覺(jué)都一樣。這里不涉及什么堆的事。假設(shè)在一個(gè) 32 位 little endian 的機(jī)器上運(yùn)行下面的程序,結(jié)果是多少?#include <stdio.h>int main() long long a = 1, b = 2, c = 3; printf("%d %d %dn", a,
9、b, c); return 0;A. . B. . C. . D. .分析:貌似問(wèn)題沒(méi)有想的那么簡(jiǎn)單。如果說(shuō)運(yùn)行結(jié)果,很簡(jiǎn)單,有人是 1 0 2;有人是 1 2 3。涉及到 little/big endian 和參數(shù)入棧的問(wèn)題,me 表示現(xiàn)在有點(diǎn)無(wú)能為力,O_O"下面哪些函數(shù)調(diào)用必須進(jìn)入內(nèi)核才能完成?A. fopen B. exit C. memcpy D. strlen分析:有些無(wú)能為力。A 是要打開(kāi)文件的,貌似設(shè)計(jì)很多內(nèi)核操作丫;exit 是退出進(jìn)程,結(jié)束進(jìn)程,應(yīng)該也要深入內(nèi)核。memcpy ,me 一直猶豫用戶區(qū)的數(shù)據(jù)拷貝要不要通過(guò)內(nèi)核。strlen me 感覺(jué)關(guān)系不大。內(nèi)存管
10、理中的 LRU 方法是用來(lái)管理神馬的?A. 虛擬內(nèi)存的分配 B. 虛擬內(nèi)存的釋放 C. 物理內(nèi)存的分配 D. 物理內(nèi)存的釋放分析:貌似是用來(lái)關(guān)系物理塊的,后面的填空題正好有說(shuō),O_O"關(guān)于DMA 的說(shuō)法,哪些是錯(cuò)誤的?A. DMA,Direct Memory Acess 直接存儲(chǔ)器訪問(wèn),使得不同的速度的硬件設(shè)備可以直接通信,不通過(guò) CPU 干預(yù);B. DMA 訪問(wèn)的時(shí)候需要從 CPU 那里奪得總線控制權(quán),然后.C. DMA 速度快;D. DMA 不需要中斷控制,CPU 管理不要它;1)signed char a=0xe0;unsigned int b=a;unsigned char
11、c=a;下面說(shuō)法正確的是:A (a>0 )&&(b>0)為真 B c=a 為真 C b的16進(jìn)制為0xffffffe0 D 都不對(duì)/ 答案:C / 整形比較小于int的會(huì)擴(kuò)寬的int再比較, 而有符號(hào)數(shù)擴(kuò)寬填充符號(hào)位, 無(wú)符號(hào)數(shù)填充0, 導(dǎo)致擴(kuò)寬后兩個(gè)整形的二進(jìn)制不再相等, 選擇C. 編程測(cè)試:printf (”%x %x %x",a,b,c);結(jié)果: ffffffe0 ffffffe0 e02)問(wèn)下面的數(shù)據(jù)都存放在哪些存儲(chǔ)區(qū)?int main() char *p = "hello,world" return 0;解析:根據(jù)C語(yǔ)言中的特
12、性和定義p是一個(gè)局部變量,而C語(yǔ)言中局部變量存在于棧中,"hello wrold"是一個(gè)字符串字面常量,因此存儲(chǔ)于程序的只讀存儲(chǔ)區(qū)中,p在這里其實(shí)只是指向了"hello wrold"在只讀存儲(chǔ)區(qū)中的地址而已。3)關(guān)于 int a10; 問(wèn)下面哪些不可以表示 a1 的地址?(A) A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)A. a+sizeof(int)解析:A. a+sizeof(int) / 不正確, 在32位機(jī)器上相當(dāng)于指針運(yùn)算
13、a + 4B. &a0+1 / 正確,數(shù)組首元素地址加1,根據(jù)指針運(yùn)算就是a1的地址C. (int*)&a+1 / 正確,數(shù)組地址被強(qiáng)制類型轉(zhuǎn)換為int*,然后加1,這樣和B表示的一個(gè)意思D. (int*)(char*)&a+sizeof(int)/ 正確,數(shù)據(jù)地址先被轉(zhuǎn)換為char*,然后加4,根據(jù)指針運(yùn)算公式,向前移動(dòng)4 * sizeof(char),之后被轉(zhuǎn)換為int*,顯然是a1的地址 4)int main()long long a=1;long long b=2;long long c=3;printf("%d,%d,%d",a,b ,c)
14、;return 0;輸出結(jié)果是什么?(32位環(huán)境,cpu為小端模式,所有參數(shù)用棧傳遞)解答:在32和64上面, long long都是8字節(jié),printf("%d %d %dn", a, b, c);會(huì)依次從a的地址開(kāi)始輸出3個(gè)整型數(shù)據(jù)(4B)一共是12B,調(diào)用printf時(shí)參數(shù)從右至左壓棧,壓棧順序是c,b,a且地址是連續(xù)存放的,小端情況下從a開(kāi)始的棧去內(nèi)存內(nèi)容如下:0x 01 00 00 00 00 00 00 00 0x 02 00 00 00 00 00 00 00 0x 03 00 00 00 00 00 00 00所以連續(xù)輸出12個(gè)字節(jié)的結(jié)果就是:1 0 25)
15、下面哪些說(shuō)法正確?(B) A. 數(shù)組和鏈表都可以隨機(jī)訪問(wèn) B. 數(shù)組的插入和刪除可以 O(1) C. 哈希表沒(méi)有辦法做范圍檢查 D. 以上說(shuō)法都不正確解析:數(shù)組可以直接通過(guò)下標(biāo)得到存儲(chǔ)的值 因此支持隨機(jī),訪問(wèn)鏈表是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí)無(wú)法支持隨機(jī)訪問(wèn),要訪問(wèn)一個(gè)指定位置的元素必須從頭開(kāi)始做指針移動(dòng)。哈希表支持直接通過(guò)關(guān)鍵碼得到值 其實(shí)數(shù)組就是一種哈希表 下標(biāo)就是關(guān)鍵碼 通過(guò)下標(biāo)直接得到值 因此哈希表肯定需要做范圍檢查也有辦法做范圍檢查的unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式處理器上變量b=/ 答
16、案:0 / unsigned int a= 0x1234; 其中int是4字節(jié), 大端存儲(chǔ) ,補(bǔ)齊16進(jìn)制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲(chǔ), 所以上述int a變量的最低地址存儲(chǔ)的是 / 十六進(jìn)制表示中最左邊的1字節(jié), 為0x00. 8)如下關(guān)于編譯鏈接的說(shuō)法錯(cuò)誤的是()A) 編譯優(yōu)化會(huì)使得編譯速度變慢B) 預(yù)編譯頭文件可以優(yōu)化程序的性能C) 靜態(tài)鏈接會(huì)使得可執(zhí)行文件偏大D) 動(dòng)態(tài)鏈接庫(kù)會(huì)使進(jìn)程啟動(dòng)速度偏慢9)如下關(guān)于鏈接的說(shuō)法錯(cuò)誤的是()A)一個(gè)靜態(tài)庫(kù)中不能包含兩個(gè)同名全局函數(shù)的定義B)
17、一個(gè)動(dòng)態(tài)庫(kù)中不能包含兩個(gè)同名全局函數(shù)的定義C)如果兩個(gè)靜態(tài)庫(kù)都包含一個(gè)同名全局函數(shù),他們不能同時(shí)被鏈接D)如果兩個(gè)動(dòng)態(tài)庫(kù)都包含一個(gè)同名全局函數(shù),他們不能同時(shí)被鏈接4.在一個(gè)cpp文件里面,定義了一個(gè)static類型的全局變量,下面一個(gè)正確的描述是:A.只能在該cpp所在的編譯模塊中使用該變量B.該變量的值是不可改變的C.該變量不能在類的成員函數(shù)中引用D.這種變量只能是基本類型(如int,char)不能是C+類型Static全局變量和普通全局變量:針對(duì):一個(gè)工程里有多個(gè)cpp文件時(shí)相同點(diǎn):存儲(chǔ)方式相同,都是靜態(tài)存儲(chǔ);不同點(diǎn):作用域不同。普通全局變量-作用域是整個(gè)源程序(含有多個(gè)源文件),在各個(gè)源
18、文件中都有效Static全局變量-作用域是當(dāng)前源文件5.觀察下面一段代碼:class ClassApublic:virtual ClassA();virtual void FunctionA();class ClassBpublic: virtual void FunctionB();class ClassC : public ClassA,public ClassBpublic:; ClassC aObject;ClassA* pA=&aObject;ClassB* pB=&aObject;ClassC* pC=&aObject;關(guān)于pA,pB,pC的取值,下面的描述
19、中正確的是:A.pA,pB,pC的取值相同. B.pC=pA+pBC.pA和pB不相同 D.pC不等于pA也不等于pB6.參照1.5的代碼,假設(shè)定義了ClassA* pA2,下面正確的代碼是:A.pA2=static_cast<ClassA*>(pB);B.void* pVoid=static_cast<void*>(pB); pA2=static_cast<ClassA*>(pVoid);C.pA2=pB;D.pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB);7.參照1.5的代碼,下
20、面那一個(gè)語(yǔ)句是不安全的: A.delete pA B.delete pB C.delete pC刪除那個(gè)都有錯(cuò)誤,編譯是無(wú)錯(cuò)誤,運(yùn)行是有錯(cuò)誤1 linux下調(diào)試core的命令,察看堆棧狀態(tài)命令5 a34哪個(gè)不能表示 a11: *(&a00+5) *(*(a+1)+1) *(&a1+1) *(&a00+4)答案: *(&a1+1)a是數(shù)組的首地址,a1就表示a10地址了,不用再取地址了。6 fun(exp1,exp2),(exp3,exp4,exp5)有幾個(gè)實(shí)參?答案:兩個(gè)。形式參數(shù):在聲明和定義函數(shù)時(shí),寫(xiě)在函數(shù)名后的括號(hào)中的參數(shù)。實(shí)參是調(diào)用參數(shù)中的變量,行參是被
21、調(diào)用函數(shù)中的變量。10. *p=NULL *p=new char100 sizeof(p)各為多少?答案:都為4。因?yàn)槎际侵羔橆愋停即鎯?chǔ)空間必然為4。/百度/5.下面結(jié)構(gòu)體 struct s1 char ch, *ptr; union short a, b; unsigned int c:2, d:1; struct s1 *next; ; 的大小是_: A. 12字節(jié) B.16字節(jié) C.20字節(jié) D. 24字節(jié)9.使用malloc系統(tǒng)調(diào)用分配的內(nèi)存是在_ 上分配的? A 棧; B bss; C 物理內(nèi)存; D 堆 1.(5分)下面這段代碼是把中英文混合字符串(漢字用兩個(gè)字節(jié)表示,特點(diǎn)是第
22、一個(gè)字節(jié)的最高位為1)中的大寫(xiě)字母轉(zhuǎn)化為小寫(xiě)字母,請(qǐng)找出其中的bug,注意各種異常情況。 for (char *piterator = szWord; *piterator != 0; piterator+) if (*piterator & 0x80 != 0) piterator+; else if (*piterator >= 'A' && *piterator <= 'Z') piterator += 32; 3. 代碼void func()static int val;中,變量 val 的內(nèi)存地址位于:A. 已初始化
23、數(shù)據(jù)段 B.未初始化數(shù)據(jù)段 C.堆 D.棧6. short a100,sizeof(a) 返回?A. 2 B. 4 C. 100 D. 200 E. 4008. 以下代碼打印的結(jié)果是(假設(shè)運(yùn)行在 i386 系列計(jì)算機(jī)上):struct st_tint status;short *pdata;char errstr32;st_t st16;char *p = (char *)( st2.errstr + 32 );printf( "%d", ( p - (char *)(st) ) );A. 32 B. 114 C. 120 D. 1112不定向選擇3.以下的C程序代碼片段運(yùn)
24、行后C和d的值分別是多少()Int a =1,b =2;Int c,d;C =(a&b)&&a;d =(a&&b)&a;A.0,0B.0,1C.1,0D.1,17. 內(nèi)存的速度遠(yuǎn)遠(yuǎn)高于磁盤速度,所以為了解決這個(gè)矛盾,可以采用:A 并行技術(shù) B 虛存技術(shù) C 緩沖技術(shù) D 通道技術(shù)3. 代碼void func()static int val;中,變量 val 的內(nèi)存地址位于:A. 已初始化數(shù)據(jù)段 B.未初始化數(shù)據(jù)段 C.堆 D.棧1. (5 分)重復(fù)多次 fclose 一個(gè)打開(kāi)過(guò)一次的 FILE *fp 指針會(huì)有什么結(jié)果,并請(qǐng)解釋。考察點(diǎn):導(dǎo)致文件
25、描述符結(jié)構(gòu)中指針指向的內(nèi)存被重復(fù)釋放,進(jìn)而導(dǎo)致一些不可預(yù)期的異常。3)unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式處理器上變量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字節(jié), 大端存儲(chǔ) ,補(bǔ)齊16進(jìn)制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲(chǔ), 所以上述int a變量的最低地址存儲(chǔ)的是 / 十六進(jìn)制表示中最左邊的1字節(jié), 為0x00. /華為/華為/華為/2.
26、某32位系統(tǒng)下, C+程序,請(qǐng)計(jì)算sizeof 的值(5分).char str = “”char *p = str ;int n = 10;請(qǐng)計(jì)算sizeof (str ) = ?(1)sizeof ( p ) = ?(2)sizeof ( n ) = ?(3)void Foo ( char str100)請(qǐng)計(jì)算sizeof( str ) = ?(4)void *p = malloc( 100 );請(qǐng)計(jì)算sizeof ( p ) = ?(5)答:(1)17 (2)4 (3) 4 (4)4 (5)413.C+中什么數(shù)據(jù)分配在?;蚨阎?,New分配數(shù)據(jù)是在近堆還是遠(yuǎn)堆中?答:棧: 存放局部變量,函數(shù)
27、調(diào)用參數(shù),函數(shù)返回值,函數(shù)返回地址。由系統(tǒng)管理堆: 程序運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng),new 和malloc申請(qǐng)的內(nèi)存就在堆上近堆還是遠(yuǎn)堆不是很清楚。19 關(guān)于內(nèi)存對(duì)齊的問(wèn)題以及sizof()的輸出答:編譯器自動(dòng)對(duì)齊的原因:為了提高程序的性能,數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。原因在于,為了訪問(wèn)未對(duì)齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問(wèn);然而,對(duì)齊的內(nèi)存訪問(wèn)僅需要一次訪問(wèn)。1.static有什么用途?(請(qǐng)至少說(shuō)明兩種) 1)在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。 2) 在模塊內(nèi)(但在函數(shù)體外),
28、一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是一個(gè)本地的全局變量。 3) 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用2.引用與指針有什么區(qū)別? 1) 引用必須被初始化,指針不必。 2) 引用初始化以后不能被改變,指針可以改變所指的對(duì)象。 3) 不存在指向空值的引用,但是存在指向空值的指針。4.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)
29、別?全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧。6.堆棧溢出一般是由什么原因?qū)е碌??沒(méi)有回收垃圾資源。7.什么函數(shù)不能聲明為虛函數(shù)?constructor函數(shù)不能聲明為虛函數(shù)。15、如下定義,則s在內(nèi)存中占多大空間?union struct unsigned char aa:4; unsigned&
30、#160;char ab:4; a; unsigned char c; unsigned char d; s;A) 1 byte B) 2byte C) 3byte D) 4byteA16、如下定義: union tagAAAA struct
31、0; char ucFirst; short usSecond; char ucThird; half_a; long lI;number;在按1字節(jié)對(duì)齊情況下,sizeof(union tagAAAA)的大小是: A 在
32、按4字節(jié)對(duì)齊情況下,sizeof(union tagAAAA)的大小是: D A) 4byte B) 6byte C) 8byte D) 12byte17、0x12345678在采用BigEndian中內(nèi)存的排列順序是 A ,在采用LittleEndian內(nèi)存中的排列順序是 C 。(答案從左到右內(nèi)存地址依次增加)A) 12 34 56 78 B) 34 12 78 56 C) 78 56 34 12 D) 56 78 12 3418、關(guān)于靜態(tài)變量,下面說(shuō)法“不正確”的有: A A) 靜態(tài)變量在堆棧中分配B) 靜態(tài)變量的作用域一定是局部的,例如在一個(gè)文件內(nèi)或一個(gè)函數(shù)內(nèi)C) 靜態(tài)變量可分為靜態(tài)局變
33、量和靜態(tài)全局部變量D) 靜態(tài)變量存在于數(shù)據(jù)段中20、設(shè)有如下定義:int (*ptr)();則以下敘述中正確的是: C A) ptr 是指向一維數(shù)組的指針變量B) ptr是指向int型數(shù)據(jù)的指針變量C) ptr 是指向函數(shù)的指針,該函數(shù)返回一個(gè)int型數(shù)據(jù)D) ptr是一個(gè)函數(shù)名,該函數(shù)的返回值是指向int型數(shù)據(jù)的指針21、在Windows95環(huán)境下,定義數(shù)組:int *a24;則數(shù)組a所占用的內(nèi)存單元為: D A)8字節(jié) B) 32字節(jié) C) 64字節(jié) D)不確定. 關(guān)鍵字static的作用是什么?這個(gè)簡(jiǎn)單的問(wèn)題很少有人能回答完全。在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的作用:1)在函數(shù)體
34、,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。2) 在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是一個(gè)本地的全局變量。3) 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。Const 7關(guān)鍵字const有什么含意?我只要一聽(tīng)到被面試者說(shuō):"const意味著常數(shù)",我就知
35、道我正在和一個(gè)業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒(méi)有讀到那篇文章,只要能說(shuō)出const意味著"只讀"就可以了。盡管這個(gè)答案不是完全的答案,但我接受它作為一個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個(gè)問(wèn)題,我將問(wèn)他一個(gè)附加的問(wèn)題:下面的聲明都是什么意思?const int a;int const a;const int *a;int * c
36、onst a;int const * a const;/*/前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問(wèn)題,那么他就給我留下了一個(gè)好印象。順帶提一句,也許你可能會(huì)問(wèn),即使不用關(guān)鍵字 const,也還是能很容易寫(xiě)出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理
37、由:1) 關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的垃圾讓別人來(lái)清理的。)2) 通過(guò)給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。3) 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)。1、局部變量能否和全局變量重名? 答:能,局部會(huì)屏蔽全局。要用全局變量,需要使用":"局部
38、變量可以與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)可以定義多個(gè)同名的局部變量,比如在兩個(gè)循環(huán)體內(nèi)都定義一個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內(nèi)。2、如何引用一個(gè)已經(jīng)定義過(guò)的全局變量? 答:extern 可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫(xiě)錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)。3、全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?
39、為什么? 答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量。 可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)。4、隊(duì)列和棧有什么區(qū)別? 隊(duì)列先進(jìn)先出,棧后進(jìn)先出2Heap與stack的差別。Heap是堆,stack是棧。Stack的空間由操作系統(tǒng)自動(dòng)分配/釋放,Heap上的空間手動(dòng)分配/釋放。Stack空間有限,Heap是很大的自由存儲(chǔ)區(qū)C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C+中對(duì)應(yīng)的是new操作符。程序在編譯期對(duì)變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,且程序運(yùn)行過(guò)程中函數(shù)調(diào)用時(shí)參數(shù)的傳遞也在棧上進(jìn)行什么是預(yù)編譯何時(shí)需要預(yù)編
40、譯:、總是使用不經(jīng)常改動(dòng)的大型代碼體。 、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。char * const p;char const * pconst char *p上述三個(gè)有什么區(qū)別?char * const p; /常量指針,p的值不可以修改char const * p;/指向常量的指針,指向的常量值不可以改const char *p; /和char const *pchar str1 = "abc"char str2 = "abc"const char str3 =
41、 "abc"const char str4 = "abc"const char *str5 = "abc"const char *str6 = "abc"char *str7 = "abc"char *str8 = "abc"cout << ( str1 = str2 ) << endl;cout << ( str3 = str4 ) << endl;cout << ( str5 = str6 ) <<
42、endl;cout << ( str7 = str8 ) << endl;結(jié)果是:0 0 1 1解答:str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。12. 以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎?C易void UpperCase( char str ) / 將 str 中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母 for( size_t i=0; i<sizeof(str)/sizeof(str0); +i ) if( 'a'<=stri &&
43、stri<='z' ) stri -= ('a'-'A' );char str = "aBcDe"cout << "str字符長(zhǎng)度為: " << sizeof(str)/sizeof(str0) << endl;UpperCase( str );cout << str << endl;答:函數(shù)內(nèi)的sizeof有問(wèn)題。根據(jù)語(yǔ)法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,
44、因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒(méi)有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個(gè)字節(jié)了。main()int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1);輸出:2,5*(a+1)就是a1,*(ptr-1)就是a4,執(zhí)行結(jié)果是2,5&a+1不是首地址
45、+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)int *ptr=(int *)(&a+1); 則ptr實(shí)際是&(a5),也就是a+5原因如下:&a是數(shù)組指針,其類型為 int (*)5;而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同a是長(zhǎng)度為5的int數(shù)組指針,所以要加 5*sizeof(int)所以ptr實(shí)際是a5但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)所以prt-1只會(huì)減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a0的地址,&a
46、是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a1,&a+1是下一個(gè)對(duì)象的地址,即a5.1.請(qǐng)問(wèn)以下代碼有什么問(wèn)題:int main()char a;char *str=&a;strcpy(str,"hello");printf(str);return 0;沒(méi)有為str分配內(nèi)存空間,將會(huì)發(fā)生異常問(wèn)題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫(xiě)而導(dǎo)致程序崩潰。char* s="AAA"printf("%s",s);s0='B'printf("
47、%s",s);有什么錯(cuò)?"AAA"是字符串常量。s是指針,指向這個(gè)字符串常量,所以聲明s的時(shí)候就有問(wèn)題。cosnt char* s="AAA"然后又因?yàn)槭浅A浚詫?duì)是s0的賦值操作是不合法的。1.有以下表達(dá)式:int a=248; b=4;int const c=21;const int *d=&a;int *const e=&b;int const *f const =&a;請(qǐng)問(wèn)下列表達(dá)式哪些會(huì)被編譯器禁止?為什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 這是個(gè)什
48、么東東,禁止*d 說(shuō)了是const, 禁止e = &a 說(shuō)了是const 禁止const *f const =&a; 禁止2.交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5,交換之后a=5,b=3;有兩種解法, 一種用算術(shù)算法, 一種用(異或)a = a + b;b = a - b;a = a - b; ora = ab;/ 只能對(duì)int,char.b = ab;a = ab;ora = b = a;3.c和c+中的struct有什么不同?c和c+中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而c+中的struct可以。c+中struct和class的主
49、要區(qū)別在于默認(rèn)的存取權(quán)限不同,struct默認(rèn)為public,而class默認(rèn)為private4.i nclude <stdio.h>i nclude <stdlib.h>void getmemory(char *p) p=(char *) malloc(100); strcpy(p,"hello world");int main( ) char *str=NULL; getmemory(str); printf("%s/n",str); free(str); return 0; 程序崩潰,getmemory中的malloc 不能
50、返回動(dòng)態(tài)內(nèi)存, free()對(duì)str操作很危險(xiǎn)5.char szstr10;strcpy(szstr,"0123456789");產(chǎn)生什么結(jié)果?為什么?長(zhǎng)度不一樣,會(huì)造成非法的OS8.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?類的靜態(tài)成員每個(gè)類只有一個(gè),非靜態(tài)成員每個(gè)對(duì)象一個(gè)9.純虛函數(shù)如何定義?使用時(shí)應(yīng)注意什么?virtual void f()=0;是接口,子類必須要實(shí)現(xiàn)1:(void *)ptr 和 (*(void*)ptr的結(jié)果是否相同?其中ptr為同一個(gè)指針.(void *)ptr 和 (*(void*)ptr值是相同的2:int main() int x=3; print
51、f("%d",x); return 1; 問(wèn)函數(shù)既然不會(huì)被其它函數(shù)調(diào)用,為什么要返回1?mian中,c標(biāo)準(zhǔn)認(rèn)為0表示成功,非0表示錯(cuò)誤。具體的值是某中具體出錯(cuò)信息1,要對(duì)絕對(duì)地址0x100000賦值,我們可以用(unsigned int*)0x100000 = 1234;那么要是想讓程序跳轉(zhuǎn)到絕對(duì)地址是0x100000去執(zhí)行,應(yīng)該怎么做?*(void (*)( )0x100000 ) ( );首先要將0x100000強(qiáng)制轉(zhuǎn)換成函數(shù)指針,即:(void (*)()0x100000然后再調(diào)用它:*(void (*)()0x100000)();用typedef可以看得更直觀些:t
52、ypedef void(*)() voidFuncPtr;*(voidFuncPtr)0x100000)();unsigned short A = 10;printf("A = %un", A);char c=128; printf("c=%dn",c);輸出多少?并分析過(guò)程第一題,A 0xfffffff5,int值 為11,但輸出的是uint。所以輸出4294967285第二題,c0x10,輸出的是int,最高位為1,是負(fù)數(shù),所以它的值就是0x00的補(bǔ)碼就是128,所以輸出128。這兩道題都是在考察二進(jìn)制向int或uint轉(zhuǎn)換時(shí)的最高位處理。分析下面的
53、程序:void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=NULL; GetMemory(&str,100); strcpy(str,"hello"); free(str); if(str!=NULL) strcpy(str,"world"); printf("n str is %s",str); getchar(); 問(wèn)輸出結(jié)果是什么?希望大家能說(shuō)說(shuō)原因,先謝謝了輸出str is world。free 只是釋放的str指向的
54、內(nèi)存空間,它本身的值還是存在的.所以free之后,有一個(gè)好的習(xí)慣就是將str=NULL.此時(shí)str指向空間的內(nèi)存已被回收,如果輸出語(yǔ)句之前還存在分配空間的操作的話,這段存儲(chǔ)空間是可能被重新分配給其他變量的,盡管這段程序確實(shí)是存在大大的問(wèn)題(上面各位已經(jīng)說(shuō)得很清楚了),但是通常會(huì)打印出world來(lái)。這是因?yàn)椋M(jìn)程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫(kù)函數(shù)自己完成的。當(dāng)你malloc一塊內(nèi)存的時(shí)候,管理庫(kù)向操作系統(tǒng)申請(qǐng)一塊空間(可能會(huì)比你申請(qǐng)的大一些),然后在這塊空間中記錄一些管理信息(一般是在你申請(qǐng)的內(nèi)存前面一點(diǎn)),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時(shí)候,管理庫(kù)通常都不會(huì)將內(nèi)存還給操
55、作系統(tǒng),因此你是可以繼續(xù)訪問(wèn)這塊地址的,只不過(guò)。樓上都說(shuō)過(guò)了,最好別這么干。char a10,strlen(a)為什么等于15?運(yùn)行的結(jié)果i nclude "stdio.h"i nclude "string.h"void main()char aa10;printf("%d",strlen(aa);sizeof()和初不初始化,沒(méi)有關(guān)系;strlen()和初始化有關(guān)。char (*str)20;/*str是一個(gè)數(shù)組指針,即指向數(shù)組的指針*/char *str20;/*str是一個(gè)指針數(shù)組,其元素為指針型數(shù)據(jù)*/long a=0x801010;a+5=?0x801010用二進(jìn)制表示為:“1000 0000 0001 0000 0001 0000”,十進(jìn)制的值為
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租貨安全協(xié)議書(shū)范本
- 餐飲企業(yè)股東權(quán)益糾紛仲裁協(xié)議合同
- 車輛借用合同車輛狀態(tài)及驗(yàn)收協(xié)議
- 車輛掛靠與租賃業(yè)務(wù)風(fēng)險(xiǎn)投資及收益分配合同
- 茶園承包與茶葉深加工技術(shù)研發(fā)合同
- 科技成果轉(zhuǎn)化收益分配合同
- 高端火鍋店品牌授權(quán)及店鋪轉(zhuǎn)讓合同
- 采購(gòu)人員廉潔自律與產(chǎn)品質(zhì)量保障協(xié)議
- 綠色環(huán)保離婚協(xié)議書(shū)及生態(tài)補(bǔ)償條款
- 宮外孕手術(shù)之后的護(hù)理
- 位置隨動(dòng)系統(tǒng)的MATLAB計(jì)算及仿真畢業(yè)設(shè)計(jì)說(shuō)明書(shū)
- 腦梗死的預(yù)防和治療
- 湖南省長(zhǎng)沙市2024年中考語(yǔ)文真題試卷(含答案)
- 2023-2024學(xué)年全國(guó)初中七年級(jí)下地理人教版期末考試試卷(含答案解析)
- 污水管網(wǎng)工程竣工驗(yàn)收?qǐng)?bào)告
- 初中七年級(jí)英語(yǔ)翻譯專項(xiàng)集中訓(xùn)練100題(含答案)
- 高中英語(yǔ)必背3500單詞表
- 藥物臨床試驗(yàn)監(jiān)查員(monitor)技能培訓(xùn)資料
- 大學(xué)語(yǔ)文(濱州學(xué)院)智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東航空學(xué)院
- 三相異步電動(dòng)機(jī)檢修課件
- 甲醇制氫操作專題規(guī)程
評(píng)論
0/150
提交評(píng)論