2022年度C語言面試題庫匯編含完整答案_第1頁
2022年度C語言面試題庫匯編含完整答案_第2頁
2022年度C語言面試題庫匯編含完整答案_第3頁
2022年度C語言面試題庫匯編含完整答案_第4頁
2022年度C語言面試題庫匯編含完整答案_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

2022年度C語言面試題庫匯編(含完整答案)

1、變量的聲明和定義有什么區(qū)別?

在C語言中聲明變量:變量聲明僅在編譯時(shí)向編譯器提供以給定類型和名稱存

在的變量的確定性,以便編譯器繼續(xù)進(jìn)行進(jìn)一步編譯,而不需要該變量的所有

細(xì)節(jié)。在C語言中,當(dāng)我們聲明一個(gè)變量時(shí),我們只將信息提供給編譯器,

但沒有為它保留內(nèi)存。它只是一個(gè)引用,通過它我們只向編譯器保證這個(gè)變量

可以定義在函數(shù)內(nèi)部或函數(shù)外部。注意:我們可以多次聲明一個(gè)變量,但只定

義一次。例如:externintdata;externintfoo(int,int);intfun(int,char);/

/

2、全局變量和靜態(tài)全局變量有什么區(qū)別?

全局變量和靜態(tài)全局變量有不同的聯(lián)系。這就是全局變量可以在文件外部訪問

但靜態(tài)全局變量只能在聲明它的文件內(nèi)訪問的原因。靜態(tài)全局變量===?>

內(nèi)部鏈接。非靜態(tài)全局變量===?>外部鏈接。

3、C語言中的存儲(chǔ)類是什么?

存儲(chǔ)類決定程序中變量或函數(shù)的范圍(生命周期)和范圍(可見性)。每個(gè)變量都

在內(nèi)存中的某個(gè)位置以位的形式存儲(chǔ)變量的值。存儲(chǔ)類決定這些變量值將存儲(chǔ)

在CPU寄存器、堆棧內(nèi)存、BSS或DS中的位置。C語言編程中有四種可

用的存儲(chǔ)類,它們?nèi)缦拢篴utostaticexternregister

4、內(nèi)部靜態(tài)變量和外部靜態(tài)變量的區(qū)別是什么?

在C語言中,外部靜態(tài)變量有內(nèi)部鏈接,內(nèi)部靜態(tài)變量沒有鏈接。這就是它

們具有不同范圍但兩者都將在整個(gè)程序中存活的原因。外部靜態(tài)變量===?>

內(nèi)部鏈接。內(nèi)部靜態(tài)變量===?>無。

5、typedef和宏有什么區(qū)別?

讓我們先來看一下typedef和宏的簡短描述,以了解它們之間的區(qū)別。typed

efC語言提供了一個(gè)非常重要的關(guān)鍵字typedef,用于為現(xiàn)有類型定義新名稱。

typedef是編譯器指令,主要與用戶定義的數(shù)據(jù)類型(結(jié)構(gòu)、聯(lián)合或枚舉)一起

使用,以降低它們的復(fù)變性并增加代碼的可讀性和可移植性。語法:typedef

typeNewTypeName;示例:typedefunsignedintUnsignedlnt;現(xiàn)在Unsi

gnedlnt是一個(gè)新類型,就可以施用它來創(chuàng)

6、以下C代碼的輸出是什么?

#include<stdio.h>

intmain()

typedefautointmyAutoInt;

myAutoIntdata=4;

printf("%d",data);

return0;

c

編譯器錯(cuò)誤。解釋:typedef已被視為部分存儲(chǔ)類,因此不能一次混合兩個(gè)存

儲(chǔ)類。

7、C語言中的變量是什么?

C語言中的變量定義了一個(gè)位置名稱,可以在其中放置值,并且可以在程序中

需要時(shí)使用這些值。換句話說,可以說變量是一個(gè)名稱(或標(biāo)識(shí)符),它指示內(nèi)

存中的某個(gè)物理地址,其中數(shù)據(jù)以字符串位的形式存儲(chǔ)。在C語言中,每個(gè)

變量都有特定的數(shù)據(jù)類型(預(yù)定義的或用戶定義的),這些數(shù)據(jù)類型決定了變量

的大小和內(nèi)存布局。注意:每個(gè)變量都綁定了兩個(gè)重要的屬性,范圍和范圍。

8、使用變量p寫出下一些聲明:

1、一個(gè)整數(shù)變量。

2、五個(gè)整數(shù)的數(shù)組。

3、指向整數(shù)的指針。

4、一個(gè)由十個(gè)指向整數(shù)的指針組成的數(shù)組。

5、指向整數(shù)的指針。

6、指向三個(gè)整數(shù)數(shù)組的指針。

7、一個(gè)指向函數(shù)的指針,它將指向字符的指針作為參數(shù)并返回一個(gè)整數(shù)。

8、一個(gè)由五個(gè)指針組成的數(shù)組,指向接受一個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)的函數(shù)。

變量p對應(yīng)的聲明如下:1.intp;//Aninteger2.intp[5];//Anarrayof

5integers3.int*p;//Apointertoaninteger4.int*p[10];//Anarray

of10pointerstointegers5.int**p;//Apointertoapointertoaninteg

er6.int(*p)[3];//Apointer

9、C語言有哪些數(shù)據(jù)類型?

數(shù)據(jù)類型是數(shù)據(jù)的分類,它告訴編譯器或解釋器程序員打算如何使用數(shù)據(jù)。換

句話說,您可以說它定義了變量的大?。˙YTE)和范圍。C語言中數(shù)據(jù)類型的分

類:1、預(yù)定義數(shù)據(jù)類型(int、char、float等)2、用戶定義的數(shù)據(jù)類型(struct、u

nion、enum)在C語言中,不同的數(shù)據(jù)類型有不同的范圍。范圍因編譯器而

異。在下表中,根據(jù)32位GCC編譯器列出了一些具有范圍和格式說明符

的數(shù)據(jù)類型。數(shù)據(jù)類型Memory(bytes)范圍

10、關(guān)鍵字static的用途是什么?

在C語言中,static關(guān)鍵字非常重要。如果在變量或函數(shù)中使用了static關(guān)

鍵字,那么只有內(nèi)部鏈接或無鏈接有效。1、靜態(tài)變量只初始化一次,因此在函

數(shù)體內(nèi)聲明為靜態(tài)的變量在函數(shù)調(diào)用之間保持其先前值。2、帶有static關(guān)鍵字

的全局變量具有內(nèi)部鏈接,因此只能在翻譯單元(.c)內(nèi)訪問。其他翻譯單元無

法訪問它。static關(guān)鍵字保護(hù)變量從另一個(gè)編譯單元訪問。3、默認(rèn)情況下,

在C語言中,函數(shù)的鏈接是外部的,它可以被同一個(gè)或另一個(gè)翻譯單元訪

問。在static關(guān)鍵字的幫助下,可以

11、有哪些不同類型的鏈接?

C語言有3種鏈接,外部鏈接、內(nèi)部鏈接和無鏈接。

12、靜態(tài)變量可以在頭文件中聲明嗎?

可以,我們可以在頭文件中聲明靜態(tài)變量。

13、C語言中整數(shù)的大小取決于什么?

C標(biāo)準(zhǔn)解釋了整數(shù)的最小大小應(yīng)該是16位。一些編程語言解釋說整數(shù)的大小

取決于實(shí)現(xiàn),但可移植程序不應(yīng)該依賴它。整數(shù)的大小主要取決于編譯器編寫

者為底層處理器編寫的編譯器類型??梢钥吹骄幾g器根據(jù)便利性和底層架構(gòu)愉

快地改變整數(shù)的大小。因此,建議使用C99整數(shù)數(shù)據(jù)類型(uin8_t、uin16_

t、uin32_t..)代替標(biāo)準(zhǔn)into

14、整數(shù)是看符號的還是無符號的?

在標(biāo)準(zhǔn)C語言中,整數(shù)數(shù)據(jù)類型默認(rèn)是有符號的。所以如果創(chuàng)建一個(gè)整數(shù)變

量,它可以存儲(chǔ)正值和負(fù)值。

15、C中的無符號整數(shù)和有符號整數(shù)有什么區(qū)別?

有符號和無符號整數(shù)類型具有相同的存儲(chǔ)(根據(jù)標(biāo)準(zhǔn)至少16位)和對齊方式,

但它們?nèi)匀淮嬖诤芏嗖町?,在下面的行中,描述有符號和無符號整數(shù)之間的一

些差異。有符號整數(shù)可以同時(shí)存儲(chǔ)正值和負(fù)值,但在它旁邊無符號整數(shù)只能存

儲(chǔ)正值。有符號整數(shù)類型的非負(fù)值范圍是相應(yīng)無符號整數(shù)類型的子范圍。例

如:假設(shè)整數(shù)的大小為2個(gè)字節(jié)。有符號整數(shù)-32768到+32767無符號整

數(shù)0到65535在計(jì)算無符號整數(shù)時(shí),它永遠(yuǎn)不會(huì)溢出,因?yàn)槿绻?jì)算結(jié)果大

于無符號整數(shù)類型的最大值,則它會(huì)以比結(jié)果類型可以表示的

16、宏和函數(shù)有什么區(qū)別?

宏和函數(shù)的區(qū)別如下所示:

17、以下C代碼的輸出是什么?

#include<stdio.h>

#definePRINT(var,data)do{\

if(van<data八

{\

printf("Aticleworld");\

++var;\

)\

}while(l);

intmain()

PRINT(0,2);

return0;

}

輸出:編譯器錯(cuò)誤。說明:擴(kuò)展宏時(shí),var將被替換為O(Rvalue)。因?yàn)檎?/p>

在嘗試增加Rvalue,所以將收到編譯器錯(cuò)誤。

18、C語言中的枚舉是什么?

C語言中的枚舉是用戶定義的數(shù)據(jù)類型。它由一組命名的常量整數(shù)組成。使

用enum關(guān)鍵字,我們可以通過使用枚舉標(biāo)簽(可選)和命名整數(shù)列表來聲明枚

舉類型?;旧?,我們使用枚舉來增加代碼的可讀性,并且與符號常量(宏)相

比,使用枚舉更容易調(diào)試代碼。enum最重要的屬性是它遵循范圍規(guī)則,編譯

器會(huì)自動(dòng)將值分配給它的成員常量。注意:枚舉類型的變量存儲(chǔ)由該類型定義

的枚舉列表的值之一。enum的語法如下:enumEnumeration_Tag{Enu

meration_List};E

19、關(guān)鍵字const是什么?

const限定符僅向編譯器指示無法更改限定對象的值。簡單來說,const表

示不可修改(不能在運(yùn)行時(shí)給對象賦值)。語法:constDataTypeIdentifier=

Value;e.g.constintiData=0;

20、什么時(shí)候應(yīng)該在C程序中使用const?

在程序中有以下地方需要使用const關(guān)鍵字:在引用函數(shù)參數(shù)調(diào)用中,如果

不想更改已傳入函數(shù)的實(shí)際值。intPrintData(constchar*pcMessage);在

某些地方,const比宏更好,因?yàn)閏onst由編譯器處理并且具有類型檢查。

constintciData=100;對于I/O和內(nèi)存映射寄存器,const與volatile限

定符一起使用以實(shí)現(xiàn)高效訪問。constvolatileuint32_t*DEVICE_STATUS

21、以下代碼聲明的含義是什么?

1.constinta;

2.intconsta;

3.constint*a;

4.int*consta;

5.intconst*aconst;

a是一個(gè)常數(shù)整數(shù)。與第一個(gè)類似,a是一個(gè)常數(shù)整數(shù)。這里的a是一個(gè)指向

常量整數(shù)的指針,整數(shù)的值是不可修改的,但指針是可修改的。這里的a是一

個(gè)指向整數(shù)的常量指針,指向的整數(shù)的值是可修改的,但指針是不可修改的。

這里的a是一個(gè)指向const整數(shù)的const指針,這意味著指向的整數(shù)和指針

的值都是不可修改的。

22、下面的C程序的輸出是什么?

#include<stdio.h>

intmain()

intpos=14;

floatdata=1.2;

printf("%*f"jposjdata);

return0;

上述代碼的輸出將是1.200000,有6個(gè)空格。解釋:這里1.200000是用

6個(gè)空格打印的,因?yàn)橥ㄟ^在printf中給出*可以指定一個(gè)額外的寬度參

數(shù),這里pos是寬度,data是值。如果數(shù)字小于寬度,則其余部分用空格填

充。

23、常量指針和指向常量的指針有什么區(qū)別?

常量指針:常量指針是其值(指向的地址)不可修改的指針。如果嘗試修改指針

值,將得到編譯器錯(cuò)誤。常量指針聲明如下:Data_Type*constPointer_N

ame;int*constptr;//constantpointertointeger當(dāng)或譯以下代碼會(huì)得至U編

譯器錯(cuò)誤時(shí),讓我們看看下面的示例代碼。#include<stdio.h>intmain(void)

{intvar1=10,var2=20;//Initia

24、后遞增和遞減運(yùn)算符是什么?

當(dāng)在操作數(shù)上使用后自增(++)運(yùn)算符時(shí),結(jié)果是操作數(shù)的值,得到結(jié)果后,

操作數(shù)的值加1o后自減(-)的工作運(yùn)算符類似于后自增運(yùn)算符,但不同之

處在于操作數(shù)的值減1o注意:遞增和遞減1是指定的類型。

25、前置增量和后置增量哪個(gè)更好?

現(xiàn)在的編譯器已經(jīng)足夠聰明了,它們根據(jù)需求優(yōu)化代碼。post和pre-increm

ent都有自己的重要性,我們需要根據(jù)要求使用它們。如果您通過字符指針逐

字節(jié)讀取閃存,那么在這里您必須使用后增量,否則將跳過數(shù)據(jù)的第一個(gè)字

節(jié)。在預(yù)遞增的情況下,指向地址將先遞增,然后再讀取該值。在下面的示例

代碼中,創(chuàng)建一個(gè)字符數(shù)組并使用想要讀取數(shù)組值的字符指針。但是如果使用

預(yù)增量運(yùn)算符會(huì)發(fā)生什么?這個(gè)問題的答案是“A”將被跳過而B將被打印出

來。#include<stdio.h>intm

26、表達(dá)式ptr++和++ptr相同嗎?

*ptr++和++*ptr兩種表達(dá)方式不同。下面通過一個(gè)示例代碼來了解這兩個(gè)表

達(dá)式之間的區(qū)別。#include<stdio.h>intmain(void){intaiData[5]={100,

200,30,40,50};int*ptr=aiData;*ptr++;printf("aiData[O]=%d,aiData[1]

=%d,*piData=%d",aiData[0],

27>表達(dá)式*++ptr和++*ptr是否相同?

這兩種表達(dá)方式不同。下面來看一個(gè)示例代碼來了解這兩個(gè)表達(dá)式之間的區(qū)

別示例1:#include<stdio.h>intmain(void){intaiData[5]={100,200,

30,40,50};int*piData=aiData;++*piData;printf("aiData[O]=%d,aiData

[1]=%d,*piData=%d",aiData[0],aiDat

28、常量和宏有什么區(qū)別?

常量和宏的主要區(qū)別如下:const關(guān)鍵字由編譯器處理,另一方面,宏由預(yù)處

理器指令處理。const是修飾標(biāo)識(shí)符行為的限定符,但宏是預(yù)處理器指令。使

用const關(guān)鍵字會(huì)進(jìn)行類型檢查,但不會(huì)對#define進(jìn)行類型檢查。const由

C塊限定,#define適用于文件。const可以作為參數(shù)(作為指針)傳遞給函

數(shù)。在通過引用調(diào)用的情況下,它可以防止修改傳遞的對象值。

29、C語言中的volatile變量是什么?

volatile關(guān)鍵字是一種類型限定符,可防止編譯器優(yōu)化對象。根據(jù)C標(biāo)準(zhǔn),

具有volatile限定類型的對象可能會(huì)以實(shí)現(xiàn)未知的方式進(jìn)行修改或具有其他未

知的副作用。也可以說,可以隨時(shí)更改volatile限定對象的值,而無需代碼執(zhí)

行任何操作。如果對象由volatile限定符限定,則編譯器每次程序訪問它時(shí)都

會(huì)從內(nèi)存中重新加載該值,這意味著它會(huì)阻止將變量緩存到寄存器中。從內(nèi)存

中讀取值是檢查值的不可預(yù)測變化的唯一方法。

30、可以創(chuàng)建volatile指針嗎?

可以,可以在C語言中創(chuàng)建一個(gè)volatile指針。示例代碼如下:int*volatil

epiData;//piDataisavolatilepointertoaninteger.

31、如何正確使用volatile關(guān)鍵字的位置?

在這里,指出了一些需要使用volatile關(guān)鍵字的重要地方。1、訪問內(nèi)存映射

的外設(shè)寄存器或硬件狀態(tài)寄存器。示例代碼:#defineCOM_STATUS_BIT0

X00000006uint32_tconstvolatile*constpStatusReg=(uint32_t*)0x0002

0000;unit32_tGetRecvData(){//Codetorecvdatawhile(((*pStatusReg)

&COM

32、C語言中的const和volatile限定符有什么區(qū)別?

const關(guān)鍵字是編譯器強(qiáng)制執(zhí)行的,它表示程序無法更改對象的值,這意味著

它使對象成為不可修改的類型。例如:constinta=0;如果嘗試修改a的

值,將收到編譯器錯(cuò)誤,因?yàn)閍使用const關(guān)鍵字限定,阻止更改整數(shù)變量的

值。另一方面,volatile阻止任何編譯器優(yōu)化,并表示對象的值可以通過超出

程序控制范圍的東西進(jìn)行更改,因此編譯器不會(huì)對對象做出任何假設(shè)。例如:

volatileinta;當(dāng)編譯器看到上述聲明時(shí),它會(huì)避免對a做出任何假設(shè),并在每

次迭代中從分配給變量的

33、C語言中的變量可以既是常量(const)又是易失(volatile)?

是的,可以同時(shí)使用常量和易失性。volatile和const關(guān)鍵字的最大用途之一

是在訪問GPIO寄存器時(shí)。在GPIO的情況下,如果它被配置為輸入,它的

值可以通過“外部因素'(如果開關(guān)或任何輸出設(shè)備連接到GPIO)來更改。在這

種情況下,volatile起著重要作用,并確保編譯器始終從GPIO地址讀取值

并避免做出任何假設(shè)。使用volatile關(guān)鍵字后,無論何時(shí)訪問端口,都將獲得

正確的值,但這里還有一個(gè)問題,因?yàn)橹羔槻皇莄onst類型,因此可能是程序

更改了指針的指

34、如何在C語言中設(shè)置、清除、切換和檢查單個(gè)位?

設(shè)置第N位設(shè)置第N位意味著如果第N位為0,則將其設(shè)置為1,如果為

1,則保持不變。在C中,按位或運(yùn)算符(|)用于設(shè)置整數(shù)數(shù)據(jù)類型的位。

據(jù)我們所知|(按位或運(yùn)算符)計(jì)算一個(gè)新的整數(shù)值,其中每個(gè)位的位置只有當(dāng)操

作數(shù)(整數(shù)類型)在該位置為1時(shí)才為1o簡而言之,如果其中任何一位為1,

則可以說兩位的“按位或”始終為1。0|0=01|0=10|1=11|1

=1設(shè)置位的算法:Number|=(1UL?

35、如何檢測兩個(gè)整數(shù)是否有相反的符號(位操作)?

讓給定的整數(shù)是a和b。如果a的符號位與b的符號位不同,則a和b的符號

位(MSB)的EX-OR將為1。換句話說,如果a和b的符號相反,a和b的

異或?qū)⑹秦?fù)數(shù)。示例代碼:boolCheckOppositeSign(inta,intb){boolb

RetValue=0;bRetValue=((aAb)<0);//trueifaandbhaveopposit

esignsreturnbRetValue;}

36、編寫一個(gè)高效的C程序來反轉(zhuǎn)數(shù)字的位?

有很多方法可以反轉(zhuǎn)數(shù)字的位,這里描述了三種通用的方法來反轉(zhuǎn)位。方法一

在此方法中,將檢查num的設(shè)置位并循環(huán)遍歷整數(shù)的所有位。如果發(fā)現(xiàn)nu

m的第i位被設(shè)置,那么只需將1放在tmp的((INT_BITS-1)-ith)

位置,其中INT_BITS是整數(shù)的位數(shù)。#defineCHAR_BITS8//sizeofch

aracter#defineINT_BITS(sizeof(int)*CHAR_BITS)//bitreversa

37、如何在C語言中以二進(jìn)制格式打印十進(jìn)制數(shù)?

參考以下代碼實(shí)現(xiàn):#defineCHAR_BITS8//sizeofcharacter#defineIN

T_BITS(sizeof(int)*CHAR_BITS)//bitsinintegervoidPrintlnBinary(unsi

gnedn){charPos=(INT_BITS-1);for(;Pos>=0;--Pos){(n&(1

?Pos)

38、下面程序的輸出是什么?

#include<stdio.h>

intmain()

intdata=16;

data=data>>1;

printf("%d\n",data);

return0;

}

上面程序的輸出是:8

39、下面程序的輸出是什么?

#include<stdio.h>

intmain()

{

intc=8八7;

printfC^dXn",c);

}

上面程序的輸出是:15

40、下面程序的輸出是什么?

#include<stdio.h>

#include<stdlib.h>

intmain()

{

void*pvBuffer=NULL;

pvBuffer=malloc(sizeof(int));

*((int*)pvBuffer)=0x00000000;

*((int*)pvBuffer)|=2;

printf("OutPut=%d",*((int*)pvBuffer))j

free(pvBuffer);

return0;

}

上面程序的輸出:2

41、編寫一個(gè)程序交換兩個(gè)數(shù)字(不使用第三個(gè)變量)?

假設(shè)a、b兩個(gè)數(shù)字,有很多方法不使用第三個(gè)變量交換兩個(gè)數(shù)字的值。方

法1(使用算術(shù)運(yùn)算符):#include<stdio.h>intmain(){inta=10,b=5;

//algotoswap'a'and'b'a=a+b;//abecomes15b=a-b;//bb

ecomes10a=a-b;//tonallya

42、寫一個(gè)程序來檢查一個(gè)整數(shù)是2的寨嗎?

下面來看看如現(xiàn)編寫一個(gè)小算法來檢查2的累。如果一個(gè)數(shù)字是2的募,則

函數(shù)返回1。示例代碼1:intCheckPowerOftwo(unsignedintx){return

((x!=0)&&(!(x&(x-1))));}示例代碼2:intCheckPowerOftwo(unsig

nedintx){return(x&&(!(x&(x-1))));}

43、以下代碼的輸出是什么?

#include<stdio.h>

intmain()

{

intx=-30;

x=x<<1;

printf("%d\n",x);

}

輸出結(jié)果:未定義的行為。

44、以下代碼的輸出是什么?

ttinclude<stdio.h>

intmain()

{

intx=-30;

x=x>>1;

,,,,

printf(%dJx);

return0;

}

實(shí)現(xiàn)定義(implementation-defined)

45、編寫一個(gè)程序來計(jì)算整數(shù)中的集合位?

請參考下面代碼實(shí)現(xiàn):unsignedintNumberSetBits(unsignedintn){unsig

nedintCountSetBits=0;while(n){CountSetBits+=n&1;n?=1;}

returnCountSetBits;}

46、在C程序中應(yīng)該什么時(shí)候使用指針?

在C程序中有下面情節(jié)應(yīng)該使用指針:傳遞大型結(jié)構(gòu)喜歡的服務(wù)器請求或響

應(yīng)數(shù)據(jù)包。實(shí)現(xiàn)鏈表和二叉樹。GPIO或硬件寄存器。從函數(shù)中獲取地址或更

新值(通過引用調(diào)用)創(chuàng)建動(dòng)態(tài)數(shù)組。使用函數(shù)指針創(chuàng)建回調(diào)函數(shù)。注意:除此

之外,還有很多地方需要用到指針。

47、C語言中的void或泛型指針是什么?

void指針是通用指針。它沒有關(guān)聯(lián)的數(shù)據(jù)類型,這就是為什么它可以存儲(chǔ)任何

類型對象的地址并類型轉(zhuǎn)換為任何類型的原因。根據(jù)C標(biāo)準(zhǔn),指向void的指

針應(yīng)具有與指向字符類型的指針相同的表示和對齊要求。void指針聲明類似

于普通指針,但不同之處在于使用void關(guān)鍵字代替數(shù)據(jù)類型。語法:void*

Pointer_Name;

48、C語言市空(或void)指針的優(yōu)點(diǎn)是什么?

C語言中的void指針有以下優(yōu)點(diǎn):使用void指針,可以創(chuàng)建一個(gè)可以接受

任何數(shù)據(jù)類型參數(shù)的通用函數(shù)。memcpy和memmove庫函數(shù)是泛型函數(shù)的

最佳示例,使用這些函數(shù)可以將數(shù)據(jù)從源復(fù)制到目標(biāo)。例如:void*memcpy

(void*dst,constvoid*src,size_tnum);void指針可以轉(zhuǎn)換為另一*

藪據(jù)類型,這就是malloc、calloc或realloc庫函數(shù)返回void*的原因。

由于void*這些函

49、什么是懸空指針?

通常,當(dāng)引用對象被刪除或釋放時(shí),會(huì)出現(xiàn)延遲指針,而不會(huì)更改指針的值。

它會(huì)產(chǎn)生問題,因?yàn)橹羔樔匀恢赶虿豢捎玫膬?nèi)存。當(dāng)用戶嘗試取消引用懸空指

針時(shí),它會(huì)顯示未定義的行為,并且可能是分段錯(cuò)誤的原因。示例代碼:#in

clude<stdio.h>#include<stdlib.h>intmain(){int*piData=NULL;//creatin

gintegerofsize10.piData=malloc(sizeo

50、什么是野指針?

在首次使用之前未正確初始化的指針稱為野指針。未初始化的指針行為是完全

未定義的,因?yàn)樗赡苤赶蚰硞€(gè)可能導(dǎo)致程序崩潰的任意位置,這就是它被稱

為野指針的原因。換句話說,編程語言中沒有被編譯器或程序員初始化的每個(gè)

指針都以野指針開始。注意:通常,編譯器會(huì)警告通配指針。語法:int*pi

Data;//piDataiswildpointer

51、C語言中NULL指針是什么?

根據(jù)C標(biāo)準(zhǔn),值為0的整數(shù)常量表達(dá)式,或轉(zhuǎn)換為void*類型的此類表達(dá)

式稱為空指針常量。如果將空指針常量轉(zhuǎn)換為指針類型,則生成的指針稱為空

指針。語法:int*piData=NULL;//piDataisanullpointer

52、什么是函數(shù)指針?

函數(shù)指針類似于其他指針,但唯一的區(qū)別是它指向函數(shù)而不是變量。換句話

說,函數(shù)指針是一種存儲(chǔ)函數(shù)地址的指針,這些指向的函數(shù)可以在程序中隨時(shí)

被函數(shù)指針調(diào)用。

53、如何在C語言中聲明指向函數(shù)的指針?

聲明函數(shù)指針的語法非常簡單。一開始似乎很難,但是一旦熟悉了函數(shù)指針,

它就會(huì)變得容易。函數(shù)指針的聲明類似于函數(shù)的聲明。這意味著函數(shù)指針還需

要返回類型、聲明名稱和參數(shù)列表。需要記住的一件事是,每當(dāng)在程序中聲明

函數(shù)指針時(shí),聲明名稱前面都有*(星號)符號并用括號括起來。例如:void(

*fpData)(in£);為了更好的理解,我們舉個(gè)例子來描述一下C語言中函數(shù)指

針的聲明。示例:void(*pfDisplayMessage)(constchar*);在上面的

54、函數(shù)指針可以在哪里使用?

有很多地方可以使用函數(shù)指針。通常,函數(shù)指針用于實(shí)現(xiàn)回調(diào)函數(shù)、有限狀態(tài)

機(jī)以及提供C語言中的多態(tài)特性等。

55、C語言中的數(shù)組和指針有什么區(qū)別?

數(shù)組和指針之間的一個(gè)重要區(qū)別是數(shù)組中元素的地址始終是固定的,不能在執(zhí)

行時(shí)修改地址,但對于指針,可以根據(jù)需要更改指針的地址。考慮下面的例

子:在下面的示例中,當(dāng)嘗試增加數(shù)組的地址時(shí),將得到編譯器錯(cuò)誤。

56、下面C語言程序的輸出是什么(假設(shè)int大小為4個(gè)字節(jié))?

#include<stdio.h>

intmain()

int(*arr)[5][4];

//Supposeintegersize4bytes

printf("*arrsize%d",sizeof(*arr));

return0;

}

輸出結(jié)果為:*arrsize80解釋:int(*arr)[5][4]是指向數(shù)組的指針。4*5的

元素總數(shù),如果整數(shù)大小為4字節(jié),則*arr的大小將為80。

57、什么是靜態(tài)內(nèi)存分配和動(dòng)態(tài)內(nèi)存分配?

根據(jù)C標(biāo)準(zhǔn),有四種存儲(chǔ)持續(xù)時(shí)間,靜態(tài)、線程(C11)、自動(dòng)和分配。存儲(chǔ)

期限決定了對象的生命周期。靜態(tài)內(nèi)存分配:靜態(tài)分配意味著,一個(gè)對象具有

外部或內(nèi)部鏈接或使用靜態(tài)存儲(chǔ)類聲明。它僅在程序啟動(dòng)之前初始化一次,其

生命周期貫穿程序的整個(gè)執(zhí)行過程。全局和靜態(tài)變量是靜態(tài)內(nèi)存分配的一個(gè)示

例。動(dòng)態(tài)內(nèi)存分配:在C語言中,有很多用于動(dòng)態(tài)分配內(nèi)存的庫函數(shù)(mall。

c、calloc或realloc,..)□動(dòng)態(tài)分配內(nèi)存的問題之一是它不會(huì)被編譯器未身破

壞,這意味著用戶有責(zé)任解除分配的內(nèi)存。當(dāng)使用內(nèi)存管

58、C語言中的內(nèi)存泄漏是什么?

內(nèi)存泄漏是一個(gè)常見且危險(xiǎn)的問題。這是一種資源泄漏。在C語言中,當(dāng)

使用內(nèi)存管理功能分配一塊內(nèi)存而忘記釋放它時(shí),就會(huì)發(fā)生內(nèi)存泄漏。示例:

intmain(){char*pBuffer=malloc(sizeof(char)*20);/*Dosomework

*/return0;/*Notfreeingtheallocatedmemory*/}注意:一旦分配了內(nèi)

存,分配的內(nèi)存在空閑之前不會(huì)分配給另一個(gè)程序或進(jìn)程。..

59、malloc和calloc有什么區(qū)別?

malloc和calloc是內(nèi)存管理函數(shù)。它們用于動(dòng)態(tài)分配內(nèi)存?;旧?,calloc

和malloc之間沒有實(shí)際區(qū)別,只是calloc分配的內(nèi)存用0初始化。在C

語言中,calloc函數(shù)將所有分配的空間位初始化為零,但malloc不初始化分

配的內(nèi)存。這兩個(gè)函數(shù)的參數(shù)數(shù)量也有所不同,malloc接受一個(gè)參數(shù),而c

alloc接受兩個(gè)。

60、realloc。函數(shù)的作用/目的是什么?

realloc()函數(shù)用于調(diào)整分配的內(nèi)存塊的大小。它有兩個(gè)參數(shù),第一個(gè)是指向先

前分配的內(nèi)存的指針,第二個(gè)是新請求的大小。realloc。函數(shù)首先釋放舊對

象,然后重新分配新指定的大小。如果新大小小于舊大小,則新分配內(nèi)存的內(nèi)

容將與先前相同,但如果新創(chuàng)建的對象中的任何字節(jié)超出舊大小,則超出大小

的值將是不確定的。語法:void*realloc(void*ptr,size_tsize);示例代

碼:#include<stdio.h>#include<stdli

61、malloc(O)的返回值是多少?

如果請求空間的大小為零,則行為將由實(shí)現(xiàn)定義。malloc的返回值可能是一

個(gè)空指針,或者它表明該大小的行為是某個(gè)非零值。標(biāo)準(zhǔn)建議不要使用指針來

訪問當(dāng)大小為零時(shí)由malloc返回的對象。

62、什么是動(dòng)態(tài)內(nèi)存碎片?

內(nèi)存管理功能保證如果內(nèi)存被分配,那么它將適當(dāng)?shù)嘏c任何具有基本對齊的對

象對齊?;緦R小于或等于沒有對齊規(guī)范的實(shí)現(xiàn)所支持的最大對齊。動(dòng)態(tài)內(nèi)

存分配的主要問題之一是碎片,基本上,碎片發(fā)生在用戶沒有有效使用內(nèi)存

時(shí)。有兩種類型的碎片,外部碎片和內(nèi)部碎片。外部碎片是由于空閑列表上可

用但程序無法使用的小空閑內(nèi)存塊(小內(nèi)存洞)造成的。有不同類型的空閑列表

分配算法可以有效地使用空閑內(nèi)存塊。為了理解外部碎片,考慮一個(gè)程序有3

個(gè)連續(xù)的內(nèi)存塊并且用戶釋放中間的內(nèi)存塊的場景。在這種情況下,如果所需

的內(nèi)存塊大于單個(gè)內(nèi)存

63、C語言中的fee()函數(shù)工作如何?

當(dāng)我們調(diào)用內(nèi)存管理函數(shù)(malloc、calloc或realloc)時(shí),這些函數(shù)會(huì)保留額外

的字節(jié)用于簿記。每當(dāng)調(diào)用free。函數(shù)并傳遞指向已分配內(nèi)存的指針時(shí),free

()函數(shù)都會(huì)獲取簿記信息并釋放分配的內(nèi)存。無論如何,如果程序更改指向已

分配地址的指針的值,則調(diào)用free。函數(shù)會(huì)給出未定義的結(jié)果。Theall

ocatedblock/+--------+---------------------.

64、如何確定分配的內(nèi)存部分的大?。?/p>

在C語言中,可以使用sizeof運(yùn)算符計(jì)算靜態(tài)數(shù)組的大小,但沒有運(yùn)算符來

計(jì)算動(dòng)態(tài)分配的內(nèi)存大小。主要有兩種方法可以在代碼的每個(gè)部分中獲取分配

的內(nèi)存大小。創(chuàng)建一個(gè)全局變量來存儲(chǔ)分配的內(nèi)存大小。攜帶已分配內(nèi)存的長

度。示例:假設(shè)需要?jiǎng)?chuàng)建一個(gè)大小為n的整數(shù)數(shù)組。所以要攜帶數(shù)組的數(shù)

組長度,需要為n+1分配內(nèi)存。int*piArray=malloc(sizeof(int)*(n+1)

);如果內(nèi)存分配成功,則分配n(數(shù)組的大小)它的0個(gè)位置。piArray[

65、以下C語言代碼的輸出是什么?

#include<stdio.h>

#include<stdlib.h>

ttdefineALLOC_MEMORY5

intmain()

{

intloop=0;

int*ptr=malloc(ALLOC_MEMORY*sizeof(int));

if(ptr==NULL)

{

perror(ufailtoallocatememory");

return-1;

}

for(loop=0;loop<ALLOC_MEMORY;++loop)

{

*(ptr+loop)=loop;

}

printf("%d",*ptr++);

printf("%d",(*ptr)++);

printf("%d",*ptr);

printf("%d",*++ptr);

printf("%d",++*ptr);

free(ptr);

return0;

}

c

上面示例代碼輸出結(jié)果是:01223解釋:第一個(gè)printf:*ptr++意味著它

將增加地址并取消引用該地址,但這里的增量是一個(gè)后增量,所以首先和之后

取消引用,所以在基地址上你得到O(ptr指向下一個(gè)位置)。第二個(gè)printf:(*pt

r)++第一次取消引用,然后增加值,所以位置值是1是增量,所以得到2(這

里的指針沒有改變)。第三個(gè)printf:*ptr表示當(dāng)指針指向該位置時(shí)取消引

用,所以得到2。第五個(gè)printf:*++ptr表示第一個(gè)指針在取消引用后遞

66、memcpy和memmove有什么區(qū)別?

這兩個(gè)副本函數(shù)都用于將n個(gè)字符從源對象復(fù)制到目標(biāo)對象,但它們有一些區(qū)

另U,如下所述。如果源指針和目標(biāo)指針指向的內(nèi)存區(qū)域重疊,則memcpy復(fù)

制函數(shù)會(huì)顯示未定義的行為。memmove函數(shù)在重疊的情況下具有定義的行

為。因此,每當(dāng)有疑問時(shí),使用memmove代替memcpy會(huì)更安全。#incl

ude<string.h>#include<stdio.h>charstr1[50]="IamgoingfromDelhi

to

67、使用C語言在不使用庫函數(shù)的情況下實(shí)現(xiàn)反轉(zhuǎn)字符串。

字符串是字符的集合,它總是以空字符結(jié)尾,這意味著每個(gè)字符串在字符串的

末尾都包含一個(gè)空字符。例子:char*pszData="aticle";在上面的示例中,

pszData是指向字符串的指針。字符串的所有字符都存儲(chǔ)在一個(gè)連續(xù)的內(nèi)存

中,并在字符串的最后一個(gè)空字符組成。見下表:character'a'tT'c'T

‘e'"Address0x000x010x020x03.

68、什么是字節(jié)序?

字節(jié)序是在內(nèi)存中存儲(chǔ)數(shù)據(jù)的字節(jié)順序,它還描述了通過數(shù)字鏈路傳輸字節(jié)的

順序。在內(nèi)存數(shù)據(jù)存儲(chǔ)中,順序取決于系統(tǒng)的字節(jié)序,如果系統(tǒng)是大字節(jié)序,

則首先存儲(chǔ)MSB字節(jié)(意味著在低地址),如果系統(tǒng)是小端序,則首先存儲(chǔ)LS

B字節(jié)(在較低的地址)。Httle-endian和big-endian系統(tǒng)的一些示例:

69、編寫一個(gè)C程序來檢查系統(tǒng)的字節(jié)順序?

下面使用C語言來編寫程序檢查系統(tǒng)的字節(jié)順序。方法一:/include<stdi

o.h>#include<stdlib.h>#include<inttypes.h>intmain(void){uint32_tu3

2RawData;uint8_t*pu8CheckData;u32RawData=0x11223344;//Assign

datapu8CheckData=(uint8_t*)

70、如何在C中將little-endian轉(zhuǎn)換為big-endian(反之亦然)?

下面下面是編寫C程序來將little-endian轉(zhuǎn)換由big-endian(反之亦然)。方

法一:#include<stdio.h>#include<stdlib.h>#include<inttypes.h>//Func

tiontochangetheendianessuint32_tChangeEndianness(uint32_tu32Val

ue){uint32_tu32Result=0;u3

71、編寫一個(gè)C程序來檢查一個(gè)數(shù)是否是素?cái)?shù)?

素?cái)?shù)是一個(gè)正的自然數(shù),它的值大于1,并且只有兩個(gè)因數(shù)1和數(shù)本身。使

用除法檢查素?cái)?shù)的算法開始步驟1->取數(shù)n步驟2T將數(shù)字n除以(2,

n-1)或(2,n/2)或(2,sqrt(n))。步驟3-如果數(shù)n可被(2,n-1)或(2,

n/2)或(2,sqrt(n))之間的任何數(shù)整除,則它不是素?cái)?shù)步驟4-如果它不能

被(2,n-1)或(2,n/2)或(2,sqrt(n))之間的任何數(shù)整除,則它是質(zhì)數(shù)最后

停止示例代碼:

72、如何在不使用sizeof運(yùn)算符的情況下在C中計(jì)算出數(shù)組的大???

方法一:#include<stdio.h>intmain(intargc,char*argv[]){intiTotalEle

merit=0;intaiData[={10,20,30,40,50,60};//Calculatenumberso

felementsusingpointerarithmaticiTotalElement=*(&aiData+1)-aiDa

73、.何在不使用sizeof運(yùn)算符的情況下在C中計(jì)算出結(jié)構(gòu)體的大小?

方法一:當(dāng)增加指針時(shí),指針會(huì)增加一塊內(nèi)存(內(nèi)存塊取決于指針數(shù)據(jù)類型),

所以這里將使用這種技術(shù)來計(jì)算sizeof結(jié)構(gòu)。首先,創(chuàng)建結(jié)構(gòu)。創(chuàng)建一個(gè)指

向結(jié)構(gòu)的指針并分配NULL指針。將指針增加到1。#include<stdio.h>#in

elude<stdlib.h>typedefstruct{charName[12];intAge;floatWeight;int

RollNumber;

74、結(jié)構(gòu)填充是什么?

在結(jié)構(gòu)或聯(lián)合的情況下,編譯器在結(jié)構(gòu)或聯(lián)合的成員之間插入一些額外的字節(jié)

用于對齊,這些額外未使用的字節(jié)稱為填充字節(jié),這種技術(shù)稱為填充。填充以

內(nèi)存為代價(jià)提高了處理器的性能。在結(jié)構(gòu)或聯(lián)合數(shù)據(jù)成員中,按照最高字節(jié)成

員的大小對齊,以防止性能損失。注意:處理器架構(gòu)要求的數(shù)據(jù)類型對齊,而

不是語言。

75、在C語言中如何將二維數(shù)組作為參數(shù)傳遞?

在C語言中,有很多方法可以將二維數(shù)組作為參數(shù)傳遞。在下面的部分中,

將描述幾種將二維數(shù)組作為參數(shù)傳遞給函數(shù)的方法。使用指針將二維數(shù)組傳遞

給c中的函數(shù)多維數(shù)組的第一個(gè)元素是另一個(gè)數(shù)組,當(dāng)傳遞一個(gè)二維數(shù)組時(shí),

它將被拆分為指向數(shù)組的指針。例如如果intaiData[3][3],是一個(gè)2D整數(shù)

數(shù)組,它將被拆分為指向3個(gè)整數(shù)數(shù)組的指針(int(*)[3])oinclude<stdio.

h>//Sizeofthecreatedarray#define

76、枚舉和宏有什么區(qū)別?

枚舉和宏的區(qū)別:與宏相比,枚舉增加工代碼的可讀性并且易于調(diào)試。枚舉的

所有元素組合在一起,宏是不可能的。示例://constantcreatedbymacro,

#defineMON0#defineTUE1#defineWED2#defineTHU3#defineF

RI4#defineSAT5#defineSUN6//constantcreatedbyenum,typedef

enumDays{Mon,Tue,

77、如何刪除沒有頭指針的鏈表中的節(jié)點(diǎn)?

通過給定的指針直接刪除節(jié)點(diǎn)沒有實(shí)際的解決方案,需要做一些技巧。通過給

定勺要?jiǎng)h除的指針將數(shù)據(jù)從下一個(gè)節(jié)點(diǎn)復(fù)制到當(dāng)前節(jié)點(diǎn)并刪除下一個(gè)節(jié)點(diǎn)。參

考示例:〃GettheAddressofthenextnodeNodePointertemp=Node

->pNextNode;//GetthedataofnextnodeNode->iData=temp->iData;//

GettheAddressofnexttonextno

78、如何在C語言中定義多行宏?

請參閱下面的示例,其中交換兩個(gè)變量的值。#include<stdio.h>#definesw

ap(x,y,T)do{Ttemp=(*x);(*x)=(*y);(*y)=temp;}while(0)intmai

n(void){inta=5;intb=9;printf("Valueofaandbbeforeswaping");

79、C語言中的遞歸是什么?

遞歸是函數(shù)調(diào)用自身的過程,直接或間接調(diào)用自身的函數(shù)稱為遞歸函數(shù)。遞歸

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論