日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C/C++面试题分享

發(fā)布時(shí)間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++面试题分享 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)鍵字

符號


意義



符號



意義



符號



意義



auto



聲明自動(dòng)變量



int



聲明整形變量



short



聲明短整型變量



long



聲明長整形變量



float



聲明單精度浮點(diǎn)型變量



double



聲明雙精度浮點(diǎn)型變量



char



聲明字符型變量



signed



聲明有符號變量



unsigned



聲明無符號變量



struct



聲明結(jié)構(gòu)體變量



union



聲明共用體變量



enum



聲明枚舉型變量



static



聲明靜態(tài)變量



if



條件語句



else



條件語句



switch



聲明開關(guān)語句



case





break





while





do





continue





register





const





volatile





typedef





extern





return





void





for





goto





sizeof





default








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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。