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

正文內(nèi)容

c語(yǔ)言指針教程word版(參考版)

2024-10-06 19:17本頁(yè)面
  

【正文】 指針的安全問題 看下面的例子: 例十七: c。//把這個(gè)整數(shù)的值當(dāng)作一個(gè)地址賦給指針str。//把指針ptr的值當(dāng)作一個(gè)整數(shù)取出來。 char*str。 int*ptr=amp。完 全可以。上面強(qiáng)調(diào)了a的值必須代表一個(gè)合法的地址,否則的話,在你使用ptr的時(shí)候,就會(huì)出現(xiàn)非法操作錯(cuò)誤。 嚴(yán)格說來這里的(TYPE*)和指針類型轉(zhuǎn)換中的(TYPE*)還不一樣。//TYPE是int,char或結(jié)構(gòu)類型等等類型。那么我們的目的就不能達(dá)到了嗎?不,還有辦法: unsignedinta。//我們的目的是要使指針ptr指向地址20345686(十進(jìn)制) 編譯一下吧。 ptr=20345686。//TYPE是int,char或結(jié)構(gòu)類型等等類型。那可不可以把一個(gè)整數(shù)當(dāng)作指針的值直接賦給指針呢?就象下面的語(yǔ)句: unsignedinta。所以最后的結(jié)果是:s的類型是char*,它指向的類型是char,它指向的地址就是a的首地址。結(jié)合這個(gè)例子,我們可以這樣來想象編譯器進(jìn)行轉(zhuǎn)換的過程:編譯器先構(gòu)造一個(gè)臨時(shí)指針char*temp, 然后執(zhí)行temp=(char*)amp。形參這個(gè)指針的類型是char*,它指向的類型是char。注意到了嗎?在函數(shù)調(diào)用語(yǔ)句中,實(shí)參amp。 } } 注意這是一個(gè)32位程序,故int類型占了四個(gè)字節(jié),char類型占一個(gè)字節(jié)。*(s+2)=*(s+1)。*(s+0)=c。 c=*(s+3)。a)。 inta=125,b。 一個(gè)函數(shù)如果使用了指針作為形參,那么在函數(shù)調(diào)用語(yǔ)句的實(shí)參和形參的結(jié)合過程中,也會(huì)發(fā)生指針類型的轉(zhuǎn)換。 如果有一個(gè)指針p,我們需要把它的類型和所指向的類型改為TYEP*TYPE, 那么語(yǔ)法格式是: (TYPE*)p; 這樣強(qiáng)制類型轉(zhuǎn)換的結(jié)果是一個(gè)新指針,該新指針的類型是TYPE*,它指向的類型是TYPE,它指向的地址就是原指針指向的地址。為了實(shí)現(xiàn)我們的目的,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換: p=(int*)amp。兩者不一致,直接賦值的方法是不行的。表達(dá)式amp。 不對(duì)。 在上面的例子中,假如我們想讓指針p指向?qū)崝?shù)f,應(yīng)該怎么搞?是用下面的語(yǔ)句嗎? p=amp。f。 例十四: floatf=。 指針類型轉(zhuǎn)換 當(dāng)我們初始化一個(gè)指針或給一個(gè)指針賦值時(shí),賦值號(hào)的左邊是一個(gè)指針,賦值號(hào)的右邊是一個(gè)指針表達(dá)式。在函數(shù)調(diào)用中,當(dāng)把str作為實(shí)參傳遞給形參s后,實(shí)際是把str的值傳遞給了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的存儲(chǔ)空間。 } 這個(gè)例子中的函數(shù)fun統(tǒng)計(jì)一個(gè)字符串中各個(gè)字符的ASCII碼值之和。s++。 for(inti=0。 a=fun(str)。 inta。在函數(shù)調(diào)用語(yǔ)句中,可以用指針表達(dá)式來作為實(shí)參。//通過函數(shù)指針調(diào)用函數(shù)。 pfun1=fun1。 intfun1(char*,int)。 通過指針訪問結(jié)構(gòu)成員的正確方法應(yīng)該是象例十二中使用指針ptr的方法。這也證明了指針的靈活性。 所以,在例十二中,即使*pstr訪問到了結(jié)構(gòu)對(duì)象ss的第一個(gè)成員變量a,也不能保證*(pstr+1)就一定能訪問到結(jié)構(gòu)成員b。 所有的C/C++編譯器在排列數(shù)組的單元時(shí),總是把各個(gè)數(shù)組單元存放在連續(xù)的存儲(chǔ)區(qū)里,單元和單元之間沒有空隙。//訪問了第1號(hào)單元 *(pa+2)。 通過指針pa訪問數(shù)組array的三個(gè)單元的方法是: *pa。 雖然我在我的MSVC++,但是要知道,這樣使用pstr來訪問結(jié)構(gòu)成員是不正規(guī)的,為了說明為什么不正規(guī),讓我們看看怎樣通過指針來訪問數(shù)組的各個(gè)單元: 例十二: intarray[3]={35,56,37}。//訪問了ss的成員b。 又請(qǐng)問怎樣通過指針pstr來訪問ss的三個(gè)成員變量? 答案: *pstr;//訪問了ss的成員a。 ptrb。但是它的類型和它指向的類型和ptr是不同的。ss。它的類型是MyStruct*,它指向的類型是MyStruct。ss。//聲明了結(jié)構(gòu)對(duì)象ss,并把ss的三個(gè)成員初始化為20,30和40。 intc。 例十一: structMyStruct { inta。 則在32位程序中,有: sizeof(int(*)[10])==4 sizeof(int[10])==40 sizeof(ptr)==4 實(shí)際上,sizeof(對(duì)象)測(cè)出的都是對(duì)象自身的類型的大小,而不是別的什么類型的大小。 本節(jié)中提到了函數(shù)sizeof(),那么我來問一問,sizeof(指針名稱)測(cè)出的究竟是指針自身類型的大小呢還是指針?biāo)赶虻念愋偷拇笮。看鸢甘乔罢?。在語(yǔ)句ptr=amp。array。 int(*ptr)[10]。故sizeof(array+n)測(cè)出的是指針類型的大小。 表達(dá)式array+n(其中n=0,1,2,....。 在表達(dá)式*array中,array扮演的是指針,因此這個(gè)表達(dá)式的結(jié)果就是數(shù)組第0號(hào)單元的值。 在不同的表達(dá)式中數(shù)組名array可以扮演不同的角色。聲明了一個(gè)數(shù)組TYPEarray[n],則數(shù)組名稱array就有了兩重含義:第一,它代表整個(gè)數(shù)組,它的類型是TYPE[n];第二 ,它是一個(gè)指針,該指針的類型是TYPE*,該指針指向的類型是TYPE,也就是數(shù)組單元的類型,該指針指向的內(nèi)存區(qū)就是數(shù)組第0號(hào)單元,該指針自己占有單獨(dú)的內(nèi)存區(qū),注意它和數(shù)組第0號(hào)單元占據(jù)的內(nèi)存區(qū)是不同的。等等。 *(str+1)也是一個(gè)指針,它的類型是char*,它所指向的類型是char,它指向 Hi,goodmorning.的第一個(gè)字符39。的地址。 *str也是一個(gè)指針,它的類型是char*,它所指向的類型是char,它指向的地址是字符串Hello,thisisasample!的第一個(gè)字符的地址,即39。 上例中,str是一個(gè)三單元的數(shù)組,該數(shù)組的每個(gè)單元都是一個(gè)指針,這些指針各指向一個(gè)字符串。 strcpy(s,str[2])。 strcpy(s,str[1])。 chars[80]; strcpy(s,str[0])。其它依此類推。因此*array等于0就一點(diǎn)也不奇怪了。//也可寫成:value=*(array+4)。//也可寫成:value=*(array+3)。//也可寫成:value=*array??聪吕?例八: intarray[10]={0,1,2,3,4,5,6,7,8,9},value。 數(shù)組和指針的關(guān)系 如果對(duì)聲明數(shù)組的語(yǔ)句不太明白的話,請(qǐng)參閱我前段時(shí)間貼出的文章如何理解c和c++的復(fù)雜類型聲明。a不是一個(gè)左值,因?yàn)樗€沒有占據(jù)明確的內(nèi)存。好了,當(dāng)一個(gè)指針表達(dá)式的結(jié)果指針已經(jīng)明確地具有了指針自身占據(jù)的內(nèi)存的話,這個(gè)指針表達(dá)式就是一個(gè)左值,否則就不是一個(gè)左值。//*(parr+1)是指針表達(dá)式 str=*(parr+2)。 str=*parr。 char**parr=arr。//這也是指針表達(dá)式。 pa=array。//*ptr和amp。 *ptr=amp。//amp。 int**ptr=amp。//amp。 pa=amp。 intarray[10]。 指針表達(dá)式 一個(gè)表達(dá)式的最后結(jié)果如果是一個(gè)指針,那么這個(gè)表達(dá)式就叫指針表式。 **ptr=34。b的結(jié)果也是個(gè)指針,且這兩個(gè)指針的類型和所指向的類型是一樣的,所以用amp。b。該指針?biāo)赶虻牡刂肪褪侵羔榩自己的地址。p的結(jié)果是個(gè)指針,該指針的類型是p的類型加個(gè)*,在這里是int **。p。//*p的結(jié)果,在這里它的類型是int,它所占用的地址是p所指向的地址,顯然,*p就是變量a。a的結(jié)果是一個(gè)指針,類型是int*,指向的類型是int,指向的地址是a的地址。a。 int**ptr。 intb??傊?p的結(jié)果是p所指向的東西,這個(gè)東西有這些特點(diǎn):它的類型是p指向的類型,它所占用的地址是p所指向的地址。a的運(yùn)算結(jié)果是一個(gè)指針,指針的類型是a的類型加個(gè)*,指針?biāo)赶虻念愋褪莂的類型,指針?biāo)赶虻牡刂仿?,那就是a的地址。是取地址運(yùn)算符,*是...書上叫做間接運(yùn)算符。ptrnew的值將比ptrold的值減少了n乘sizeof(ptrold所指向的類型)個(gè)字節(jié),就是說,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向低地址方向移動(dòng)了n乘sizeof(ptrold所指向的類型)個(gè)字節(jié)運(yùn)算符amp。就是說,ptrnew所指向的內(nèi)存區(qū)將比ptrold所指向的內(nèi)存區(qū)向高地址方向移動(dòng)了n乘sizeof(ptrold所指向的類型)個(gè)字節(jié)。 總結(jié)一下,一個(gè)指針ptrold加上一個(gè)整數(shù)n后,結(jié)果是一個(gè)新的指針ptrnew,ptrnew的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。這也體現(xiàn)出了指針的靈活性。在這個(gè)例子中,沒加5前的ptr指向數(shù)組a的第0號(hào)單元開始的四個(gè)字節(jié),加5后,ptr已經(jīng)指向了數(shù)組a的合法范圍之外了。在這個(gè)例子中,ptr被加上了5,編譯器是這樣處理的:將指針ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。 int*ptr=a。由于每次循環(huán)都將指針ptr加1,所以每次循環(huán)都能訪問數(shù)組的下一個(gè)單元。i++) { (*ptr)++。 ... for(i=0。 int*ptr=array。 由于char類型的長(zhǎng)度是一個(gè)字節(jié),所以,原來ptr是指向數(shù)組a的第0號(hào)單元開始的四個(gè)字節(jié),此時(shí)指向了數(shù)組a中從第4號(hào)單元開始的四個(gè)字節(jié)。接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針ptr的值加上了sizeof(int),在32位程序中,是被加上了4。 ... ... ptr++。例如: 例二: chara[20]。 指針的算術(shù)運(yùn)算 指針可以加上或減去一個(gè)整數(shù)。在32位平臺(tái)里,指針本身占據(jù)了4個(gè)字節(jié)的長(zhǎng)度。在例一中,指針?biāo)赶虻念愋鸵呀?jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)是不存在的,或者說是無意義的。以后,我們說一個(gè)指針的值是XX,就相當(dāng)于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個(gè)指針指向了某塊內(nèi)存區(qū)域,就相當(dāng)于說該指針的值是這塊內(nèi)存區(qū)域的首地址。在32位程序里,所有類型的指針的值都是一個(gè)32位整數(shù),因?yàn)?2位程序里內(nèi)存地址全都是32位長(zhǎng)。我看了不少書,發(fā)現(xiàn)有些寫得差的書中,就把指針的這兩個(gè)概念攪在一起了,所以看起書來前后矛盾,越看越糊涂。 指針的類型(即指針本身的類型)和指針?biāo)赶虻念愋褪莾蓚€(gè)概念。//指針?biāo)赶虻牡念愋褪莍nt()[3] (5)int*(*ptr)[4]。//指針?biāo)赶虻牡念愋褪莄har (3)int**ptr。例如: (1)int*ptr。//指針的類型是int*(*)[4] 怎么樣?找出指針的類型的方法是不是很簡(jiǎn)單? 指針?biāo)赶虻念愋彤?dāng)你通過指針來訪問指針?biāo)赶虻膬?nèi)存區(qū)時(shí),指針?biāo)赶虻念愋蜎Q定了編譯器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來看待。//指針的類型是int** (4)int(*ptr)[3]。//指針的類型是int* (2)char*ptr。這是指針本身所具有的類型。 如果看不懂后幾個(gè)例子的話,請(qǐng)參閱我前段時(shí)間貼出的文章如何理解c和c ++的復(fù)雜類型聲明。 (4)int(*ptr)[3]。 (2)char*ptr。讓我們分別說明。 作者: liutianyi 2005年05月10日, 星期二 19:13 加入博采 Trackback你可以使用這個(gè)鏈接引用該篇文章 :郵箱: 主 頁(yè): 評(píng)論內(nèi)容:                 20032004 All rights reservedPowered by BlogDriver 深入理解C語(yǔ)言指針的奧秘 加入時(shí)間:200445 整理:adam 來自:天天上教程【打印】【關(guān)閉窗口】 1 指針的概念 指針是一個(gè)特殊的變量,它里面存儲(chǔ)的數(shù)值被解釋成為內(nèi)存里的一個(gè)地址。例如: int*(*(*a)())[10]↑ ↑↑↑↑↑↑7 6 4 2 1 3 5上面給出了由內(nèi)向外的閱讀順序,下面來解釋它:(1)標(biāo)識(shí)符a被說明為;(2)一個(gè)指針變量,它指向;(3)一個(gè)函數(shù),它返回;(4)一個(gè)指針,該指針指向;(5)一個(gè)有10個(gè)元素的數(shù)組,其類型為;(6)指針型,它指向;(7)int型數(shù)據(jù)。從標(biāo)識(shí)符開始,先看它右邊有無方括號(hào)或園括號(hào),如有則先作出解釋,再看左邊有無*號(hào)。但可以用圓括號(hào)改變約定的結(jié)合順序。例如int a[5]();就是錯(cuò)誤的。4. 有關(guān)指針的說明很多是由指針,數(shù)組,函數(shù)說明組合而成的。int (*p)[n]。     p為指向整型量的指針變量int *p[n]。3. 與指針有關(guān)的各種說明和意義見下表。 (5)關(guān)系運(yùn)算指向同一數(shù)組的兩個(gè)指針變量之間可以進(jìn)行大于、小于、 等于比較運(yùn)算。對(duì)指向同一數(shù)組的兩個(gè)指針變量可以相減。把數(shù)組,字符串的首地址賦予指針變量把變量地址賦予指針變量2. 指針的運(yùn)算(1)取地址運(yùn)算符amp。(3)可以實(shí)現(xiàn)動(dòng)態(tài)的存儲(chǔ)分配。本章小結(jié)1. 指針是C語(yǔ)言中一個(gè)重要的組成部分,使用指針編程有以下優(yōu)點(diǎn):(1)提高程序的編譯效率和執(zhí)行速度。printf(%s\n,*pps)。i5。int i。main(){static char *ps[]={ BASIC,DBASE,C,FORTRAN,PASCAL}。在5次循環(huán)中, pps 分別取得了ps[0],ps[1],ps[2],ps[3],ps[4]的地址值()?! ∠率?
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1