




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
要了解指針,多多少少會出現(xiàn)一些比較復雜的類型,所以我先介紹一下如何完全理解一個復雜類型,要理解復雜類型其實很簡單,一個類型里會出現(xiàn)很多運算符,他們也像普通的表達式一樣,有優(yōu)先//這是一個普通的整型變//首先從P處開始,先與*結(jié)合,所以說明P是//個指針,然后再與nt結(jié)合,說明指針所指//的內(nèi)容的類型為it型.所以P是一個返回//型數(shù)據(jù)//首先從P處開始,先與[]結(jié)合,說明P是一個//組,然后與nt結(jié)合,說明數(shù)組里的元素是//型的,所以P是一個由整型數(shù)據(jù)組成的數(shù)//首先從P處開始,先與[]結(jié)合,因為其優(yōu)先//比*高,所以P是一個數(shù)組,然后再與*結(jié)合,說//數(shù)組里的元素是指針類型,然后再與int結(jié)合//說明指針所指向的內(nèi)容的類型是整型的,所//P是一個由返回整型數(shù)據(jù)的指針所組成的數(shù) (*)[3];//首先從P始,先與*結(jié)合,說明P是一個指//然后再與[]結(jié)合(與"()"這步可以忽略,只是//了改變優(yōu)先級),說明指針所指向的內(nèi)容是一//數(shù)組,然后再與nt結(jié)合,說明數(shù)組里的元素//整型的.所以P是一個指向由整型數(shù)據(jù)組成的it //首先從P開始,先與*結(jié)合,說是P是一個指針//后再與*結(jié)合,說明指針所指向的元素是指//后再與int結(jié)合,說明該指針所指向的元素是//型數(shù)據(jù).由于二級指針以及更高級的指針極少//在復雜的類型中,所以后面更復雜的類型我們//不考慮多級指針了,最多只考慮一級指針nt(t);//從P處起,先與()結(jié)合,說明P是一個函//()里分析,說明該函數(shù)有一個整型變量的參//然后再與外面的int結(jié)合,說明函數(shù)的返回值//一個整nt(*)(in);//從P處開始,先與指針結(jié)合,說明P是一個指針,然后//()結(jié)合,說明指針指向的是一個函數(shù),然后再與()里//nt結(jié)合,說明函數(shù)有一個it型的參數(shù),再與最外//nt結(jié)合,說明函數(shù)的返回類型是整型,所以P是一//向有一個整型參數(shù)且返回類型為整型的函數(shù)的指it; //可以先跳過,不看這個類型,過于復//從P開始,先與()結(jié)合,說明P是一個函數(shù),然后//入()里面,與nt結(jié)合,說明函數(shù)有一個整型//參數(shù),然后再與外面的*結(jié)合,說明函數(shù)返回的//一個指針,,然后到最外面一層,先與[]結(jié)合,說//返回的指針指向的是一個數(shù)組,然后再與*結(jié)合//明數(shù)組里的元素是指針,然后再與nt結(jié)合,說明//針指向的內(nèi)容是整型數(shù)據(jù).所以P是一個參數(shù)為一//整數(shù)據(jù)且返回一個指向由整型指針變量組成的數(shù)//的指針變量的函說到這里也就差不多了我們的任務也就這么多理解了這幾個類型其它的類型對我們來說也是小菜了,不過我們一般不會用太復雜的類型那樣會大大減小程序的可讀性請慎用這上面的幾種類型已經(jīng)足夠我們用了.1指針是一個特殊的變量,它里面的數(shù)值被解釋成為內(nèi)存里的一個地址。先幾個指針放著做例子:;;;從語法的角度看,你只要把指針語句里的指針名字去掉,剩下的部(1int*tr;指針的類型是it(2chrptr/指針的類型是char*(3it*tr;/指針的類型是n**( (int**ptr];指針的類型 ]怎么樣?找出指針的類型的方法是不是很簡單指針所指向的類 (1int*tr; //指針所指向的類型是int(2charptr; //指針所指向的的類型是char(3int*ptr; //指針所指向的的類型是int*(4int(ptr)3];//指針所指向的的類型是int([3](5int**ptr[4];//指針所指向的的類型是int*)[4]在指針的算術(shù)運算中,指針所指向的類型有很大的作用以看起書來前后,越看越糊涂。指針的值或者叫指針所指向的內(nèi)存區(qū)或指針的值是指針本身的數(shù)值,這個值將被編譯器當作一個地址,而不是一個一般的數(shù)值。在32位程序里,所有類型的指針的值都是一個32整數(shù),因為32位程序里內(nèi)存地址全都是32位長。指針所指向的內(nèi)存區(qū)就是從指針的值所代表的那個內(nèi)存地址開始,長度為sizeof(指針所指向的類型)的一片內(nèi)存區(qū)。以后,我們說一個指針的值是XX,就相當于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個指針指向了某塊內(nèi)存區(qū)域,指針所指向的內(nèi)存區(qū)和指針所指向的類型是兩個完全不同的概念。在例 指針本身所占據(jù)的內(nèi)存 (就知道了。在32位平臺里,指針本身占據(jù)了4個字節(jié)的長度。2、指針的算術(shù)運例二char;ntpr=(it*);//強制類型轉(zhuǎn)換并不會改變a的類在上例中,指針ptr的類型是it*,它指向的類型是in它被初始化為指向整型變量a。接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針ptr的值加上了izof(int)在32位程序中,是被加上了4,因為在32位程序中int占4個字節(jié)。由于地址是用字節(jié)做單位的,故ptr所指向的地址由原來a的地址向高地址方向增加4個字節(jié)。由于char類型的長度是一個字節(jié),所以,原來ptr是指向數(shù)組a的第0號單元開始的節(jié),此時指向了數(shù)組a中從第4號單元開始的節(jié)。我們可以用一個指針和一個循環(huán)來遍歷一個數(shù)組,看例例三
itaray[2]={;it*pr=aray;){;}這個例子將整型數(shù)組中各個單元的值加1。由于每次循環(huán)都將指針加1個單元,所以每次循環(huán)都能數(shù)組的下一個單元。例四
chara20]=Youreagr";ntpr=(it*;在這個例子中,ptr被加上了5,編譯器是這樣處理的:將指針ptr值加上5乘izeo(int,在32位程序中就是加上了5乘4=20。由于地址的單位是字節(jié),故現(xiàn)在的ptr所指向的地址比起加5后的ptr所指向的地址來說,向高地址方向移動了20個字節(jié)。在這個例子中,沒加5前的ptr指向數(shù)組a的第0號單元開始的節(jié),加5后,ptr已經(jīng)指向了數(shù)組a的如果上例中,ptr是被減去5,那么處理過程大同小異,只不過ptr的值是被減去5乘szeof(it,新的ptr指向的地址將比原來的ptr所指向的地址向低地址方向移動了20個字節(jié)。下面請允許我再舉一個例子:(一個誤例五
nman(){chara20]="Yare_arl";char*=a;char;;;;;}誤解:p是一個char的二級指針,當執(zhí)行tr++時,會使指針加一個誤解:t指向的是一個char*類型,當執(zhí)行ptr時,會使指針加一個szeochar*)(有可能會有人認為這1那就會得到誤區(qū)一的答案,這個值應該是,參面內(nèi)容),即&p4;那進行一次取值運算不正解:ptr的類型是char**,指向的類型是一個char*類型,該指向的 的地址&p)當執(zhí)行ptr時,會使指針加一個sizeofr*),即&p+4那*&p4)指向哪呢,這個你去問上帝吧或者他會告訴你在哪所以最后的輸出會是一個隨機的值或許是一個操作.總結(jié)一一個指針trold加(減)一個整數(shù)n后,結(jié)果是一個新的指針ptrnew,ptrnew的類型和rol的類型相同,ptrnew所指向的類型和ptrld所指向的類型也相同。ptrnew的值將比ptrld的值增加(減少)了n乘sieoptrod所指向的類型)個字節(jié)。就是說,ptrnew所指向的內(nèi)存區(qū)將比ptrld所指向的內(nèi)存區(qū)向高(低)地址方向移動了n乘zotrl所指向的類型)個字節(jié)。指針和指針進行加3、運算符&和例六
這里&是取地址運算符,*是間接運算符&a的運算結(jié)果是一個指針,指針的類型是a的類型加個*,指針所指向的類型是a的類型,指針所指向的地址嘛,那就是a的地址。*p運算結(jié)果就五花八門了??傊?p結(jié)p指向的東西,nta=2;n nt nt; //&a的結(jié)果是一個指針,類型是it*指向的類型//指向的地址是a的地 //*p的結(jié)果,在這里它的類型是i,它所占用的地址//p所指向的地址,顯然,*p就是變量a //&p的結(jié)果是個指針,該指針的類型是p的類型加個//在這里是int**。該指針所指向的類型是p類型//里是n*。該指針所指向的地址就是指針p自己的地; //*ptr是個指針,&b的結(jié)果也是個指針,且這兩//的類型和所指向的類型是一樣的所以用 來給*ptr//值就是毫無問題的了 //*ptr結(jié)ptr指向的東西,在這里是一個指//對這個指針再做一次*運算結(jié)果是一個int類型的變4例七例八
nt;nt*p //&a是一個指針表達式t //&pa也是一個指針表達式; //*ptr和&b都是指針表達式 //這也是指針表達char;char*paar;//如果把arr看作指針的話,arr也是指針表達char //*parr是指針表達式 //(pa+是指針表達在例七中,&a是一個左值,因為它還沒有占據(jù)明確的內(nèi)存。*ptr既然pa經(jīng)在內(nèi)存中有了自己的位置,那么*ptr然也有了自己的位5例九例十
數(shù)組的數(shù)組名其實可以看作一個指針??聪吕?; ;; :;; 上例中,一般而言數(shù)組名array代表數(shù)組本身,類型是nt[10]但如果把array看做指針的話,它指向數(shù)組的第0個單元,類型是nt,所指向的類型是數(shù)組單元的類型即it*array等于0就一點也不奇怪了。同理,array+3是一個指向數(shù)組第3個單元的指針,所以*tr[3{" , ; //也可寫成trp(s,*t);; //也可寫成strp(s,(sr1);; ;上例中,str是一個三單元的數(shù)組,該數(shù)組的每個單元都是一個指針,這些指針各指向一個字符串。把指針數(shù)組str作一個指針的話,它指向數(shù)組的第0單元,它的類型是char**,它指向的類型是char**str也是一個指針,它的類型是car*,它所指向的類型是char,它指向的地址是字符串"othissaample!"H'的地址。注意字符串相當于是一個數(shù)組在內(nèi)存中以數(shù)組的形式儲存,只不過字符串是一個數(shù)組常量,內(nèi)容不可改變,且只能是右值.如果看成指針的話他即是常量指針,也是指針常量.str+1也是一個指針,它指向數(shù)組的第1號單元,它的類型是char**,它指向的類型是char*。r)也是一個指針,它的類型是char*,它所指向的類型是char,它指向"igodmrning"的第一個字符H'下面總結(jié)一下數(shù)組的數(shù)組名(數(shù)組中的也是數(shù)組)的問題了一個數(shù)組TYPEarray[n],則數(shù)組名稱array就有了兩重含義:第一,它代表整個數(shù)組,它的類型是TYPE[n];第二,它是一個常量指針,該指針的類型是TYPE*,該指針指向的類型是TYPE,也就是數(shù)組指針的值是不能修改的,即類似array++的表達式是錯誤的。
在不同的表達式中數(shù)組名array可以扮演不同的角色在表達式szo(arry)中,數(shù)組名array代表數(shù)組本身,故這sizof函數(shù)測出的是整個數(shù)組的大小數(shù)組第0號單元的值。sieo(arra)測出的是數(shù)組單元的大小。表達array+n(n=0,1,2,)中,array演的是指針array+n結(jié)果是一個指針,它的類TYPE*,它指向的類型是TYPE,它指向數(shù)組第n單sizf(aray+)測出的是指針類型的大小。在32位程序中結(jié)果是4ntaay[1];it(*tr)[];:上例中ptr是一個指針,它的類型是],他指向的類型是nt[10],我們用整個數(shù)組的首地址來初始化它。在語句t=&rray中,array代表數(shù)組本身。本節(jié)中提到了函數(shù)sizeof()那么我來問一問sizeof(指針名稱)測出的究竟是指針自身類型的大小呢還是指針所指向的類型的大?。?2程序中,有:404szof6、指針和結(jié)構(gòu)類型的關(guān) struct{ntantbntstructMyStuct; 了結(jié)構(gòu)對象ss,并ss成員初始化20,3040structMtuctpt=&s; 了一個指向結(jié)構(gòu)對象ss的指針。它的類//MyStct*,它指向的類型是Mtrct。 s 了一個指向結(jié)構(gòu)對ss的指針。但是pstr//它被指向的類型ptr是不同的請問怎樣通過指針ptr來ss的三個成員變量? ptr-又請問怎樣通過指針pstr來ss的三個成員變量? //了ss的成員a; //了ss的成員b //了ss的成員c雖然我在我的MSVC++0上調(diào)式過上述是要知道,這樣使用pstr來結(jié)構(gòu)成員是不正規(guī)的,為了說明為什么不正規(guī),讓我們看看怎樣通過指針來數(shù)組的各個單元:(將結(jié)構(gòu)體換成數(shù)組)itry[{356,3};it*p=arry; //了第0號單; //了第1號單; //了第2號單從格式上看倒是與通過指針結(jié)構(gòu)成員的不正規(guī)方法的格式樣所有的C/C++編譯器在排列數(shù)組的單元時,總是把各個數(shù)組單致各個成員之間可能會有若干個字節(jié)的空所以,在例十二中,即使*pstr到了結(jié)構(gòu)對象ss的第一個成員變量a,也不能保證(tr1就一定能到結(jié)構(gòu)成員b。因為成員a和成員b之間可能會有若干填充字節(jié),說不定(psr1)就正好指針結(jié)構(gòu)成員的正確方法應該是象例十二中使用指針ptr的方法7可以把一個指 成為一個指向函數(shù)的指針ntfun1(charn)it(*pfun1)(char,int; a*pfu)(bcdefg,7);//通過函數(shù)指針調(diào)用函數(shù)ntfun(char*);charsr[]=abcfhjkmn";;ntfun(char{ntnu=0;or(inti=0){;}return}這個例子中的函數(shù)fun統(tǒng)計一個字符串中各個字符的I碼值之和。前面說了,數(shù)組的名字也是一個指針。在函數(shù)調(diào)用中,當把str作為實參傳遞給形參s后,實際是把str的值傳遞給了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的空間。在函數(shù)s行自加1算,并不意味著同時str行了自加1運算。8、指針類型轉(zhuǎn)oa=2.foatfpr&f;nt*p在上面的例子中假如我們想讓指針p指向?qū)崝?shù)f應該怎么辦?;不對。因為指針p的類型是nt,它指向的類型是in。表達式&f的結(jié)果是一個指針,指針的類型是float,它指向的類型是float兩者不一致,直接賦值的方法是不行的。至少在我的MC++60上,對;TYEP*TYPE,那么語法格式是:(TYPE*)p;這樣強制類型轉(zhuǎn)換的結(jié)果是一個新指針,該新指針的類YE *,它指向的類型是YE,它指向的地址就是原指針指向的地址p的一切屬性都沒有被修改(切記)形參的結(jié)合過程中,必須保證類型一致,否則需要強制轉(zhuǎn)換oidfn(chr);nta=25b;;vodfun(char*s){(+;(+;}注意這是一個32位程序,故nt類型占了節(jié),char類型占一個到了嗎?在函數(shù)調(diào)用語句中,實參&a的結(jié)果是一個指針,它的類型是nt*,它指向的類型是it。形參這個指針的類型是char*,它指向的類型是char。這樣,在實參和形參的結(jié)合過程中,須進行一次從int*類型到char*類型的轉(zhuǎn)換。結(jié)合這個例子,我們可以這樣來想象編譯器進行轉(zhuǎn)換的過程:編譯器先構(gòu)造一個臨時指針char*emp然后執(zhí)行mp=ca*)&a最后再把tmp的值傳遞給s。所以最后的結(jié)果是:s的類型是char*,它指向的類型是char,它指向的地a的首地址我們已經(jīng)知道,指針的值就是指針指向的地址, 位程序中unsgndntTYPE//TYPEi,c或結(jié)構(gòu)類型等等類型;;//我們的目的是要使指針ptr指向地//我們的目的是要使指針ptr指向地unsgndntTYPE*tr; //TYPE是i,c或結(jié)構(gòu)類型等等類型。 //N必須代表一個合法的地址; 嚴格說來這里的(TYPE*)和指針類型轉(zhuǎn)換中的(TYPE*)還不一樣。這里的(TYPE*)的意思是把無符號a值當作一個地址來看待。上面強會出現(xiàn)操作錯誤。ita=23b;nt*pr=&a;char
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國增韌母料數(shù)據(jù)監(jiān)測研究報告
- 2025年軍隊文職人員招聘之軍隊文職教育學模擬考試試卷A卷含答案
- 2019-2025年消防設施操作員之消防設備初級技能模擬考試試卷A卷含答案
- 2021-2022學年廣東省廣州四中初中部逸彩校區(qū)七年級(下)期中數(shù)學試卷(含答案)
- 2025年天津市專業(yè)技術(shù)人員公需考試試題-為中國式現(xiàn)代化提供強大動力和制度保障-黨的二十屆三中全會暨《中共中央關(guān)于進一步全面深化改革、推進中國式現(xiàn)代化的決定》總體解讀
- 高等教育自學考試《00074中央銀行概論》模擬試卷一
- 2025年大學英語六級考試預測試卷一
- 2023年同等學力申碩《英語》試題真題及答案
- 美容整形手術(shù)服務合同協(xié)議
- 紡織服裝產(chǎn)品質(zhì)量免責承諾書
- 2025年海南海口市水務局招聘事業(yè)單位人員35人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- COP生產(chǎn)一致性控制計劃
- 2025年電力人工智能多模態(tài)大模型創(chuàng)新技術(shù)及應用報告-西安交通大學
- 天津2025年天津市機關(guān)后勤事務服務中心分支機構(gòu)天津市迎賓館招聘2人筆試歷年參考題庫附帶答案詳解
- 華東師大版七年級數(shù)學下冊“第1周周考”
- 教師論文撰寫培訓
- 2024年道路運輸企業(yè)安全生產(chǎn)管理人員證考試題庫
- EPC總承包管理方案
- 安全生產(chǎn)管理體系建設講解
- 學習雷鋒主題班會雷鋒日學習雷鋒精神-
- 事故隱患內(nèi)部舉報獎勵制度
評論
0/150
提交評論