《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > 看完還不會指針,錘自己!

看完還不會指針,錘自己!

2022-11-23
作者: 電子技術應用專欄作家 一口Linux
來源: 電子技術應用專欄作家 一口Linux
關鍵詞: 指針 C語言

  指針使得 C 語言能夠更高效地實現對計算機底層硬件的操作,而計算機硬件的操作很大程度上依賴地址,指針便提供了一種對地址操作的方法,在一定意義上,指針是c語言的精髓,所以一定要耐心看完。

  指針對于很多c語言初學者來說可能難以理解,一不小心可能被指針的指向關系繞進去,在這里就對指針做一些總結,寫一下自己的理解。

  一. 指針的介紹

  在程序中,我們聲明一個變量(int a = 1),將數據1存到變量a中,計算機內部會將這個數據存到內存(RAM)中,那么,數據存到某個地方,就會涉及地址。就像你買的快遞,快遞到了就要存到某個驛站里面放著,你的快遞就是一個數據,驛站就是一個變量,這個驛站就要有地址,不然全國這么多驛站你怎么知道你的快遞在哪個驛站。

  到這里,地址的概念應該有了吧。

  現在想想地址(比如0x0000 0001)不也是一個數據嗎,那么不也可以用一個變量存地址這個數據?是的,可以,這個變量就是指針,指針它就是存儲另一個變量的內存地址的一種數據類型,即指針的內容就是另一個變量的內存地址。

  指針本身也是一個變量,所以指針變量也有自己的地址,只是它有點特殊,它存放的是另一個變量的地址而已,理解這句話就行。

  前面講到過指針它是一種數據類型,為了方便,我們就規定在這種類型后面加*號表示該類型指針,有char型指針(char *)、double型指針(double *)和int型指針(int *)等等。

  試著敲一下下面一段代碼,可以加深對指針的認識:

  int a = 1;       // 定義一個int型變量

  int *p = &a;     // 定義一個int型指針p,&a表示對a取地址,指針p的內容是a的地址

  // int  *p;   p = &a;    // 第二行也可以這樣寫,意思一樣

  printf("%p\n", &a);      // 打印a的地址

  printf("%p\n", p);       // 打印指針p指向的地址

  // %p是打印地址(指針地址),是十六進制的形式

  C/C++ 中規定了 * 操作符來從對應指針類型存放的地址中拿出相應數據,再定義一個變量int b = *p,指針p存了a的地址,*p就是拿出a的值,b的值就變成了1,*操作也被稱為解引用。

  二. 指針的相關操作(運算)

  算數運算:+、-、++、--、

  指針的運算是特別容易搞錯的,千萬不能以為和普通類型(比如int型數據)的運算一樣。

  指針的加減運算:

  1.指針+1/指針-1,加/減的是整個指針類型的長度,與其說指針的加減法,我認為不如說成指針的偏移更合適,接下來看為什么是偏移,舉個非常明顯的例子:

  char a[5] = {1, 2, 3, 4, 5};  // 定義一個char型數組,這里的a實質上是一個指針,指向這個數組的首元素a[0]的指針

  char *p = a;

  printf("%d\n", *p);        // 輸出1 --> a[0]

  printf("%d\n", *(p + 1));  // 輸出2 --> a[1]

  ......

  看輸出的結果就很容易看出規律,p指針指向a[0],特別注意p+1指針變成指向a[1],所以*(p+1)  = a[1] = 2,而不是*(p+1)  = a[0] + 1 = 2,當然這里兩個答案湊巧一樣,但是把數組的內容換一下就不會是一樣了,如果是改成(*p) + 1,那么就是(*p) + 1 = a[0] + 1 = 2,同理可以改成p+2、p+3......

  還有試著定義其它類型的數組(比如int型:int a[5] = {1, 2, 3, 4, 5};),看看是不是這個規律,就可以知道指針加減的是這個指針類型的長度,也就是指針的偏移,還可以嘗試定義結構體數組,將會有更深的理解。

  減法就不用多說了,理解了指針p+1/p-1,那么指針p++/p--其實是一樣的,都是偏移。

  三. 多級指針

  說起多級指針這個東西,曾經大一學c語言的時候,學到二級指針都已經把我給繞暈了,如果當時你給我寫個int ********p出來,我估計直接崩潰到放棄。

  我們先來說說二級指針吧!前面有講到,指針也是一種數據類型,是一種變量,也有自己的地址,所以既然有地址,而指針就是存放另一個變量的地址的呀,那為什么不能再用一個指針存放這個指針的地址呢,對吧!所以就有了二級指針,就是指向指針的指針。

  ok!來點生活上的東西,快遞柜大家都用過吧,快遞小哥給你發一個取件碼你就能拿到快遞。

  微信截圖_20221123161725.png

  這里的每一個柜子就是一塊內存,取件碼就是地址,柜子里的快遞就是存儲在內存的內容/數據。

  假如快遞小哥把你的快遞放到"058柜子",給你發取件碼,那么你輸入取件碼就可以取到快遞。

  微信截圖_20221123161816.png

  如果快遞小哥逗你一下,故意給你發"057柜子"的取件碼,然后在"057柜子"放一張紙條,上面寫:快遞在058柜子,這時候你肯定是按照紙條從"058柜子"里就可以拿到快遞。

  這里的"057柜子"就是指針,指針里面存放另一個變量(058柜子)的地址。

  微信截圖_20221123161828.png

  如果快遞小哥給你發"056柜子"的取件碼,在"056柜子"里放一張紙條寫:快遞在"057柜子"里,又在"057柜子"里放一張紙條寫:快遞在"058柜子"里。

  這里的"056柜子"就是二級指針,"057柜子"就是指針,"058柜子"就是指針存放的另一個變量。

  微信截圖_20221123161846.png

  現在明白了二級指針吧,那么,N級指針也就那樣,也就是指向指針的指針的指針的指針的指針........,是不是非常簡單!

  int a = 1;

  int *p = &a;

  int **pp = &p;     // 二級指針pp存放指針p的地址,即二級指針pp指向指針p

  int ***ppp = &pp;  // 三級指針ppp存放二級指針pp的地址,即三級指針ppp指向二級指針pp

  ......

  總之,如果一個內存如果存放的是另一個變量的地址,那么就叫指針。一塊內存要么存放實際內容/數據,要么存放的是另一個變量的地址,確實是剛剛所說的非常簡單。

  【總結兩點】:

  1. 指針本身也是一個變量,也有自己的地址,需要內存存儲。

  2. 指針存放的是所指向的變量的地址,這個所指向的變量也可以是一個指針。

  【特別注意】:面試可能被問到指針的大小

  1. 指針的大小跟指針是什么類型的沒有任何關系。

  2. 在32為系統系統中,所有的指針大小都是4個字節,原因是32系統上所有變量的地址都是32位的,而指針用來存地址的。

  最后,大家要明白一個概念,其實并沒有什么多級指針這種東西,多級指針就是個指針,稱為多級指針是為了我們方便表達而取的邏輯名稱。

  四. 多維數組

  二維數組其實和二級指針有著相似的理解方法:

  比如a[3][2],把它理解成一個一維數組來看待,這個一維數組里面有三個元素,只是這個一維數組有點特殊,它的每個元素又是一個一維數組而已。

  懂了上面這段話,二維數組就很好理解。

  前面我們已經知道一維數組a[3]中,a實質上是一個指針,指向這個數組首元素a[0]:

  int a[3] = {1, 2, 3};

  // a[0]  -->  *a

  printf("%d\n", *a);       // 打印 1  -->  a[0] 的值

  // a[1]  -->  *(a + 1)

  printf("%d\n", *(a + 1)); // 打印 2  -->  a[1] 的值

  // a[2]  -->  *(a + 2)

  printf("%d\n", *(a + 2)); // 打印 3  -->  a[2] 的值

  那么,二維數組a[3][2]當成一維數組看是不是可以得出:

  int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};

  // a[0][0]  -->  (*a)[0]

  printf("%d\n", (*a)[0]);       // 打印 1  -->  a[0][0] 的值

  // a[1][0]  -->  (*(a + 1))[0]

  printf("%d\n", (*(a + 1))[0]); // 打印 3  -->  a[1][0] 的值

  // a[2][0]  -->  (*(a + 2))[0]

  printf("%d\n", (*(a + 2))[0]); // 打印 5  -->  a[2][0] 的值

  // a[2][1]  -->  (*(a + 2))[1]

  printf("%d\n", (*(a + 2))[1]); // 打印 6  -->  a[2][1] 的值

  // ..... 二維數組其它元素類似都可以輸出

  結論一:a[m][n]  等價于 (*(a + m)[n]  -->就是一個數組指針(后面會提到)

  基于前面兩種指針和數組的變換,可以繼續得出:

  int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};

  // a[0][0]  -->  (*a)[0]  -->  *(*a + 0)  -->  把 *a 當成整體

  printf("%d\n", *(*a));           // 打印 1  -->  a[0][0] 的值

  // a[1][0]  -->  (*(a + 1))[0]  -->  *(*(a + 1) + 0)

  printf("%d\n", *(*(a + 1)));     // 打印 3  -->  a[1][0] 的值

  // a[2][0]  -->  (*(a + 2))[0]  -->  *(*(a + 2) + 0)

  printf("%d\n", *(*(a + 2)));     // 打印 5  -->  a[2][0] 的值

  // a[2][1]  -->  (*(a + 2))[1]  -->  *(*(a + 2) + 1)

  printf("%d\n", *(*(a + 2) + 1)); // 打印 6  -->  a[2][1] 的值

  // ..... 二維數組其它元素類似都可以輸出

  結論二:a[m][n]   等價于   *(*(a + m) + n)

  五. 數組指針與指針數組

  1. 數組指針:指針在后,說明它就是個指針,所以數組指針指向的是數組,相當于一次聲明了一個指針。從前面就已經知道,二維數組a[3][2]中,a實質上就是一個數組指針。

  公式:

  指向的那個數組的元素類型  (*指針名字)[指向的數組的元素個數]

  2. 指針數組:數組在后,說明它就是個數組。字符數組是什么?就是存放字符的數組,那么指針數組就是存放指針類型的數組,相當于一次聲明了多個指針。

  公式:

  數組元素的類型  數組名字[數組元素個數]

  char *a[3] = {"red", "green", "blue"};

  char **pp = a;    //定義二級指針pp, a本質上相當于二級指針

  printf("%s\n", pp[0]);    // 打印 red

  printf("%s\n", pp[1]);    // 打印 green

  printf("%s\n", pp[2]);    // 打印 blue

  直觀上區分數組指針和指針數組的方法:

  由于數組指針的 [] 比 * 的優先級高,所以數組指針的指針加括號,所以看看指針有沒有用圓括號括起來,就可以區分開。

  六. 其它

  關于指針想寫的內容還有很多,其實這只是開了個頭,比如:野指針、函數指針、函數參數傳遞方式、const 修飾指針、動態內存分配: malloc 和 free、堆, 棧、內存泄露......,以后再慢慢補齊。

  指針在鏈表使用的比較多,多寫一些鏈表的操作會對指針理解很有幫助,鏈表節點的增加、刪除、修改、查找,單向鏈表、雙向鏈表、雙向循環鏈表、內核鏈表等等。

 更多信息可以來這里獲取==>>電子技術應用-AET<<

微信圖片_20210517164139.jpg

微信圖片_20220701092006.jpg

電子技術應用專欄作家 一口Linux

原文鏈接:https://mp.weixin.qq.com/s/t7vomHGTMJ179XTmuJjDqQ

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美视频中文在线看| 欧美一区二区三区在线| 亚洲欧美中日韩| 一本久久a久久免费精品不卡| 欧美日本三级| 国产精品色婷婷久久58| 狠狠色狠狠色综合日日91app| 亚洲欧美清纯在线制服| 欧美日韩亚洲免费| 亚洲黄色一区二区三区| 激情五月综合色婷婷一区二区| 欧美日韩在线综合| 黄色欧美日韩| 欧美成人国产一区二区| 在线日韩视频| 欧美激情1区| 亚洲尤物视频在线| 亚洲欧美日韩国产综合| 免费在线欧美黄色| 欧美成人激情视频免费观看| 亚洲人成人一区二区三区| 欧美一区二区在线视频| 亚洲女人天堂av| 欧美日韩免费区域视频在线观看| 一区二区三区国产| 久久久在线视频| 亚洲欧美日韩国产综合| 国产农村妇女毛片精品久久莱园子| 亚洲综合视频一区| 国产精品男gay被猛男狂揉视频| 久久久视频精品| 亚洲高清不卡| 国产精品高潮呻吟久久| 精品动漫3d一区二区三区| 欧美精品在线视频观看| 久久综合九色综合欧美狠狠| 亚洲综合色在线| 欧美激情亚洲| 久久aⅴ乱码一区二区三区| 亚洲欧美一区二区三区久久| 欧美精品一区三区在线观看| 久久国产主播精品| 亚洲美女视频网| 国产精品女人久久久久久| 国产精品久久夜| 国产精品日本一区二区| 国产精品久久久久久一区二区三区| 亚洲日本欧美天堂| 久久欧美肥婆一二区| 欧美精品97| 国产欧美91| 国产欧美一区二区三区国产幕精品| 国产精品久久二区二区| 影音先锋日韩资源| 亚洲国产日韩在线| 性欧美超级视频| 久久亚洲综合| 另类成人小视频在线| 亚洲主播在线| 欧美人与性禽动交情品| 欧美日韩一区二区在线播放| 在线看成人片| 国产精品国产三级国产aⅴ无密码| 欧美片在线观看| 久久躁狠狠躁夜夜爽| 欧美日本免费一区二区三区| 日韩一级黄色大片| 国产乱码精品1区2区3区| 曰本成人黄色| 欧美日韩午夜在线视频| 在线播放中文字幕一区| 亚洲婷婷免费| 国产精品一区二区久久| 亚洲综合精品四区| 欧美日韩日韩| 国产真实精品久久二三区| 欧美国产高潮xxxx1819| 久久先锋影音av| 亚洲福利国产| 黑人巨大精品欧美一区二区小视频| 日韩性生活视频| 极品尤物久久久av免费看| 亚洲精选在线观看| 亚洲影音先锋| 中日韩高清电影网| 亚洲人成毛片在线播放女女| 国户精品久久久久久久久久久不卡| 一区二区三区视频在线| 欧美在线视频观看| 开心色5月久久精品| 一区二区欧美在线| 亚洲综合清纯丝袜自拍| av成人动漫| 国产日韩在线看| 欧美日韩免费高清一区色橹橹| 国内精品免费午夜毛片| 国产亚洲一本大道中文在线| 久久亚裔精品欧美| 国产真实精品久久二三区| 亚洲福利电影| 国产精品theporn88| 最近中文字幕mv在线一区二区三区四区| 久久一区激情| 国产亚洲欧美日韩一区二区| 一区二区国产精品| 欧美性猛交视频| 亚洲缚视频在线观看| 欧美成人午夜77777| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美激情1区2区| 欧美成人高清| 欧美国产极速在线| 亚洲区国产区| 欧美日韩免费观看一区三区| 欧美日韩免费一区二区三区| 销魂美女一区二区三区视频在线| 久久精品国产成人| 这里只有精品视频| 亚洲一区二区欧美| 久久久精品999| 亚洲小少妇裸体bbw| 久久九九热re6这里有精品| 欧美日本国产一区| 日韩一级在线观看| 欧美日韩一区二区在线观看视频| 亚洲高清在线精品| 国产精品久久久久久亚洲调教| 奶水喷射视频一区| 一区二区三区久久| 亚洲午夜激情网页| 加勒比av一区二区| 亚洲国产精品一区二区三区| 欧美一区二区三区视频免费播放| 精品动漫一区二区| 激情久久影院| 麻豆精品在线观看| 欧美日韩亚洲国产精品| 99国产精品久久久久久久成人热| 亚洲在线国产日韩欧美| 亚洲三级影片| 欧美日韩mp4| 欧美激情视频一区二区三区不卡| 国产婷婷97碰碰久久人人蜜臀| 国产视频一区欧美| 激情亚洲一区二区三区四区| 老巨人导航500精品| 亚洲美女视频| 欧美国产乱视频| 亚洲欧美欧美一区二区三区| 欧美 日韩 国产一区二区在线视频| 激情久久久久久久久久久久久久久久| 亚洲高清不卡| 精品成人一区| 亚洲最新视频在线播放| 亚洲伦理中文字幕| 亚洲欧美日韩综合一区| 亚洲欧洲午夜| 国产精品专区h在线观看| 欧美三级视频在线播放| 欧美日韩精品二区| 国产日韩欧美亚洲一区| 欧美日韩中文字幕综合视频| 久久精品国产99国产精品澳门| 日韩视频免费看| 久久视频在线视频| 一区二区三区高清在线| 一区二区三区黄色| 久久爱www久久做| 亚洲综合国产精品| 国产日韩精品久久| 91久久久久久| 国产日韩欧美a| 亚洲午夜激情免费视频| 欧美激情视频网站| 亚洲性xxxx| 国产免费观看久久黄| 国产一区二区成人久久免费影院| 亚洲欧美自拍偷拍| 狠狠干综合网| 欧美亚洲尤物久久| 国产精品久久波多野结衣| 亚洲一区二区三区中文字幕| 国产精品国产三级国产a| 亚洲国产一区二区三区在线播| 国产精品一卡二| 国产精品一区一区三区| 亚洲欧美综合网| 先锋影音国产一区| 欧美国产精品va在线观看| 久久一区免费| 欧美伊人久久大香线蕉综合69| 国产精品美女久久久久久免费| 在线观看欧美亚洲| 影音先锋在线一区| 亚洲第一精品久久忘忧草社区| 在线综合+亚洲+欧美中文字幕| 欧美精品首页| 狠狠色香婷婷久久亚洲精品| 国产精品xxxav免费视频| 欧美日韩亚洲一区二区三区在线| 欧美a级片网| 国产精品另类一区| 国产精品亚洲综合| 黄色亚洲精品| 免费不卡亚洲欧美| 欧美不卡一卡二卡免费版| 一区二区激情视频| 欧美成人黄色小视频| 欧美成人一品| 久久久国产精品亚洲一区| 欧美激情视频一区二区三区免费| 亚洲激情一区二区| 久久综合伊人77777麻豆| 乱人伦精品视频在线观看| 免费一级欧美片在线播放| 99在线热播精品免费99热| 欧美精品高清视频| 亚洲电影中文字幕| 亚洲国产精品成人久久综合一区| 亚洲国产精品一区二区久| 欧美绝品在线观看成人午夜影视| 国产精品一区免费观看| 国产精品成人一区二区| 亚洲一区三区电影在线观看| 国产欧美成人| 亚洲欧洲一区| 欧美日韩亚洲国产一区| 国产精品久久午夜夜伦鲁鲁| 亚洲另类在线一区| 国产午夜精品视频免费不卡69堂| 国产精品国产三级国产aⅴ入口| 欧美一区二区三区四区在线| 欧美亚洲色图校园春色| 欧美日韩国产区| 欧美视频一区| 欧美日韩国产成人在线| 久久精品国产免费看久久精品| 欧美日韩国产一区| 欧美在线1区| 亚洲视频一区在线观看| 国产欧美一级| 久久香蕉国产线看观看网| 亚洲欧美视频一区| 久久久久久夜精品精品免费| 老司机久久99久久精品播放免费| 欧美色图一区二区三区| 欧美日韩国产成人在线观看| 欧美成人性网| 亚洲人成在线播放| 亚洲精品免费一区二区三区| 亚洲精品中文字幕女同| 欧美一级片一区| 国产精品国产a| 亚洲精品一区二| 亚洲黄色小视频| 亚洲精品久久在线| 亚洲精品一区在线观看| 亚洲人成网站精品片在线观看| 国产日韩亚洲欧美综合| 久久夜色精品国产欧美乱| 欧美成人一区二免费视频软件| 一区二区在线观看视频在线观看| 欧美激情第二页| 亚洲黄色毛片| 亚洲一区二区三区777| 久久不见久久见免费视频1| 欧美亚洲在线播放| 欧美日韩国产综合在线| 久久久av水蜜桃| 欧美一区二区精品在线| 久久在精品线影院精品国产| 狠狠综合久久av一区二区小说| 欧美一区二区三区在线看| 欧美极品一区二区三区| 国产日韩欧美三区| 一二三区精品| 国产精品久久波多野结衣| 久久久91精品| 久久精品国产精品亚洲综合| 欧美日韩国产精品成人| 欧美三级不卡| 欧美视频在线不卡| 蜜臀av在线播放一区二区三区| 久久久99爱| 欧美精品videossex性护士| 国产精品日韩精品欧美在线| 欧美日韩在线一区二区三区| 亚洲第一中文字幕| 欧美一区永久视频免费观看| 国产精品美女久久久久久免费| 久久青草欧美一区二区三区| 久久激情网站| 久久视频在线免费观看| 日韩视频在线观看免费| 国产亚洲一区精品| 国产精品v一区二区三区| 亚洲欧美日韩精品在线| 亚洲午夜国产成人av电影男同| 欧美三级午夜理伦三级中文幕| 亚洲精品久久| 免费成人毛片| 欧美 日韩 国产精品免费观看| 亚洲欧美综合国产精品一区| 午夜久久黄色| 有坂深雪在线一区| 欧美一区二区三区视频| 亚洲国产精品黑人久久久| 欧美福利一区二区三区| 一区二区三区**美女毛片| 亚洲成人资源| 国产欧美日韩综合一区在线播放| 欧美一区国产一区| 亚洲欧美在线一区二区| 久久亚洲精选| 国产精品嫩草久久久久| 亚洲黄色成人久久久| 精品96久久久久久中文字幕无| 夜夜爽99久久国产综合精品女不卡| 欧美精品亚洲一区二区在线播放| 香蕉国产精品偷在线观看不卡| 亚洲欧美久久久久一区二区三区| 久久久噜噜噜久久中文字免| 欧美人与禽性xxxxx杂性| 亚洲乱码视频| 亚洲欧美国产制服动漫| 亚洲美女诱惑| 久久久.com| 国产精品久久久久久福利一牛影视|