版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家居裝修合同簽訂與維權(quán)考核試卷
- 酒店賓館裝修合同新
- 南京市建筑裝飾裝修合同
- 單間出租合同
- 公司合并協(xié)議范本
- 2025年全球及中國插座式電源電涌保護(hù)器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球便攜式四合一氣體檢測儀行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國手持式熱合機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2024年度河南省國家保安員資格考試題庫練習(xí)試卷B卷附答案
- 二零二四年度智能餐飲收銀系統(tǒng)軟件租賃合同3篇
- 綜合素質(zhì)提升培訓(xùn)全面提升個(gè)人綜合素質(zhì)
- 如何克服高中生的社交恐懼癥
- 聚焦任務(wù)的學(xué)習(xí)設(shè)計(jì)作業(yè)改革新視角
- 淋巴瘤患者的護(hù)理
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(吳洪貴)任務(wù)三 APP的品牌建立與價(jià)值提供
- 電子競技范文10篇
- 食堂服務(wù)質(zhì)量控制方案與保障措施
- VI設(shè)計(jì)輔助圖形設(shè)計(jì)(2022版)
- 眼科學(xué)??己喆痤}
- 物料分類帳的應(yīng)用
- 乳房整形知情同意書
評論
0/150
提交評論