色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>C語(yǔ)言|源代碼>C語(yǔ)言的精髓——指針詳解

C語(yǔ)言的精髓——指針詳解

2017-11-30 | docx | 17KB | 次下載 | 1積分

資料介紹

  C語(yǔ)言的精髓——指針詳解

  朱有鵬

  1.2、指針變量的類型作用

  對(duì)于普通變量的來(lái)說(shuō),其類型的作用主要有這么幾個(gè)方面:

  (1)程序員寫代碼時(shí)識(shí)別用:不涉及強(qiáng)制轉(zhuǎn)換時(shí),知道該變量中應(yīng)該存放什么類型的數(shù)值。

  (2)空間大小的說(shuō)明:比如int為4個(gè)字節(jié)空間

  (3)存儲(chǔ)結(jié)構(gòu)說(shuō)明:float和int雖然空間大小都是4字節(jié),但是其存儲(chǔ)結(jié)構(gòu)完全不同

  對(duì)于指針變量來(lái)說(shuō),其類型的作用與上面基本一致,只是其類型是由普通類型+*構(gòu)成,*個(gè)數(shù)表明了指針變量的級(jí)數(shù),指針變量用來(lái)存放地址。當(dāng)不涉及強(qiáng)制轉(zhuǎn)換時(shí),其對(duì)應(yīng)關(guān)系為:

  某類型一級(jí)指針變量 = 該類型一級(jí)地址

  某類型二級(jí)指針變量 = &(該類型一級(jí)指針變量)

  n+1級(jí)指針變量 = &(n級(jí)指針變量)

  所有普通變量的地址都是一級(jí)地址,所有一級(jí)指針變量的地址都是二級(jí)地址,類推n級(jí)指針變量的地址就是n+1級(jí)地址,但是我們這里必須強(qiáng)調(diào)一下,使用指針的目的就是為了更加方便的訪問(wèn)空間,但是如果級(jí)數(shù)超過(guò)3級(jí)以上,實(shí)際上不但降低了程序的可讀性,也會(huì)降低對(duì)空間的訪問(wèn)速度,所以過(guò)高級(jí)數(shù)的指針變量沒(méi)有太大的意義。

  Int *p = &a;

  p中只存放了a首字節(jié)地址,但是int說(shuō)明了*p希望訪問(wèn)的空間有4個(gè)字節(jié),所以從p所指a的第一個(gè)字節(jié)向后數(shù)3個(gè)字節(jié)空間,一共4個(gè)字節(jié)空間才是*p的實(shí)際希望訪問(wèn)到的完整空間。

  1.3、為什么需要指針

  不管多么高大上的程序,最終都是運(yùn)行在硬件上的,所有對(duì)于硬件的設(shè)置和訪問(wèn),全部都是通過(guò)對(duì)內(nèi)存操作實(shí)現(xiàn)的,廣義上的內(nèi)存可以包括,寄存器、緩存、常說(shuō)的內(nèi)存等,這些內(nèi)存空間都是由一個(gè)個(gè)的字節(jié)構(gòu)成的,每個(gè)字節(jié)都有地址,對(duì)于這些空間的訪問(wèn),大多都是通過(guò)地址實(shí)現(xiàn)的。

  如果就站在c自身的角度,也可以看到指針的好處,舉個(gè)例子的話,比如fun1函數(shù)有一個(gè)自動(dòng)局部變量a,他的作用域被局限在了fun1函數(shù)內(nèi)部,fun2函數(shù)是無(wú)法訪問(wèn)的,如果fun2想要訪問(wèn)fun1中a的話,我們可以將a的地址傳遞給fun2函數(shù),當(dāng)然前提是fun1的a沒(méi)有被自動(dòng)釋放。

  對(duì)于c語(yǔ)言有了解的都知道,函數(shù)也是有作用域的,跨文件的作用域又稱為鏈接域,為了防止本文件的函數(shù)(比如名叫fun的函數(shù))不被其它文件的同名函數(shù)干擾,同時(shí)也希望不去干擾別人,我們往往會(huì)在fun函數(shù)的前面加一個(gè)static標(biāo)志,將其作用域固定為本文件,其它文件通過(guò)fun函數(shù)名是無(wú)法訪問(wèn)的。但是如果其它文件的function函數(shù),又確實(shí)希望訪問(wèn)這個(gè)函數(shù)時(shí),怎么辦呢?我們只需要將fun函數(shù)的地址傳遞給function函數(shù),就可以跨文件訪問(wèn)fun函數(shù),并且不會(huì)受到static的影響。

  所以在c語(yǔ)言中,地址還是擴(kuò)大變量或者函數(shù)作用范圍的有效手段,當(dāng)然指針好處很多,這里不再贅述。

  1.4、高級(jí)語(yǔ)言如javac#的指針到哪里去了

  C++就不說(shuō)了,里面保留了指針的使用,初學(xué)java,c#等高級(jí)語(yǔ)言的同學(xué),都會(huì)因?yàn)槔锩鏇](méi)有指針而困惑,甚至在想,難道這些高級(jí)語(yǔ)言就不需要訪問(wèn)內(nèi)存空間了嗎?凡是有過(guò)java異常處理的同學(xué),都會(huì)發(fā)現(xiàn)java中有一種空指針異常,大多是因?yàn)槲覀兪褂昧藳](méi)有實(shí)例化的對(duì)象名導(dǎo)致的,因?yàn)闆](méi)有實(shí)例化就沒(méi)有分配內(nèi)存空間。

  既然有空指針異常,就證明java是使用了指針的,只是全部都由類的底層封裝好了,不需要我們關(guān)心,目的就是為了省去指針這一難點(diǎn),使得java簡(jiǎn)單實(shí)用,但是由于不能直接操作指針,面對(duì)頻繁使用指針的底層開(kāi)發(fā)而言,java和c#多少會(huì)顯得有心無(wú)力。

  1.5、指針使用值三部曲

  (1)定義(聲明)

  例: int *p=NULL; //初始化一下,防止野指針

  (2)關(guān)聯(lián)

  例: int a= 10;

  p = &a;//a空間的首地址給了p,所以p里面的地址常量指向了a空間,因此簡(jiǎn)稱p-》a空間

  (3)引用

  (a)讀空間:讀值操作,前提是里面存有數(shù)據(jù)才行

  例:int b = *p;//等價(jià)于 b = a;

  (b)寫空間:向空間寫入新的值

  例: int *p = 30;//等價(jià)于a = 30;

  2、指針涉及到的一些符號(hào)的理解

  2.1、*的理解

  在c語(yǔ)言中,*的用途有兩個(gè),一個(gè)是用于表示乘號(hào),第二個(gè)與指針有關(guān),雖然這兩種用途用都會(huì)用到*,但這兩者沒(méi)有任何關(guān)系。*在指針中的用途主要有兩個(gè)方面,第一種是用在指針定義的時(shí)候,與前面的類型結(jié)合,用于表示被定義指針變量的類型,*個(gè)數(shù)表明了定義的指針變量的級(jí)數(shù),例如:

  int *p;int* p;

  *靠前靠后都沒(méi)關(guān)系,這時(shí)的*與p是兩個(gè)不同的東西,星號(hào)表明p是一個(gè)一級(jí)指針變量,用于存放一個(gè)一級(jí)地址。但是需要注意下面的情況:

  int *p1,*p2;//p1和p2都是int型的一級(jí)指針變量。

  int *p1,p2;//p1是int型的一級(jí)指針變量,p2只是一個(gè)普通的int型變量。

  第二種就是解引用,解引用時(shí),*p表示的就是p所指向的空間,這時(shí)的*也稱為取空間操作,找到p所指向的空間,必須強(qiáng)調(diào)的是,這時(shí)的*p是一個(gè)整體,不能割裂來(lái)看,比如:

  int *p = &a;

  *p = 10;//等價(jià)于a=10;但是寫成* p = 10;就不對(duì)了

  *作為解引用時(shí)(也就是取空間操作時(shí)),得到p所指向的空間后,我們的用途有兩種,一個(gè)是讀空間內(nèi)容,還 有就是向空間寫入新的內(nèi)容。

  2.2、取地址符&的理解

  取地址符使用時(shí),直接寫在變量名稱的前面,然后&和變量一起構(gòu)成了一個(gè)新的符號(hào),表示變量空間的首地址,準(zhǔn)確講是變量的首字節(jié)地址。比如int a;int *p = &a;這里必須注意,&a是一個(gè)完整的不可分割的整體,之所以用這種方式來(lái)表示空間的地址,是因?yàn)槲覀儧](méi)有辦法直接得到變量a的地址,只能是使用&a來(lái)表示,當(dāng)編譯時(shí)會(huì)將&a變成a空間的地址賦值給p;

  2.3、指針變量的初始化和指針變量賦值之間的區(qū)別

  首先必須強(qiáng)調(diào),指針變量的初始化與普通變量的初始化沒(méi)有任何區(qū)別,只是指針變量里面的存放的是一個(gè)特殊的值“地址”,這個(gè)值具有指向作用,可以用來(lái)訪問(wèn)它所指向的空間,如果你刨去它地址的含義,實(shí)際上變量中存放的不過(guò)就是一個(gè)普通值。

  (1)指針變量的初始化

  Int a=10;

  Int *p=&a;

  此時(shí)的*,只是說(shuō)明p是一個(gè)一級(jí)指針變量,不能把這時(shí)的*當(dāng)成了解引用。

  (2)指針變量的賦值

  Int a=10;

  Int *p=NULL;

  p=&a;//將a空間地址的賦值給p

  不少同學(xué)可能一直覺(jué)得p=&a,應(yīng)該寫成*p=&a;這是錯(cuò)誤的理解,這時(shí)的*是取空間操作,如果寫成*p=&a,就表示將a的空間地址存放到p所指向的空間,p所指向的空間其實(shí)就是a,*p=&a的等價(jià)寫法就是a=&a;相當(dāng)于把地址給了a自己,顯然是不對(duì)的。

  (3)初始化和賦值注意點(diǎn)

  從形式上看,我們已經(jīng)知道了初始化和賦值的區(qū)別,同時(shí)要知道初始化只能有一次,但是賦值可以有多次。

  2.4、左值與右值

  (1)什么是左值和右值

  比如:int a=10;等式的左邊稱為左值,右邊稱為右值。

  (2)左值

  在c語(yǔ)言中,左值指的都是變量空間。對(duì)左值執(zhí)行的操作都是寫空間操作。

  (3)右值

  在c中,右值有兩種形態(tài),一種是直接寫一個(gè)數(shù)值,比如int a=10;就是典型的這種情況。那么另外的一種情況就是,右值可能也是一個(gè)變量,比如int b=10; int a=b;這個(gè)時(shí)候右值就是一個(gè)變量。當(dāng)變量作為左值是,對(duì)變量實(shí)現(xiàn)的是寫操作,如果變量作為右值時(shí),對(duì)變量實(shí)現(xiàn)的是讀操作,讀出后賦給右值,這一點(diǎn)要了解。

  2.5、定義指針后,需要會(huì)關(guān)心的一些內(nèi)容

  (1)例子1

  Int a =10;

  Int *p=&a;

  合理我們必須了解與指針變量p相關(guān)的一些內(nèi)容。

  p:表示int*型的一級(jí)指針變量空間,里面存放的是變量a的地址。

  *p:表示p所指向的空間,指的就是a的空間,只不過(guò)是通過(guò)地址找到的。

  &p:表示指針變量p自己的空間地址,它需要是int **的二級(jí)指針變量來(lái)存放。

  思考一下,**p=20可不可以?

  回答:不可以,**p改寫成等價(jià)形式*(*p),里面的*p等價(jià)于a,最后變成了*a,由于a的值等于10,*a就是*10,引用地址10所指向的空間,顯然10這個(gè)地址指向的空間是不存在的,所以錯(cuò)誤。

  (2)例子2:

  Int a =10;

  Int *p=&a;

  Int **p1=&p;

  對(duì)于指針變量p,需要關(guān)心p、*p、&p,但是在上例中已經(jīng)描述過(guò)了,不再贅述。

  對(duì)于指針變量p1來(lái)說(shuō),需要如下幾個(gè)方面的問(wèn)題:

  p1:一個(gè)int **型的二級(jí)指針變量空間,用于存放一個(gè)二級(jí)地址,恰好*p的地址就是二級(jí)地址。

  *p1:引用取空間操作,找到p1所指向的空間,指的就是p的空間。

  **p1:將其中的*p1替換成為p,**p1就變成了*p,指的就是a的空間。

  &p1:指的是二級(jí)指針變量p1的空間地址,是一個(gè)三級(jí)地址。

  只要大家理解前面的例子1和例子2,對(duì)于三級(jí)指針的情況,道理是類似的,但是我們前面就說(shuō)過(guò),構(gòu)建三級(jí)以上的指針實(shí)際上沒(méi)有太大的意義,除了某些極少數(shù)的情況外,并不會(huì)為我們的程序帶來(lái)多少好處。

  思考一下:***p1可不可以?

  答:不可以,根據(jù)取空間操作,***p1最終變成了*10,顯然也是錯(cuò)誤的。

  (3)多級(jí)指針鏈斷線的問(wèn)題

  Int a =10;

  Int *p;

  Int **p1=&p;

  Int b=**p1;

  **p1,原是想通過(guò)**p1訪問(wèn)到a的空間,將a空間的內(nèi)容賦給b,但是這里是不對(duì)的,因?yàn)橹虚g的指針變量p并沒(méi)有指向a,指針鏈斷線了,所以我們?cè)谑褂枚嗉?jí)指針的時(shí)候,必須注意構(gòu)建的指針鏈?zhǔn)欠裢暾.?dāng)然這里因?yàn)槭侵苯訉懙谋容^好理解,如果多級(jí)指針鏈?zhǔn)峭ㄟ^(guò)傳參的方式來(lái)構(gòu)建的話,很容易出現(xiàn)斷鏈的情況,造成的影響就是,要么訪問(wèn)到是空指針,要么訪問(wèn)到了不該訪問(wèn)的地方,導(dǎo)致嚴(yán)重錯(cuò)誤。

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費(fèi)下載
  2. 0.00 MB  |  1490次下載  |  免費(fèi)
  3. 2單片機(jī)典型實(shí)例介紹
  4. 18.19 MB  |  92次下載  |  1 積分
  5. 3S7-200PLC編程實(shí)例詳細(xì)資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識(shí)別和講解說(shuō)明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開(kāi)關(guān)電源原理及各功能電路詳解
  10. 0.38 MB  |  10次下載  |  免費(fèi)
  11. 6基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
  12. 0.11 MB  |  4次下載  |  免費(fèi)
  13. 7藍(lán)牙設(shè)備在嵌入式領(lǐng)域的廣泛應(yīng)用
  14. 0.63 MB  |  3次下載  |  免費(fèi)
  15. 89天練會(huì)電子電路識(shí)圖
  16. 5.91 MB  |  3次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費(fèi)
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費(fèi)
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費(fèi)
  7. 4LabView 8.0 專業(yè)版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費(fèi)
  9. 5555集成電路應(yīng)用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費(fèi)
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費(fèi)
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費(fèi)
  15. 8開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  16. 未知  |  21539次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537791次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233045次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191183次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183277次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138039次下載  |  免費(fèi)
主站蜘蛛池模板: 国产中文字幕一区| 久久这里只有精品无码3D| 欧美群交XXXCOM| 男男肉肉互插腐文| 欧美性猛交AAA片| 青青草原直播| 乳欲性高清在线| 琪琪SEE色原网色原网站18| 日本最新免费区中文| 欧美精品一区二区在线电影| 欧美亚洲精品一区二三区8V| 色老板美国在线观看| 校草让我脱了内裤给全班看| 少妇精油按摩| 秋霞电影网午夜免费鲁丝片| 涩涩免费视频软件| 亚洲精品无码不卡| 亚洲欧美综合视频| 亚洲国产精品嫩草影院永久| 卫生间被教官做好爽HH视频| 丝袜美女被艹| 亚洲欧美偷拍视频一区| 69夫妇交友群| 97在线播放视频| 97视频在线免费播放| 春药按摩人妻中文字幕| 国产自产视频在线观看香蕉| 麻豆高潮AV久久久久久久| 美国CERANETWORK超清| 日本一本2017国产| 爽a中文字幕一区| 伊人久久精品中文字幕| 爱爱好爽好大好紧视频| 国内免费视频成人精品| 男女全黄h全肉细节文| 無码一区中文字幕少妇熟女H| 亚洲2023无矿砖码砖区| 亚洲乱码国产乱码精品精98| 91麻精品国产91久久久久| AV午夜午夜快憣免费观看| 国产高清视频免费最新在线|