發(fā)布時(shí)間:2021-10-27 16:46:33來(lái)源:有考培訓(xùn)網(wǎng)綜合
溫州達(dá)內(nèi)C++開(kāi)發(fā)培訓(xùn)機(jī)構(gòu)怎么樣?作為國(guó)內(nèi)IT培訓(xùn)的實(shí)力品牌,達(dá)內(nèi)集團(tuán)的每一名員工都以"幫助每一個(gè)學(xué)員成就夢(mèng)想"為己任,也正因?yàn)檫_(dá)內(nèi)人的執(zhí)著與努力,達(dá)內(nèi)堅(jiān)持為社會(huì)輸送合格人才,為中國(guó)IT行業(yè)的發(fā)展做出了貢獻(xiàn)。達(dá)內(nèi)特色辦學(xué),開(kāi)設(shè)了豐富多樣的IT技術(shù)課程。
(一)什么是宏定義:
1.宏定義“像”函數(shù);
2.宏定義不是函數(shù),因而需要括上所有參數(shù);
3.宏定義可能產(chǎn)生副作用;
例如:
#define MIN(a,b) ((a) < (b) ? (a) : (b))
(二)void和void 指針深層探討
規(guī)則:在C語(yǔ)言中,凡是不加返回值類型限定的函數(shù),就會(huì)被編譯器作為返回整形值處理,但很多程序員卻誤認(rèn)為其為void類型。
1.任何類型的指針都可以直接賦值給void*類型的指針,無(wú)需進(jìn)行強(qiáng)制類型轉(zhuǎn)換。但是void*指針卻不可以不進(jìn)行強(qiáng)制類型轉(zhuǎn)換而直接就賦值給其他類型的指針。
2.如果函數(shù)沒(méi)有返回值,應(yīng)聲明為void類型。
3.如果函數(shù)無(wú)參數(shù),那么應(yīng)聲明其參數(shù)為void類型。在C語(yǔ)言中可以給無(wú)參數(shù)的函數(shù)傳送任意類型的參數(shù),但是在C++中不能向無(wú)參數(shù)的函數(shù)傳送任何參數(shù),錯(cuò)誤提示:function does not take 1 parameters.所以無(wú)論是C還是C++,若函數(shù)不接受任何參數(shù),應(yīng)將其聲明為void類型。
4按照ANSI(American National Standards Institute)標(biāo)準(zhǔn),不能對(duì)void指針進(jìn)行算法操作,這是因?yàn)锳NSI標(biāo)準(zhǔn)認(rèn)定:進(jìn)行算法操作的指針必須是確定知道其指向類型大小的。例如:
int *ptr;
ptr++;
ptr++的結(jié)果是使其增大sizeof(int).
但是GNU則不這么認(rèn)定,它指定void*的算法操作和char*一致。
5.如果函數(shù)的參數(shù)可以是任意類型指針,那么應(yīng)將其聲明為void*類型。
典型的如內(nèi)存操作函數(shù):
void * memcpy(void *dest, const void *src, size_t len);
void * memset(void *buffer, int c,size_t num);
這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實(shí)的體現(xiàn)了內(nèi)存操作函數(shù)的意義,因?yàn)樗僮鞯膶?duì)象僅僅是一片內(nèi)存,而無(wú)論這片內(nèi)存是什么類型!
6.void不能代表一個(gè)真實(shí)的變量,如void a;錯(cuò)誤
(三)內(nèi)存分配方式
內(nèi)存分配方式有3中:
1. 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在,例如全局變量,static變量。
2.在棧上創(chuàng)建,在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)部的局部變量的存儲(chǔ)單元都是可以在棧上創(chuàng)建的。函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放,棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
3。在堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配,程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存,動(dòng)態(tài)內(nèi)存的生存期由我們決定,使用靈活,但是容易出錯(cuò)。
(四)內(nèi)存操作注意事項(xiàng)
1、用malloc或new申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL,防止使用指針值為NULL的內(nèi)存。
2、不要忘記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值,防止將未被初始化的內(nèi)存作為右值使用。
3、避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生多1或者少1的操作。
4、動(dòng)態(tài)內(nèi)存的申請(qǐng)和釋放必須配對(duì),防止內(nèi)存泄露。
5、用free或delete釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防止產(chǎn)生"野指針"."野指針"不是NULL指針,是指向”垃圾“內(nèi)存的指針。
(五)如何判斷大小端格式
編寫(xiě)一個(gè)C函數(shù),若處理器是big_endian的,則返回0,若是little_endian的,則返回1;
int checkCPU(void){ union w{
int a;
char b;
}c;
c.a = 0x1234;
return(c.b == 0x34);