C/C++面试题分享
1、指針和引用的區(qū)別?
答:引用是在C++中引入的。它們之間的區(qū)別有:
(1)? ?? ? 非空區(qū)別:指針可以為空,而引用不能為空
(2)? ?? ? 可修改區(qū)別:如果指針不是常指針,那么就可以修改指向,而引用不能
(3)? ?? ? 初始化區(qū)別:指針在定義時(shí)可以不用初始化,而引用在定義的同時(shí)必須初始化
2、為什么構(gòu)造函數(shù)不能聲明為虛函數(shù)?
答:因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,虛調(diào)用是指允許在只知道部分信息的情況下的工作機(jī)制,特別允許我們調(diào)用一個(gè)只知道接口而不知道其對象的準(zhǔn)確類型的函數(shù)。但是如果我們要調(diào)用構(gòu)造函數(shù)創(chuàng)建對象時(shí),必須要知道對象的準(zhǔn)確類型,因此構(gòu)造函數(shù)不能為虛函數(shù)。
3、char str1[]=”abc”; char str2[] = “abc”;? ?str1==str2為FALSE,因?yàn)閟tr1和str2是位于堆棧上的,它們占用不同的內(nèi)存空間。Const char str3[] = “abc”; const char str4[] = “abc”;str3==str4為FALSE,同樣它們是位于堆棧上的內(nèi)存空間,是不同的。Const char *str5=”abc”, const char *str6=”abc”;char *str7=”abc”,char *str8 = “abc”,str5==str6 str7==str8為TRUE,因?yàn)椤盿bc”是位于文字常量區(qū)的,系統(tǒng)會(huì)將幾個(gè)“abc”進(jìn)行優(yōu)化,使它們位于同一塊內(nèi)存區(qū),因此指針的指向也就相同了。
4、以下函數(shù)能求出數(shù)組的長度嗎?
void fun(char str[])
{
? ?? ? int len = sizeof(str)/sizeof(str[0]);
}
答:不能,數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),數(shù)組名被退化為指針,因此函數(shù)中的sizeof(str)實(shí)際是在求一個(gè)指針的sizeof,答案為4,因此不能計(jì)算出數(shù)組的長度。
5、一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位?
答:指針是多少位只要看地址總線的位數(shù)就行了,80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個(gè)字節(jié)。即有void *p; 則sizeof(p) = 4。
6、C和C++中的struct和class有什么不同?
答:C和C++中struct的區(qū)別是C中的struct不能有成員函數(shù),而C++中的struct可以。C++中struct和class的主要區(qū)別是默認(rèn)的存取權(quán)限,struct的默認(rèn)存取權(quán)限為public,而class的默認(rèn)存取權(quán)限為private。
7、類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?
答:類的靜態(tài)成員每個(gè)類只有一個(gè),靜態(tài)成員為所有類的實(shí)例對象共享,靜態(tài)成員有靜態(tài)成員變量和靜態(tài)成員函數(shù),靜態(tài)成員變量使用前必須初始化,靜態(tài)成員變量可以被靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)訪問,而靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量,因?yàn)殪o態(tài)成員函數(shù)屬于類,其沒有this指針。非靜態(tài)成員每個(gè)對象都有一個(gè)。
8、純虛函數(shù)的定義?
答:virtual void fun()=0;含有純虛函數(shù)的類為抽象類,抽象類不能實(shí)例化對象,但是可以定義指針,純虛函數(shù)是接口,由子類實(shí)現(xiàn)。
9、請講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用?
答:析構(gòu)函數(shù)是用于在撤銷對象時(shí)完成對對象的清理工作,比如在創(chuàng)建對象時(shí),如果在構(gòu)造函數(shù)中動(dòng)態(tài)申請了內(nèi)存,那么在對象釋放時(shí),應(yīng)該在析構(gòu)函數(shù)中對動(dòng)態(tài)申請的內(nèi)存進(jìn)行釋放,避免造成內(nèi)存泄露,如果在這個(gè)時(shí)候還不釋放就沒有機(jī)會(huì)釋放內(nèi)存了,會(huì)造成內(nèi)存泄露,總之需要在釋放對象之前完成的工作都可以放在析構(gòu)函數(shù)中完成,析構(gòu)函數(shù)不需要用戶顯示調(diào)用,它會(huì)在釋放對象前由系統(tǒng)自動(dòng)調(diào)用。虛函數(shù)是實(shí)現(xiàn)多態(tài)性的方式,虛函數(shù)在子類中被重寫,因此可以通過基類指針調(diào)用不同子類的虛函數(shù),實(shí)現(xiàn)一個(gè)接口,多種實(shí)現(xiàn)。正是因?yàn)槎鄳B(tài)性的存在,為了使子類的析構(gòu)函數(shù)隨時(shí)都能夠執(zhí)行,基類的析構(gòu)函數(shù)一般都聲明為虛析構(gòu)函數(shù)。
10、全局變量和局部變量有什么區(qū)別?是怎么實(shí)現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道的?
答:區(qū)別在于它們的作用域不同,全局變量可以在整個(gè)程序被使用,局部變量只能在子程序或函數(shù)中使用,函數(shù)執(zhí)行完后,局部變量的也被銷毀了。操作系統(tǒng)和編譯器可能是通過它們所分配的內(nèi)存區(qū)來知道的,全局變量被放在全局?jǐn)?shù)據(jù)區(qū),而局部變量放在堆棧中。
11、若類A和類B沒有繼承關(guān)系,對于函數(shù)void func(A&),請至少用兩種不同方法說明如何才能傳遞一個(gè)非常量的B類對象非func函數(shù)。
答:可在A類中定義一個(gè)構(gòu)造函數(shù) A(const B&)
? ?? ? 或在B類中定義一個(gè)自動(dòng)轉(zhuǎn)換函數(shù):operator A() const
12、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?
答:static全局變量與普通的全局變量的區(qū)別:前者在主函數(shù)之前就要被初始化,而后者沒有要求,兩者的作用域不同,前者的作用域只限于子模塊(子程序或函數(shù)),而后者在整個(gè)程序中都可以被使用。
? ?? ? static局部變量和普通局部變量的區(qū)別:一個(gè)函數(shù)中的static變量值會(huì)保留到該函數(shù)下次調(diào)用來改變它,而后者在函數(shù)運(yùn)行完后就被銷毀了,兩者的存儲(chǔ)區(qū)域不同,前者存儲(chǔ)在靜態(tài)區(qū)(全局區(qū)),后者的內(nèi)存位于堆棧上。
? ?? ? static函數(shù)與普通函數(shù):static函數(shù)可以直接通過類調(diào)用,不需要在此之前實(shí)例化對象,而普通函數(shù)需要先定義對象。static函數(shù)不能用非static成員。static在循環(huán)中定義并賦值時(shí),定義過程只進(jìn)行一次,而不是每個(gè)循環(huán)1次。
13、寫程序,從鍵盤上輸入一系列整數(shù),以輸入-1為結(jié)束,將輸入的數(shù)據(jù)保存到文件data.txt中。
答:C語言實(shí)現(xiàn):
#include <stdio.h>
int main()
{
? ?? ? FILE *fp;
? ?? ? if ((fp=fopen("data.txt","wb")) == NULL)
? ?? ? {
? ?? ?? ?? ???cout<<"open error"<<endl;
? ?? ?? ?? ???exit(1);
? ?? ? }
? ?? ? int x;
? ?? ? scanf(“%d”, &x);
? ?? ? while (x!=-1)
? ?? ? {
? ?? ?? ?? ???fputc(x, fp);
? ?? ?? ?? ???cin>>x;
? ?? ? }
? ?? ? fclose(fp);
? ?? ? return 0;
}
C++實(shí)現(xiàn):
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
? ?? ? ofstream fout("data1.txt");
? ?? ? if (!fout)
? ?? ? {
? ?? ?? ?? ???exit(1);
? ?? ? }
? ?? ? int x;
? ?? ? cin>>x;
? ?? ? while (x != -1)
? ?? ? {
? ?? ?? ?? ???fout<<x<<' ';
? ?? ?? ?? ???cin>>x;
? ?? ? }
? ?? ? fout.close();
? ?? ? return 0;
}
14、寫程序,將一個(gè)字符串倒序?
答:直接在main函數(shù)中實(shí)現(xiàn)的
void main()
{
char *source = "hello";
? ?? ? char *des;
? ?? ? int len = strlen(source);
? ?? ? des = (char *)malloc(len+1);??//申請空間必須是len+1,加1是為了放結(jié)束符
? ?? ? if (!des)
? ?? ? {
? ?? ?? ?? ???exit(1);
? ?? ? }
? ?? ? char *s = &source[len-1];
? ?? ? char *d = des;
? ?? ? while (len--!=0)
? ?? ? {
? ?? ?? ?? ???*d++ = *s--;
? ?? ? }
? ?? ? *d = '\0';??//必須要
? ?? ? cout<<source<<endl;
? ?? ? cout<<des<<endl;
}
15、static的用途?
答:(1)函數(shù)體內(nèi)的靜態(tài)變量,其值在函數(shù)的調(diào)用過程中保持不變。跟局部變量的區(qū)別。
? ?(2)在函數(shù)體外定義的靜態(tài)變量,限制了它的使用范圍只在于該子模塊,該子模塊內(nèi)的函數(shù)都能訪問它,但是子模塊外不能訪問,實(shí)際就類似于是一個(gè)本地的全局變量。與一般全局變量的區(qū)別。
??(3)類的靜態(tài)成員函數(shù)。
? ?? ? 本質(zhì)上來說,static就是聲明了對象的生成期,限制了對象的作用域。
或 (1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只能被分配一次,因此其值在下次函數(shù)調(diào)用時(shí)仍維持上次的值。
? ?(2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)訪問,但不能被模塊外其他函數(shù)訪問。
? ?(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其他函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊。
? ?(4)在類中的static成員變量屬于整個(gè)類所有,對類的所有對象只有一份拷貝。
? ?(5)在類中的static成員函數(shù)屬于整個(gè)類所有,這個(gè)函數(shù)不接受this指針,因而只能訪問類的static成員變量。
16、在C++程序中調(diào)用C編譯后的函數(shù),為什么要加extern C的聲明?
答:因?yàn)镃++支持函數(shù)重載,而C不支持函數(shù)重載。函數(shù)被C++編譯后在庫中的名字與C語言的不同。假設(shè)某個(gè)函數(shù)的原型為:void foo(int x, int y);該函數(shù)被C編譯器編譯后在庫中的名字為_foo,而C++編譯器則產(chǎn)生像_foo_int_int之類的名字。C++提供了C連接交換指定符號 extern C來解決名字匹配問題。
17、float x與零值的比較,指針p與NULL的比較,布爾變量flag與TRUE的比較
答:(1)const float EPSION = 0.00001;
? ?? ?? ?? ???if (x >= -EPSION && x <= EPSION)
? ?? ? (2) if (p == NULL)
? ?? ? (3) if (flag)
18、C++中哪些函數(shù)不能被聲明為虛函數(shù)?
答:普通函數(shù)(非成員函數(shù)),構(gòu)造函數(shù),內(nèi)聯(lián)成員函數(shù)、靜態(tài)成員函數(shù)、友元函數(shù)。
(1)虛函數(shù)用于基類和派生類,普通函數(shù)所以不能
(2)構(gòu)造函數(shù)不能是因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,允許在只知道部分信息的情況的工作機(jī)制,特別允許調(diào)用只知道接口而不知道對象的準(zhǔn)確類型的方法,但是調(diào)用構(gòu)造函數(shù)即使要?jiǎng)?chuàng)建一個(gè)對象,那勢必要知道對象的準(zhǔn)確類型。
(3)內(nèi)聯(lián)成員函數(shù)的實(shí)質(zhì)是在調(diào)用的地方直接將代碼擴(kuò)展開
(4)繼承時(shí),靜態(tài)成員函數(shù)是不能被繼承的,它只屬于一個(gè)類,因?yàn)橐膊淮嬖趧?dòng)態(tài)聯(lián)編等
(5)友元函數(shù)不是類的成員函數(shù),因此也不能被繼承
19、include <filename.h>和include “filename.h”的區(qū)別?
答:<>是從標(biāo)準(zhǔn)庫路徑搜索, “”是從用戶當(dāng)前工作目錄開始,找不到,在到標(biāo)準(zhǔn)庫開始
20、void GetMemory(char **p, int num)
{??
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?
答:輸出“hello”, 注意GetMemory函數(shù)中的p參數(shù)是指向指針的指針,如果是一級指針則出現(xiàn)錯(cuò)誤,不會(huì)得到申請的地址空間。
21.void GetMemory(char *p, int num)
{??
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, "hello");
printf(str);
}
請問運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?
答:運(yùn)行出錯(cuò),注意與20中參數(shù)p的類型比較,20中是char **p,而本題是char *p。而且像這種情況還會(huì)導(dǎo)致每次都泄露一塊內(nèi)存的危險(xiǎn)。
22、char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?
答:無效的指針,輸出不確定,因?yàn)閜是函數(shù)GetMemory中申請的是一個(gè)臨時(shí)變量,函數(shù)調(diào)用完后,其空間已經(jīng)不再存在。
23.char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
請問運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?
答:輸出”hello”,因?yàn)槭欠祷貏?dòng)態(tài)申請的內(nèi)存,只要不釋放內(nèi)存,即調(diào)用free函數(shù),就可以使用該段內(nèi)存。
24.char *GetString2(void)
{
char *p = "hello world";
return p;
}
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
答:函數(shù)Test5運(yùn)行雖然不會(huì)出錯(cuò),但是函數(shù)GetString2的設(shè)計(jì)概念卻是錯(cuò)誤的。因?yàn)镚etString2內(nèi)的“hello world”是常量字符串,位于靜態(tài)存儲(chǔ)區(qū),它在程序生命期內(nèi)恒定不變。無論什么時(shí)候調(diào)用GetString2,它返回的始終是同一個(gè)“只讀”的內(nèi)存塊。如果此時(shí)還想利用strcpy往str中寫數(shù)據(jù)時(shí),將出現(xiàn)錯(cuò)誤。如strcpy(str,”hello world”)。
25、編寫strlen函數(shù)
答:
int Strlen(const char *str)
{
int len = 0;
? ?? ?? ?assert(str != NULL);
? ?? ?? ?while (*str++ != '\0')
? ?? ?? ?{
? ?? ?? ?? ?? ?? ? len++;
? ?? ?? ?}
? ?? ?? ?return len;}
非空判斷是必須進(jìn)行的操作,可以使用斷言的方式assert(str) != NULL才會(huì)繼續(xù)
26、編寫strcpy函數(shù)
答:??char *StrCopy(char *strDes, const char *strSrc)
{
? ?? ? assert((strDes != NULL) && (strSrc != NULL));??
? ?? ? char *address = strDes;
? ?? ? while ((*strDes++ = *strSrc++) != '\0')
? ?? ?? ?? ?? ? ;
? ?? ? return address;
}
首先必須判斷兩個(gè)指針是否為空,由于復(fù)制后的指針需要返回,因此需要一個(gè)指針來記錄地址的初始值,最后將復(fù)制的結(jié)果返回是為了進(jìn)行鏈?zhǔn)讲僮鳌?/span>
27、C語言的關(guān)鍵字
28、什么是定義?什么是聲明?它們的區(qū)別?
答:定義創(chuàng)建了對象并為這個(gè)對象分配了內(nèi)存,聲明沒有分配內(nèi)存。
29、最寬宏大量的關(guān)鍵字 auto
? ?? ? 最快的關(guān)鍵字 register
? ?? ? 最名不副實(shí)的關(guān)鍵字static,其作用包括,定義靜態(tài)全局變量,靜態(tài)局部變量,修飾函數(shù)限制函數(shù)的作用域?yàn)樵摵瘮?shù)所在的文件,其他文件不能訪問。
30、字符串與整數(shù)之間的轉(zhuǎn)換。
31、字符串循環(huán)右移n位。
32、棧的生長方向是向低地址擴(kuò)展,而堆是向高地址擴(kuò)展。
33、什么是“引用”?申明和使用“引用”要注意哪些問題?
答:引用就是某個(gè)目標(biāo)變量的“別名”(alias),對引用的操作與對變量直接操作效果完全相同。申明一個(gè)引用的時(shí)候,切記要對其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。不能建立數(shù)組的引用。
34、將“引用”作為函數(shù)參數(shù)有哪些特點(diǎn)?
答:(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時(shí),被調(diào)函數(shù)的形參就成為原來主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮囊粋€(gè)別名來使用,所以在被調(diào)函數(shù)中對形參變量的操作就是對其相應(yīng)的目標(biāo)對象(在主調(diào)函數(shù)中)的操作。
(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實(shí)參的副本,它是直接對實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時(shí),需要給形參分配存儲(chǔ)單元,形參變量是實(shí)參變量的副本;如果傳遞的是對象,還將調(diào)用拷貝構(gòu)造函數(shù)。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí),用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。
(3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲(chǔ)單元,且需要重復(fù)使用"*指針變量名"的形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。而引用更容易使用,更清晰。
35、在什么時(shí)候需要使用“常引用”?
答:如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應(yīng)使用常引用。常引用聲明方式:const 類型標(biāo)識符 &引用名=目標(biāo)變量名。
36、Heap和Stack的區(qū)別?
答:Heap是堆,Stack是棧。
? ?? ? 棧的空間由操作系統(tǒng)自動(dòng)分配和回收,而堆上的空間由程序員申請和釋放。
? ?? ? 棧的空間大小較小,而堆的空間較大。
? ?? ? 棧的地址空間往低地址方向生長,而堆向高地址方向生長。
? ?? ? 棧的存取效率更高。
? ?? ? 程序在編譯期間對變量和函數(shù)的內(nèi)存分配都在棧上,且程序運(yùn)行過程中對函數(shù)調(diào)用中參數(shù)的內(nèi)存分配也是在棧上。
37、宏定義,將整形變量a的第n位清零,其他位不變。
答:#define clear_bit(a,n) a=((a|(int)pow(2,n-1))!=a)?aa^(int)pow(2,n-1))
? ?? ? 首先判斷數(shù)a的第n位本身是否為零,如果為零,則與2的n-1次方或運(yùn)算后肯定不等于數(shù)a,此時(shí)就不需要清零,直接返回a即可,否則,將數(shù)a與2的n-1次方進(jìn)行異或運(yùn)算。
38、unsigned short A = 10;
? ?? ? printf(“%u\n”, ~A);
? ?? ? char ch = 128;
? ?? ? printf(“%d\n”, ch);
? ?? ? 輸出的結(jié)果是多少,并分析過程?
答:~A=4294967285,首先將A轉(zhuǎn)化為int類型,即對應(yīng)的二進(jìn)制數(shù)值為:00000000 00000000 00000000 00001010,~A=11111111 11111111 11111111 11110101,其實(shí)這種情況最高位是1,認(rèn)為是負(fù)數(shù),但是在輸出中指定以無符號數(shù)輸出,于是結(jié)果為4294967285=4294967295(四字節(jié)表示的最大數(shù))-10.
ch = 128對應(yīng)的二進(jìn)制為:10000000,在輸出中以整數(shù)形式輸出,由于最高位是1,于是就是負(fù)數(shù),10000000是該負(fù)數(shù)的補(bǔ)碼,根據(jù)求補(bǔ)碼的反步驟計(jì)算,先-1,得到01111111,在取反得10000000=128,由于本身是負(fù)數(shù),即為-128.
38、sizeof和strlen之間的區(qū)別?
答:(1)sizeof操作符的結(jié)果類型是size_t,它在頭文件中的typedef為unsigned int類型,該類型保證能容納實(shí)現(xiàn)所建立的最大對象的字節(jié)大小。
? ?? ? (2)sizeof是運(yùn)算符,strlen是函數(shù)
? ?? ? (3)sizeof可以用類型做參數(shù),strlen只能用char *做參數(shù),且必須是以’\0’結(jié)尾的。
? ?? ? (4)數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針。
? ?? ? (5)大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過了,是類型或是變量的長度。
? ?? ? (6)strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,用來計(jì)算字符串的長度,而不是類型占用內(nèi)存的大小。
? ?? ? (7)sizeof后如果是類型必須加括號,如果是變量名可以不加括號。
? ?? ? (8)當(dāng)使用了一個(gè)結(jié)構(gòu)類型或變量時(shí),sizeof返回實(shí)際的大小。
? ?? ? (9)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址。
? ?? ? (10)計(jì)算結(jié)構(gòu)變量的大小就必須討論數(shù)組對齊問題。
? ?? ? (11)sizeof操作符不能用于函數(shù)類型,不完全類型或位字段。
39、sizeof的使用場合?
答:(1)sizeof操作符的一個(gè)主要用途是與存儲(chǔ)分配和I/O系統(tǒng)那樣的例程進(jìn)行通信。
? ?? ? (2)用它可以看看某種類型的對象在內(nèi)存中所占的單元字節(jié)。
? ?? ? (3)在動(dòng)態(tài)分配一對象時(shí),可以讓系統(tǒng)知道要分配多少內(nèi)存。
? ?? ? (4)便于一些類型的擴(kuò)充。
? ?? ? (5)由于操作數(shù)的字節(jié)數(shù)在實(shí)現(xiàn)時(shí)可能出現(xiàn)變化,建議在涉及到操作數(shù)字節(jié)大小時(shí)用sizeof代替常量計(jì)算。
? ?? ? (6)如果操作數(shù)是函數(shù)中的數(shù)組形參或函數(shù)類型的形參,sizeof給出其指針的大小。
40、內(nèi)聯(lián)函數(shù)和宏的差別?
答:內(nèi)聯(lián)函數(shù)和普通函數(shù)相比可以加快程序運(yùn)行的速度,因?yàn)椴恍枰袛嗾{(diào)用,在編譯的時(shí)候內(nèi)聯(lián)函數(shù)可以直接被鑲嵌到目標(biāo)代碼中,而宏只是一個(gè)簡單的替換。內(nèi)聯(lián)函數(shù)要做參數(shù)類型檢查,這是與宏相比的優(yōu)勢。
? ?? ? Inline是指嵌入代碼,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn),而是把代碼直接寫到那里去。對于短小的代碼來說,inline可以帶來一定效率的提升,而且和C時(shí)代的宏函數(shù)相比,inline更安全可靠。可是這是以增加空間消耗為代價(jià)的。
? ?? ? Inline一般只適用于:一個(gè)函數(shù)被不斷地重復(fù)調(diào)用;函數(shù)只有簡單的幾行,且函數(shù)內(nèi)不能含有for while switch語句。
41、文件操作函數(shù)?
答:FILE *fp
? ?? ? fopen(“filename”, “rwatb+”)
? ?? ? char ch? ? ch = fgetc(fp)? ?? ???fputc(ch, fp)
? ?? ? char str[n]? ?? ?fgets(str, n, fp)? ?? ?? ?? ???fputs(str, fp)
? ?? ? fread(buffer, size, count, fp)? ?? ?? ?fwrite(buffer, size, count, fp)
? ?? ? fscanf(fp, “%c”, &ch)? ?? ?? ???fprintf(fp, “%d”, ch)
? ?? ? fclose(fp)
? ?? ? rewind(fp)
? ?? ? fseek(fp, 偏移長度,SEEK_SET/SEEK_CUR/SEEK_END)
feof(fp)
總結(jié)
以上是生活随笔為你收集整理的C/C++面试题分享的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交互两个数(不引入第三个变量)
- 下一篇: 一道题弄明白二维数组的指针