在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>C語言|源代碼>C語言的精髓——指針詳解

C語言的精髓——指針詳解

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

資料介紹

  C語言的精髓——指針詳解

  朱有鵬

  1.2、指針變量的類型作用

  對于普通變量的來說,其類型的作用主要有這么幾個方面:

  (1)程序員寫代碼時識別用:不涉及強制轉換時,知道該變量中應該存放什么類型的數值。

  (2)空間大小的說明:比如int為4個字節空間

  (3)存儲結構說明:float和int雖然空間大小都是4字節,但是其存儲結構完全不同

  對于指針變量來說,其類型的作用與上面基本一致,只是其類型是由普通類型+*構成,*個數表明了指針變量的級數,指針變量用來存放地址。當不涉及強制轉換時,其對應關系為:

  某類型一級指針變量 = 該類型一級地址

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

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

  所有普通變量的地址都是一級地址,所有一級指針變量的地址都是二級地址,類推n級指針變量的地址就是n+1級地址,但是我們這里必須強調一下,使用指針的目的就是為了更加方便的訪問空間,但是如果級數超過3級以上,實際上不但降低了程序的可讀性,也會降低對空間的訪問速度,所以過高級數的指針變量沒有太大的意義。

  Int *p = &a;

  p中只存放了a首字節地址,但是int說明了*p希望訪問的空間有4個字節,所以從p所指a的第一個字節向后數3個字節空間,一共4個字節空間才是*p的實際希望訪問到的完整空間。

  1.3、為什么需要指針

  不管多么高大上的程序,最終都是運行在硬件上的,所有對于硬件的設置和訪問,全部都是通過對內存操作實現的,廣義上的內存可以包括,寄存器、緩存、常說的內存等,這些內存空間都是由一個個的字節構成的,每個字節都有地址,對于這些空間的訪問,大多都是通過地址實現的。

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

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

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

  1.4、高級語言如javac#的指針到哪里去了

  C++就不說了,里面保留了指針的使用,初學java,c#等高級語言的同學,都會因為里面沒有指針而困惑,甚至在想,難道這些高級語言就不需要訪問內存空間了嗎?凡是有過java異常處理的同學,都會發現java中有一種空指針異常,大多是因為我們使用了沒有實例化的對象名導致的,因為沒有實例化就沒有分配內存空間。

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

  1.5、指針使用值三部曲

  (1)定義(聲明)

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

  (2)關聯

  例: int a= 10;

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

  (3)引用

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

  例:int b = *p;//等價于 b = a;

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

  例: int *p = 30;//等價于a = 30;

  2、指針涉及到的一些符號的理解

  2.1、*的理解

  在c語言中,*的用途有兩個,一個是用于表示乘號,第二個與指針有關,雖然這兩種用途用都會用到*,但這兩者沒有任何關系。*在指針中的用途主要有兩個方面,第一種是用在指針定義的時候,與前面的類型結合,用于表示被定義指針變量的類型,*個數表明了定義的指針變量的級數,例如:

  int *p;int* p;

  *靠前靠后都沒關系,這時的*與p是兩個不同的東西,星號表明p是一個一級指針變量,用于存放一個一級地址。但是需要注意下面的情況:

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

  int *p1,p2;//p1是int型的一級指針變量,p2只是一個普通的int型變量。

  第二種就是解引用,解引用時,*p表示的就是p所指向的空間,這時的*也稱為取空間操作,找到p所指向的空間,必須強調的是,這時的*p是一個整體,不能割裂來看,比如:

  int *p = &a;

  *p = 10;//等價于a=10;但是寫成* p = 10;就不對了

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

  2.2、取地址符&的理解

  取地址符使用時,直接寫在變量名稱的前面,然后&和變量一起構成了一個新的符號,表示變量空間的首地址,準確講是變量的首字節地址。比如int a;int *p = &a;這里必須注意,&a是一個完整的不可分割的整體,之所以用這種方式來表示空間的地址,是因為我們沒有辦法直接得到變量a的地址,只能是使用&a來表示,當編譯時會將&a變成a空間的地址賦值給p;

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

  首先必須強調,指針變量的初始化與普通變量的初始化沒有任何區別,只是指針變量里面的存放的是一個特殊的值“地址”,這個值具有指向作用,可以用來訪問它所指向的空間,如果你刨去它地址的含義,實際上變量中存放的不過就是一個普通值。

  (1)指針變量的初始化

  Int a=10;

  Int *p=&a;

  此時的*,只是說明p是一個一級指針變量,不能把這時的*當成了解引用。

  (2)指針變量的賦值

  Int a=10;

  Int *p=NULL;

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

  不少同學可能一直覺得p=&a,應該寫成*p=&a;這是錯誤的理解,這時的*是取空間操作,如果寫成*p=&a,就表示將a的空間地址存放到p所指向的空間,p所指向的空間其實就是a,*p=&a的等價寫法就是a=&a;相當于把地址給了a自己,顯然是不對的。

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

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

  2.4、左值與右值

  (1)什么是左值和右值

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

  (2)左值

  在c語言中,左值指的都是變量空間。對左值執行的操作都是寫空間操作。

  (3)右值

  在c中,右值有兩種形態,一種是直接寫一個數值,比如int a=10;就是典型的這種情況。那么另外的一種情況就是,右值可能也是一個變量,比如int b=10; int a=b;這個時候右值就是一個變量。當變量作為左值是,對變量實現的是寫操作,如果變量作為右值時,對變量實現的是讀操作,讀出后賦給右值,這一點要了解。

  2.5、定義指針后,需要會關心的一些內容

  (1)例子1

  Int a =10;

  Int *p=&a;

  合理我們必須了解與指針變量p相關的一些內容。

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

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

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

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

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

  (2)例子2:

  Int a =10;

  Int *p=&a;

  Int **p1=&p;

  對于指針變量p,需要關心p、*p、&p,但是在上例中已經描述過了,不再贅述。

  對于指針變量p1來說,需要如下幾個方面的問題:

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

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

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

  &p1:指的是二級指針變量p1的空間地址,是一個三級地址。

  只要大家理解前面的例子1和例子2,對于三級指針的情況,道理是類似的,但是我們前面就說過,構建三級以上的指針實際上沒有太大的意義,除了某些極少數的情況外,并不會為我們的程序帶來多少好處。

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

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

  (3)多級指針鏈斷線的問題

  Int a =10;

  Int *p;

  Int **p1=&p;

  Int b=**p1;

  **p1,原是想通過**p1訪問到a的空間,將a空間的內容賦給b,但是這里是不對的,因為中間的指針變量p并沒有指向a,指針鏈斷線了,所以我們在使用多級指針的時候,必須注意構建的指針鏈是否完整。當然這里因為是直接寫的比較好理解,如果多級指針鏈是通過傳參的方式來構建的話,很容易出現斷鏈的情況,造成的影響就是,要么訪問到是空指針,要么訪問到了不該訪問的地方,導致嚴重錯誤。

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

評論

查看更多

下載排行

本周

  1. 1IP6823 支持 qi 認證的無線充電發射控制 SOC
  2. 1.01 MB  |  1次下載  |  免費
  3. 2IP6824? 全集成QI?無線充電發射控制SOC
  4. 1.22 MB  |  1次下載  |  免費
  5. 3帶注入電流控制的1.8V通用SP8T-Z和2個SP4T-Z模擬開關
  6. 847.62KB   |  次下載  |  免費
  7. 4PESD18VY1BBIF保護二極管規格書
  8. 4.56MB   |  次下載  |  免費
  9. 574HC4050緩沖器規格書
  10. 217.58KB   |  次下載  |  免費
  11. 674HC193;74HC7193二進制加減計數器規格書
  12. 327.93KB   |  次下載  |  免費
  13. 774HC73-Q100雙JK觸發器規格書
  14. 220.85KB   |  次下載  |  免費
  15. 8ASW3410 USB3.1高速數據開關切換規格書
  16. 1.39 MB   |  次下載  |  免費

本月

  1. 1A7159和A7139射頻芯片的資料免費下載
  2. 0.20 MB   |  55次下載  |  5 積分
  3. 2零死角玩轉STM32F103—指南者
  4. 26.78 MB   |  41次下載  |  1 積分
  5. 3PIC12F629/675 數據手冊免費下載
  6. 2.38 MB   |  36次下載  |  5 積分
  7. 4PIC16F716 數據手冊免費下載
  8. 2.35 MB   |  18次下載  |  5 積分
  9. 5dsPIC33EDV64MC205電機控制開發板用戶指南
  10. 5.78MB   |  8次下載  |  免費
  11. 6STC15系列常用寄存器匯總免費下載
  12. 1.60 MB   |  7次下載  |  5 積分
  13. 7AN-1267: 使用ADSP-CM408F ADC控制器的電機控制反饋采樣時序
  14. 1.41MB   |  5次下載  |  免費
  15. 8LP9962集成 PFC 和 和的 高壓半橋驅動的 LLC 諧振
  16. 3.30 MB  |  4次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935124次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420063次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233088次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73813次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
主站蜘蛛池模板: a级特黄毛片 | 亚洲 另类色区 欧美日韩 | 国产高清视频在线免费观看 | 亚洲高清免费视频 | 99久久免费中文字幕精品 | 午夜在线观看免费观看大全 | 欧美不卡一区 | 婷婷影院在线综合免费视频 | 亚洲天堂导航 | 国产在线视频不卡 | 久久鲁视频 | 国产2021成人精品 | 久久美女性网 | 午夜无遮挡怕怕怕免费视频 | 中文字幕精品一区影音先锋 | 四虎影院大全 | 停停色| 国产中日韩一区二区三区 | 黄色在线网站视频 | 国模吧新入口 | 天天看片天天干 | 萌白酱香蕉白丝护士服喷浆 | 国产美女久久 | 天天干夜夜操 | 国产自在自线午夜精品视频在 | 香港经典a毛片免费观看爽爽影院 | 久久这里精品青草免费 | 免费一级毛毛片 | 一区二区三区高清不卡 | www.欧美黄色| 欧美日韩国产另类一区二区三区 | 亚洲视频在线不卡 | 日本亚洲天堂网 | 视频在线精品 | 国产人人干 | a级午夜毛片免费一区二区 a看片 | 夜夜爱视频 | 女人张开双腿让男人桶爽免 | 午夜免费体验 | 视频黄色免费 | 18女人毛片水真多免费 |