freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c數(shù)據(jù)類型(已修改)

2025-08-16 08:52 本頁面
 

【正文】 C++ prime 的學(xué)習(xí)筆記C++數(shù)據(jù)類型變量變量的定義會(huì)引起相關(guān)內(nèi)存的分配。因?yàn)橐粋€(gè)對(duì)象只能有一個(gè)位置,所以程序中的每個(gè)對(duì)象只能被定義一次。如果在一個(gè)文件中定義的對(duì)象需要在另一個(gè)文件中被訪問,就可能會(huì)出現(xiàn)問題。在C++中,程序在使用對(duì)象之前必須先知道該對(duì)象。這對(duì)“編譯器保證對(duì)象在使用時(shí)類型正確性”是必需的。引用一個(gè)未知的對(duì)象將引起編譯錯(cuò)誤。對(duì)象聲明(declaration)的作用是使程序知道該對(duì)象的類型和名字。它由關(guān)鍵字extern以及跟在后面的對(duì)象類型以及對(duì)象的名字構(gòu)成。聲明不是定義,不會(huì)引起內(nèi)存分配。實(shí)際上,它只是說明了在程序之外的某處有這個(gè)變更的定義。雖然一個(gè)程序只能包含一個(gè)對(duì)象的一個(gè)定義,但它可以包含任意數(shù)目的對(duì)象聲明。比較好的做法,不是在每個(gè)使用對(duì)象的文件中都提供一個(gè)單獨(dú)的聲明,而是在一個(gè)頭文件中聲明這個(gè)對(duì)象,然后再在需要聲明該對(duì)象的時(shí)候包含這個(gè)頭文件。按照這種做法;如果需要修改對(duì)象的聲明,則只需要修改一次,就能維持多個(gè)使用該對(duì)象的文件中聲明的一致性。變量名變量名:即變量的標(biāo)識(shí)符(identifier),可以由字母、數(shù)字及下劃線字符組成。它必須以字母或下劃線開頭,并且區(qū)分大寫字母和小寫字母。語言本身對(duì)變量名的長度沒有限制,但是為用戶著想,它不應(yīng)該過長。C++保留了一些詞用作關(guān)鍵字。關(guān)鍵字標(biāo)識(shí)符不能再作為程序的標(biāo)識(shí)符使用。對(duì)于命名對(duì)象有許多已普遍接受的習(xí)慣,主要考慮因素是程序的可讀性。 對(duì)象名一般用小寫字母。全部大寫一般表示常量值,通常用預(yù)處理器指示符define定義。 標(biāo)識(shí)符一般使用助記的名字 即:能夠?qū)Τ绦蛑械挠梅ㄌ峁┨崾镜拿帧?對(duì)于多個(gè)詞構(gòu)成的標(biāo)識(shí)符,習(xí)慣上,一般在每個(gè)詞之間加一個(gè)下劃線,或內(nèi)嵌的每個(gè)詞第一個(gè)字母大寫。對(duì)象的定義一個(gè)簡單的對(duì)象定義由一個(gè)類型指示符后面跟一個(gè)名字構(gòu)成,以分別結(jié)束。當(dāng)同類型的多個(gè)標(biāo)識(shí)符被定義的時(shí)候,我們可以在類型指示符后面跟一個(gè)由逗號(hào)分開的標(biāo)識(shí)符列表。這個(gè)列表可跨越多行,最后以分別結(jié)束。一個(gè)簡單的定義指定了變量的類型和標(biāo)識(shí)符,它并不提供初始值。如果一個(gè)變量是在全局域(global scope)內(nèi)定義的,那么系統(tǒng)會(huì)保證給它提供初始值0。如果變量是在局部域(local scope)內(nèi)定義的,或是通過new表達(dá)式動(dòng)態(tài)分配的,則系統(tǒng)不會(huì)向它提供初始值0。這些對(duì)象被稱為未初始化的(uninitialized)。未初始化的對(duì)象不是沒有值,而是它的值是未定義的(undefined)。(與它相關(guān)聯(lián)的內(nèi)存區(qū)中含有一個(gè)隨機(jī)的位串,可能是以前使用的結(jié)果。)因?yàn)槭褂梦闯跏蓟瘜?duì)象是個(gè)常見錯(cuò)誤,而且很難發(fā)現(xiàn),所以,一般建議為每個(gè)被定義的對(duì)象提供一個(gè)初始值。(在有些情況下,這不是必須的。然而,在你能夠識(shí)別這些情況之前,為每個(gè)對(duì)象提供初始值是個(gè)安全的作法。)類機(jī)制通過所謂的缺省構(gòu)造函數(shù)提供了類對(duì)象的自動(dòng)初始化。int main() {// 未初始化的局部對(duì)象。int ival。//通過string的缺省構(gòu)造函數(shù)進(jìn)行初始化。string project。//…}ival是一個(gè)未初始化的局部變量,但project是一個(gè)已經(jīng)初始化的類對(duì)象 – 被缺省的stirng類構(gòu)造函數(shù)自動(dòng)初始化。初始的第一個(gè)值可以在對(duì)象的定義中指定。一個(gè)被聲明了初始值的對(duì)象也被稱為已經(jīng)初始化的(initialized)。C++支持兩種形式的初始化。第一種形式是使用賦值操作符的顯式語法形式。在隱式形式中,初始值被放在括號(hào)中。逗號(hào)分隔的標(biāo)識(shí)符列表同樣也能為每個(gè)對(duì)象提供顯式的初始值。在對(duì)象的定義中,當(dāng)對(duì)象的標(biāo)識(shí)符在定義中出現(xiàn)后,對(duì)象名馬上就是可見的,因此用對(duì)象初始化它自己是合法的,只是這樣做不太明智。另外,每種內(nèi)置數(shù)據(jù)類型都支持一種特殊的構(gòu)造函數(shù)語法,可將對(duì)象初始化為0。對(duì)象可以用任意復(fù)雜的表達(dá)式來初始化,包括函數(shù)的返回值。指針類型指針持有另一個(gè)對(duì)象的地址,使我們能夠間接地操作這個(gè)對(duì)象。指針的典型用法是構(gòu)建一個(gè)鏈接的數(shù)據(jù)結(jié)構(gòu),例如樹(tree)和鏈表(list),并管理在程序執(zhí)行過程中動(dòng)態(tài)分配的對(duì)象,以及作為函數(shù)參數(shù)類型,主要用來傳遞組或大型的類對(duì)象。每個(gè)指針都有一個(gè)相關(guān)的類型。不同數(shù)據(jù)類型的指針之間的區(qū)別不是在指針的表示上,也不在指針?biāo)钟械闹担ǖ刂罚┥希瑢?duì)所有類型的指針這兩方面都是相同的。不同之處在于指針?biāo)傅膶?duì)象的類型上。指針的類型可以指示編譯器怎樣解釋特定地址上內(nèi)存的內(nèi)容,以及該內(nèi)存區(qū)域應(yīng)該跨越多少內(nèi)存單元。 如果一個(gè)int型的指針尋址到1000內(nèi)存處,那么在32位機(jī)器上,跨越的地址空間是1000~1003。 如果一個(gè)double型的指針尋址到1000內(nèi)存處,那么在32位機(jī)器上,跨越的地址空間是1000~1007。我們通過在標(biāo)識(shí)符前加一個(gè)解引用操作符(*)來定義指針。在逗號(hào)分隔的標(biāo)識(shí)符列表中,每個(gè)將被用作指針的標(biāo)識(shí)符前都必須加上解引用操作符。在下面的例子中,lp是一個(gè)指向long類型對(duì)象的指針,而lp2則是一個(gè)long型的數(shù)據(jù)對(duì)象,不是指針:long *lp, lp2??赡馨l(fā)生的情況是,當(dāng)程序員后來想定義第二個(gè)字符串指針時(shí),他會(huì)錯(cuò)誤地修改定義如下://喔:ps2不是一個(gè)字符串指針string* ps, ps2當(dāng)指針持有0值時(shí),表明它沒有指向任何對(duì)象,或持有一個(gè)同類型的數(shù)據(jù)對(duì)象的地址。已知ival的定義:int ival = 1024。下面的定義以及對(duì)兩個(gè)指針pi和pi2的賦值都是合法的。//pi被初始化為“沒有指向任何對(duì)象”int *pi = 0。// pi2被初始化為ival地址int *pi2 = amp。ival。// OK: pi和pi2現(xiàn)在都指向ivalpi = pi2。// 現(xiàn)在pi2沒有指向任何對(duì)象。Pi2 = 0。指針不能持有非地址值。例如,下面的賦值將導(dǎo)致編譯錯(cuò)誤:// 錯(cuò)誤:pi被賦予int值ivalpi = ival。指針不能被初始化或賦值為其他類型對(duì)象的地址值。例如,已知如下定義:double dval。double *pd = amp。dval。那么,下列兩條語句都會(huì)引起編譯時(shí)刻錯(cuò)誤://都是編譯時(shí)刻錯(cuò)誤//無效的類型賦值:int* 231。 double*pi = pd。pi = amp。dval。不是說pi在物理上不能持有與dval相關(guān)聯(lián)內(nèi)存的地址:它能夠。但是不允許,因?yàn)?,雖然pi和pd能夠持有同樣的地址值,但對(duì)那塊內(nèi)存的存儲(chǔ)布局和內(nèi)容的解釋卻完全不同。當(dāng)然,如果我們要做的僅僅是持有地址值(可能是把一個(gè)地址同另一個(gè)地址作比較),那么指針的實(shí)際類型就不重要了。C++提供了一種特殊的指針類型來支持這種需求;空(void *)類型指針,它可以被任何數(shù)據(jù)指針類型的地址值賦值(函數(shù)指針不能賦值給它)。// ok: void* 可以持有任何指針類型的地址值。void *pv = pi。pv = pd。void*表明相關(guān)的值是個(gè)地址,但該地址的對(duì)象類型不知道。我們不能夠操作空類型指針?biāo)赶虻膶?duì)象,只能傳送該地址值或?qū)⑺c其他地址值作比較。已知一個(gè)int型指針對(duì)象pi, 當(dāng)我們寫下pi時(shí):// 計(jì)算包含在pi內(nèi)部的地址值。// 類型: int*pi。這將計(jì)算pi當(dāng)前持有的地址值。當(dāng)我們寫下amp。pi時(shí):// 計(jì)算pi的實(shí)際地址// 類型: int**amp。pi。這將計(jì)算指針對(duì)象pi被存儲(chǔ)的位置的地址。那么,怎樣訪問pi指向的對(duì)象呢?在缺省情況下,我們沒有辦法訪問pi指向的對(duì)象,以對(duì)這個(gè)對(duì)象進(jìn)行讀或?qū)懙牟僮?。為了訪問指針?biāo)赶虻膶?duì)象,我們必須解除指針的引用。C++提供了解引用操作符(*)(dereference operator)來間接地讀和寫指針?biāo)赶虻膶?duì)象。例如,已經(jīng)下列定義:int ival = 1024, ival2 = 2048。int *pi = amp。ival。下面給出了怎樣解引用pi以便間接訪問ival。// 解除pi的引用,為它所指向的對(duì)象ival// 賦予ival2的值。*pi = ival2。// 對(duì)于右邊的實(shí)例,讀取pi所指對(duì)象的值// 對(duì)于左邊的實(shí)例,則把右邊的表達(dá)式賦給對(duì)象。*pi = abs(*pi)。 // ival = abs(ival)。*pi = *pi + 1。 // ival = ival + 1。我們知道,當(dāng)取一個(gè)int型對(duì)象的地址時(shí),int *pi = amp。ival。結(jié)果是int* 即指向int的指針。當(dāng)我們?nèi)≈赶騣nt型的指針的地址時(shí):int **ppi = amp。pi。結(jié)果是int** 即指向int指針的指針。當(dāng)我們解引用ppi時(shí):int *pi2 = *ppi。我們獲得指針ppi持有的地址值 – 在本例中,即pi持有的值,而pi又是ival的地址。為了實(shí)際地訪問到ival,我們需要兩次解引用ppi.cout “The value of ival \n” “direct value: “ ival “\n” “indirect value: “ *pi “\n” ”doubly indirect value: ” **ppi endl。下面兩條賦值語句的行為截然不同,但它們都是合法的。第一條語句增加了pi指向的數(shù)據(jù)對(duì)象的值,而第二條語句增加了pi包含的地址的值。int I,j,k。int *pi = amp。I。// I 加 2*pi = *pi + 2。// 加到pi 包含的地址上pi = pi + 2。指針可以讓它的地址值增加或減少一個(gè)整數(shù)值。這類指針操作,被稱為指針的算術(shù)運(yùn)算(pointer arithmetic)。這種操作初看上去并不直觀,我們總認(rèn)為是數(shù)據(jù)對(duì)象的加法,而不是離散的十進(jìn)制數(shù)值的加法。指針加2意味著指針持有的地址值增加了該類型兩個(gè)對(duì)象的長度。例如,假設(shè)一個(gè)char是一個(gè)字節(jié),一個(gè)int是4個(gè)字節(jié),double是8個(gè)字節(jié),那么指針加2是給其持有的地址值增加還是16,完全取決于指針的類型是char, int還是double.實(shí)際上,只有指針指向數(shù)組元素時(shí),我們才能保證較好地運(yùn)用指針的算術(shù)運(yùn)算。在前面的例子中,我們不能保證三個(gè)整數(shù)變量連續(xù)存儲(chǔ)在內(nèi)存中。因此,lp+2可能,也可能不產(chǎn)生一個(gè)有效的地址,這取決于在該位置上實(shí)際存儲(chǔ)的是什么。指針?biāo)阈g(shù)運(yùn)算的典型用法是遍歷一個(gè)數(shù)組。例如:int ia[10]int *iter = amp。ia[0]int *iter_end = amp。ia[10]while (iter != iter_end) {do_something_with_value(*iter)。++iter。 // 現(xiàn)在iter指向下一個(gè)元素。}字符串類型C++提供了兩種字符串的表示:C風(fēng)格的字符串和標(biāo)準(zhǔn)C++引入的string類類型。一般我們建議使用string類,但實(shí)際上在許多程序的情形中,我們有必要理解和使用老式的C風(fēng)格字符串。C風(fēng)格字符串C風(fēng)格字符串起源于C語言,并在C++中繼續(xù)得到支持。(實(shí)際上,在標(biāo)準(zhǔn)C++之前,除了第三方字符串庫類之外,它是唯一一種被支持的字符串)字符串被存儲(chǔ)在一個(gè)字符數(shù)組中,一般通過一個(gè)char*類型的指針來操縱它。標(biāo)準(zhǔn)C庫為操作C風(fēng)格的字符串提供了一組函數(shù)。//返回字符串的長度int strlen( const char* )。//比較兩個(gè)字符串是否相等int strcmp( const char*, const char* )。//把第二個(gè)字符串拷貝到第一個(gè)字符串中char* strcpy(char*, const char*)。(標(biāo)準(zhǔn)C庫作為標(biāo)準(zhǔn)的C++的一部分被包含在其中。)為使用這些函數(shù)。我們必須包含相關(guān)的C頭文件,include cstring指向C風(fēng)格字符串的字符指針總是指向一個(gè)相關(guān)聯(lián)的字符數(shù)組。即使當(dāng)我們寫一個(gè)字符串常量時(shí),如:const char *st = “The expense of spirit\n”。系統(tǒng)在內(nèi)部也把字符串常量存儲(chǔ)在一個(gè)字符串?dāng)?shù)組中。然后,st指向該數(shù)組的第一個(gè)元素。那么,我們怎樣以字符串的形式來操作st呢?一般地,我們用指針的算術(shù)運(yùn)算來遍歷C風(fēng)格的字符串,每次指針增加1,直到到達(dá)終止空字符為止。例如:while (*st++) {…}char*類型的指針被解除引用,并且測試指向的字符是true還是false。true值是除了空字符外的任意字符。++是增加運(yùn)算符,它使指針對(duì)指向數(shù)組中的下一個(gè)字符。一般來說,當(dāng)我們使用一個(gè)指針時(shí),在解除指針的引用之前,測試它是否指向某個(gè)對(duì)象是必要的。否則,程序很可能會(huì)失敗。例如:int string_length( const char *st){int t = 0。if (st) while ( *st++ ) ++t。return t。}C風(fēng)格字符串的長度可以為0(因而被視為空串),有兩種方式:字符指針被置為0,因而它不指向任何對(duì)象?;蛘?,指針已經(jīng)被設(shè)置,但是它指向的數(shù)組只包含一個(gè)空字符。如:// pc1 不指向任何一個(gè)數(shù)組對(duì)象char *pc1 = 0。// pc2指向空字符const char *pc2 = “”。由于C風(fēng)格字符串的底層(lowlevel)特性,C或C++的初學(xué)者很容易在這上面出錯(cuò)。在下面的一系列程序中,我們羅列了一些初學(xué)者易犯的錯(cuò)誤。程序的任務(wù)很簡單:計(jì)算st的長度。不幸的是,第一個(gè)嘗試就是錯(cuò)誤的。你能看到問題所在嗎?include iostreamconst char *st = “The expense of spirit\n”。int main() {int len = 0。while ( st++) ++len。cout len “。 ” st。return 0。}程序失敗是因?yàn)閟t沒有被解除引用,即
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號(hào)-1