那曲檬骨新材料有限公司

電子發燒友App

硬聲App

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

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

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

C語言和C++指針的應用詳解

2019-11-12 | rar | 0.07 MB | 次下載 | 免費

資料介紹

  C++指針應用詳解

  要了解指針,多多少少會出現一些比較復雜的類型,所以我先介紹一下如何完全理解一個復雜類型,要理解復雜類型其實很簡單,一個類型里會出現很多運算符,他們也像普通的表達式一樣,有優先級,其優先級和運算優先級一樣,所以我總結了一下其原則:

?

  從變量名處起,根據運算符優先級結合,一步一步分析。

  下面讓我們先從簡單的類型開始慢慢分析吧:

  int p; //這是一個普通的整型變量

  int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指針,然后再與int 結合,說明指針所指向的內容的類型為int 型。所以P 是一個返回整型數據的指針

  int p[3]; //首先從P 處開始,先與[]結合,說明P 是一個數組,然后與int 結合,說明數組里的元素是整型的,所以P 是一個由整型數據組成的數組

  int *p[3]; //首先從P 處開始,先與[]結合,因為其優先級比*高,所以P 是一個數組,然后再與*結合,說明數組里的元素是指針類型,然后再與int 結合,說明指針所指向的內容的類型是整型的,所以P 是一個由返回整型數據的指針所組成的數組

  int (*p)[3]; //首先從P 處開始,先與*結合,說明P 是一個指針

  //然后再與[]結合(與“()”這步可以忽略,只是為

  //了改變優先級),說明指針所指向的內容是一個

  //數組,然后再與int 結合,說明數組里的元素是

  //整型的。所以P 是一個指向由整型數據組成的數

  //組的指針

  int **p; //首先從P 開始,先與*結合,說是P 是一個指針,然

  //后再與*結合,說明指針所指向的元素是指針,然

  //后再與int 結合,說明該指針所指向的元素是整

  //型數據。由于二級指針以及更高級的指針極少用

  //在復雜的類型中,所以后面更復雜的類型我們就

  //不考慮多級指針了,最多只考慮一級指針。

  int p(int); //從P 處起,先與()結合,說明P 是一個函數,然后進入

  //()里分析,說明該函數有一個整型變量的參數

  //然后再與外面的int 結合,說明函數的返回值是

  //一個整型數據

  Int (*p)(int); //從P 處開始,先與指針結合,說明P 是一個指針,然后與

  //()結合,說明指針指向的是一個函數,然后再與()里的

  //int 結合,說明函數有一個int 型的參數,再與最外層的

  //int 結合,說明函數的返回類型是整型,所以P 是一個指

  //向有一個整型參數且返回類型為整型的函數的指針

  int *(*p(int))[3]; //可以先跳過,不看這個類型,過于復雜

  //從P 開始,先與()結合,說明P 是一個函數,然后進

  //入()里面,與int 結合,說明函數有一個整型變量

  //參數,然后再與外面的*結合,說明函數返回的是

  //一個指針,,然后到最外面一層,先與[]結合,說明

  //返回的指針指向的是一個數組,然后再與*結合,說

  //明數組里的元素是指針,然后再與int 結合,說明指

  //針指向的內容是整型數據。所以P 是一個參數為一個

  //整數據且返回一個指向由整型指針變量組成的數組

  //的指針變量的函數。

  說到這里也就差不多了,我們的任務也就這么多,理解了這幾個類型,其它

  的類型對我們來說也是小菜了,不過我們一般不會用太復雜的類型,那樣會

  大大減小程序的可讀性,請慎用,這上面的幾種類型已經足夠我們用了。

  1、細說指針

  指針是一個特殊的變量,它里面存儲的數值被解釋成為內存里的一個地址。

  要搞清一個指針需要搞清指針的四方面的內容:指針的類型、指針所指向的

  類型、指針的值或者叫指針所指向的內存區、指針本身所占據的內存區。讓

  我們分別說明。

  先聲明幾個指針放著做例子:

  例一:

  (1)int*ptr;

  (2)char*ptr;

  (3)int**ptr;

  (4)int(*ptr)[3];

  (5)int*(*ptr)[4];

  1.指針的類型

  從語法的角度看,你只要把指針聲明語句里的指針名字去掉,剩下的部

  分就是這個指針的類型。這是指針本身所具有的類型。讓我們看看例一中各

  個指針的類型:

  (1)int*ptr;//指針的類型是int*

  (2)char*ptr;//指針的類型是char*

  (3)int**ptr;//指針的類型是int**

  (4)int(*ptr)[3];//指針的類型是int(*)[3]

  (5)int*(*ptr)[4];//指針的類型是int*(*)[4]

  怎么樣?找出指針的類型的方法是不是很簡單?

  2.指針所指向的類型

  當你通過指針來訪問指針所指向的內存區時,指針所指向的類型決定了

  編譯器將把那片內存區里的內容當做什么來看待。

  從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲

  明符*去掉,剩下的就是指針所指向的類型。例如:

  (1)int*ptr; //指針所指向的類型是int

  (2)char*ptr; //指針所指向的的類型是char

  (3)int**ptr; //指針所指向的的類型是int*

  (4)int(*ptr)[3]; //指針所指向的的類型是int()[3]

  (5)int*(*ptr)[4]; //指針所指向的的類型是int*()[4]

  在指針的算術運算中,指針所指向的類型有很大的作用。

  指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你

  對C 越來越熟悉時,你會發現,把與指針攪和在一起的“類型”這個概念分成

  “指針的類型”和“指針所指向的類型”兩個概念,是精通指針的關鍵點之一。

  我看了不少書,發現有些寫得差的書中,就把指針的這兩個概念攪在一起了,

  所以看起書來前后矛盾,越看越糊涂。

  3.指針的值----或者叫指針所指向的內存區或地址

  指針的值是指針本身存儲的數值,這個值將被編譯器當作一個地址,而

  不是一個一般的數值。在32 位程序里,所有類型的指針的值都是一個32 位

  整數,因為32 位程序里內存地址全都是32 位長。指針所指向的內存區就

  是從指針的值所代表的那個內存地址開始,長度為si zeof(指針所指向的類

  型)的一片內存區。以后,我們說一個指針的值是XX,就相當于說該指針指

  向了以XX 為首地址的一片內存區域;我們說一個指針指向了某塊內存區域,

  就相當于說該指針的值是這塊內存區域的首地址。

  指針所指向的內存區和指針所指向的類型是兩個完全不同的概念。在例

  一中,指針所指向的類型已經有了,但由于指針還未初始化,所以它所指向

  的內存區是不存在的,或者說是無意義的。

  以后,每遇到一個指針,都應該問問:這個指針的類型是什么?指針指

  的類型是什么?該指針指向了哪里?(重點注意)

  4 指針本身所占據的內存區

  指針本身占了多大的內存?你只要用函數sizeof(指針的類型)測一下

  就知道了。在32 位平臺里,指針本身占據了4 個字節的長度。

  指針本身占據的內存這個概念在判斷一個指針表達式(后面會解釋)是

  否是左值時很有用。

  2、指針的算術運算

  指針可以加上或減去一個整數。指針的這種運算的意義和通常的數值的加減

  運算的意義是不一樣的,以單元為單位。例如:

  例二:

  char a[20];

  int *ptr=(int *)a; //強制類型轉換并不會改變a 的類型

  ptr++;

  在上例中,指針ptr 的類型是int*,它指向的類型是int,它被初始化

  為指向整型變量a。接下來的第3 句中,指針ptr 被加了1,編譯器是這樣

  處理的:它把指針ptr 的值加上了sizeof(int),在32 位程序中,是被加上

  了4,因為在32 位程序中,int 占4 個字節。由于地址是用字節做單位的,

  故ptr 所指向的地址由原來的變量a 的地址向高地址方向增加了4 個字節。

  由于char 類型的長度是一個字節,所以,原來ptr 是指向數組a 的第0 號

  單元開始的四個字節,此時指向了數組a 中從第4 號單元開始的四個字節。

  我們可以用一個指針和一個循環來遍歷一個數組,看例子:

  例三:

  int array[20]={0};

  int *ptr=array;

  for(i=0;i《20;i++)

  {

  (*ptr)++;

  ptr++;

  }

  這個例子將整型數組中各個單元的值加1。由于每次循環都將指針ptr

  加1 個單元,所以每次循環都能訪問數組的下一個單元。

  再看例子:

  例四:

  char a[20]=“You_are_a_girl”;

  int *ptr=(int *)a;

  ptr+=5;

  在這個例子中,ptr 被加上了5,編譯器是這樣處理的:將指針ptr 的

  值加上5 乘sizeof(int),在32 位程序中就是加上了5 乘4=20。由于地址

  的單位是字節,故現在的ptr 所指向的地址比起加5 后的ptr 所指向的地址

  來說,向高地址方向移動了20 個字節。在這個例子中,沒加5 前的ptr 指

  向數組a 的第0 號單元開始的四個字節,加5 后,ptr 已經指向了數組a 的

  合法范圍之外了。雖然這種情況在應用上會出問題,但在語法上卻是可以的。

  這也體現出了指針的靈活性。

  如果上例中,ptr 是被減去5,那么處理過程大同小異,只不過ptr 的

  值是被減去5 乘sizeof(int),新的ptr 指向的地址將比原來的ptr 所指向

  的地址向低地址方向移動了20 個字節。

  下面請允許我再舉一個例子:(一個誤區)

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

評論

查看更多

下載排行

本周

  1. 1PIC12F629/675 數據手冊免費下載
  2. 2.38 MB   |  36次下載  |  5 積分
  3. 2PIC16F716 數據手冊免費下載
  4. 2.35 MB   |  18次下載  |  5 積分
  5. 3STC15系列常用寄存器匯總免費下載
  6. 1.60 MB   |  7次下載  |  5 積分
  7. 4AN158 GD32VW553 Wi-Fi開發指南
  8. 1.51MB   |  2次下載  |  免費
  9. 5模擬電路仿真實現
  10. 2.94MB   |  2次下載  |  免費
  11. 6AN148 GD32VW553射頻硬件開發指南
  12. 2.07MB   |  1次下載  |  免費
  13. 7PZT驅動開關電路
  14. 0.09 MB   |  1次下載  |  免費
  15. 8電子線路板及仿真實現
  16. 1.54MB   |  1次下載  |  免費

本月

  1. 1ADI高性能電源管理解決方案
  2. 2.43 MB   |  452次下載  |  免費
  3. 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
  4. 5.67 MB   |  139次下載  |  1 積分
  5. 3基于STM32單片機智能手環心率計步器體溫顯示設計
  6. 0.10 MB   |  133次下載  |  免費
  7. 4PIC12F629/675 數據手冊免費下載
  8. 2.38 MB   |  36次下載  |  5 積分
  9. 5美的電磁爐維修手冊大全
  10. 1.56 MB   |  24次下載  |  5 積分
  11. 6如何正確測試電源的紋波
  12. 0.36 MB   |  19次下載  |  免費
  13. 7PIC16F716 數據手冊免費下載
  14. 2.35 MB   |  18次下載  |  5 積分
  15. 8萬用表UT58A原理圖
  16. 0.09 MB   |  9次下載  |  5 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935121次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420062次下載  |  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  |  73810次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
516棋牌游戏| rmb百家乐的玩法技巧和规则| 百家乐官网牡丹娱乐城| 都匀市| 财神真人娱乐城| 皇冠网最新网址| 伟易博百家乐官网现金网| 金城百家乐官网玩法平台| 百家乐官网真人游戏投注网| 百家乐官网游戏网站| 百家乐官网伴侣破解版| 百家乐官网破解分| 百家乐必学技巧| 圆梦城百家乐娱乐城| 威尼斯人娱乐城信誉好不好| 大发88817| 茌平县| 百家乐官网扑克片礼服| 58百家乐官网的玩法技巧和规则| 网上百家乐靠谱吗| 怎样玩百家乐的玩法技巧和规则 | 沙龙国际娱乐| 皇冠百家乐官网客户端皇冠| 百家乐官网庄闲筹码| 百家乐官网博彩免费体验金3| 百家乐视频网络游戏| 机械手百家乐的玩法技巧和规则| 亲朋棋牌刷金币| 乌海市| 百家乐官网套利| 现金百家乐赌法| 德州扑克过牌| 澳门百家乐官网大小| 高级百家乐官网桌布| 百家乐高手怎么下注| 大发888易付168 充值| 真人百家乐官网在线玩| 海港城百家乐官网的玩法技巧和规则 | 捷豹百家乐娱乐城| 永胜博娱乐| 百家乐官网娱乐真人娱乐|