• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      C語(yǔ)言指針變量研究

      2023-05-24 04:51:46史宇軒徐洪麗丁頤寧
      科技資訊 2023年8期
      關(guān)鍵詞:數(shù)組指針指向

      史宇軒 徐洪麗 丁頤寧

      摘要:指針在C語(yǔ)言程序設(shè)計(jì)中占有重要的地位,指針變量的靈活性是C語(yǔ)言的主要特色之一。指針變量能夠方便表示各種復(fù)合數(shù)據(jù)類(lèi)型,可以使用數(shù)組和字符串,同時(shí)也可以處理內(nèi)存地址。文章首先論述了指針和地址的關(guān)系,以及指針的定義;其次根據(jù)指針的實(shí)質(zhì)化繁為簡(jiǎn),總結(jié)了3種不同的指針賦值方式;再次,給出了常用的指針運(yùn)算和注意事項(xiàng),最后,輔助以舉例和練習(xí)。指針變量的靈活性也帶給程序一定的危險(xiǎn)性,因此能否正確理解和使用指針是是否掌握C語(yǔ)言的一個(gè)標(biāo)志。

      關(guān)鍵字:地址和指針??指針變量??指針變量賦值???指針變量運(yùn)算

      中圖分類(lèi)號(hào):TP312.1????文獻(xiàn)標(biāo)識(shí)碼:A

      Research?of??Pointer?Variables?in?C?Language

      SHI?Yuxuan?1???XU??Hongli?2*????DING?Yining

      (1.School?of?Computer?Science?and?Technology,?Shangdong?University?of?Technology,?Zibo,?Shandong?Province,?255000?China;?2.School?of?Information?Science?and?Engineering,?Shandong?Agricultural?University,?Taian,?Shandong??Province,271018?China;?3.?College?of?Geodesy?and?Geomatics,?Shandong?University?of?Science?and?Technology,?Qingdao,?Shandong?Province,??266590?China)

      Abstract:?The?pointer?occupies?an?important?position?in?programming?in?C?language,?and?the?flexibility?of?pointer?variables?is?one?of?the?main?features?of?C?language.?Pointer?variables?can?easily?represent?a?variety?of?composite?data?types,?can?use?arrays?and?strings,?and?can?also?handle?memory?addresses.??This?article?firstly?discusses?the?relation?between?pointers?and?addresses?and?the?definition?of?the?pointer,?then?simplifies?the?complex??according?to?the?essence?of?pointer?and?summarizes?three?different?pointer?assignment?methods,?gives?commonly?used?pointer?operations?and?matters?needing?attention?again,?and?finally?gives?auxiliary?examples?and?exercises.?The?flexibility?of?pointer?variables?also?brings?some?risks?to?the?program,?so?whether?you?can?understand?and?use?pointers?correctly?is?a?sign?of?mastery?of?C?language.

      Key?Words:?Address?and??pointer;?Pointer?variable;?Pointer?variable?assignment;?Pointer?variable?operation

      指針變量在C語(yǔ)言程序設(shè)計(jì)中占有重要的地位,已知在程序中定義了一個(gè)變量,在對(duì)該程序進(jìn)行編譯時(shí),首先要借助編譯程序?qū)⑵滢D(zhuǎn)換成目標(biāo)代碼,也就是*.OBJ文件,然后,通過(guò)操作系統(tǒng)將目標(biāo)代碼裝入特定的可標(biāo)識(shí)的內(nèi)存區(qū)域中。編譯系統(tǒng)會(huì)根據(jù)程序中定義的變量類(lèi)型,為該變量分配內(nèi)存單元,該內(nèi)存單元也就是該變量的地址,其內(nèi)容為該變量的內(nèi)容?[1]。因此程序員通過(guò)程序所定義對(duì)象的名稱(chēng)來(lái)訪(fǎng)問(wèn)對(duì)象。假定程序員能夠知道某程序?qū)ο笤趦?nèi)存中的存儲(chǔ)位置,即存放該對(duì)象的首地址,當(dāng)然也可使用該地址訪(fǎng)問(wèn)對(duì)象。C語(yǔ)言能夠滿(mǎn)足以上的需求,提供解決上述問(wèn)題必要的技術(shù)手段,也就是指針變量。

      1?指針的定義

      1.1?地址和指針

      C語(yǔ)言中,指針實(shí)際上就是地址。在計(jì)算機(jī)中,數(shù)據(jù)都是存放在存儲(chǔ)器中的。通常把存儲(chǔ)器中的一個(gè)字節(jié)稱(chēng)為一個(gè)內(nèi)存單元,為了正確地訪(fǎng)問(wèn)這些內(nèi)存單元,必須為每個(gè)內(nèi)存單元編號(hào),該編號(hào)就是地址。根據(jù)該編號(hào)(如變量?int?a=1;的地址&a)即可以找到該變量的內(nèi)容,在地址所表示的內(nèi)存單元中實(shí)際存放的數(shù)據(jù)是該內(nèi)存單元的內(nèi)容,需特別注意的是內(nèi)存單元的地址與內(nèi)存單元的內(nèi)容是兩個(gè)完全不同的概念??梢酝ㄟ^(guò)printf(“%d%d”,&a,a);實(shí)際做個(gè)測(cè)試,即:內(nèi)存儲(chǔ)器中的所有字節(jié)(byte)都擁有一個(gè)編號(hào),該編號(hào)即“地址”,它類(lèi)似于教學(xué)樓中的教室號(hào);數(shù)據(jù)存放在地址所表示的內(nèi)存單元中,類(lèi)似于教室中上課的學(xué)生;因?yàn)橥ㄟ^(guò)地址能找到所需的變量單元,通常說(shuō)地址指向該變量單元。

      將地址形象化地稱(chēng)為“指針”,注意區(qū)分存儲(chǔ)單元的地址和存儲(chǔ)單元的內(nèi)容。例如:VC++為整型變量分配4個(gè)字節(jié),對(duì)單精度浮點(diǎn)型變量分配4個(gè)字節(jié),對(duì)字符型變量分配1個(gè)字節(jié)。地址是一個(gè)直接存取的概念,必須通過(guò)地址才能找到存儲(chǔ)變量值的存儲(chǔ)單元,即“地址”指向了變量的存儲(chǔ)單元,C語(yǔ)言形象地將地址稱(chēng)為“指針”。因此,一個(gè)變量的地址稱(chēng)為該變量的“指針”。圖1為按變量地址存取變量的方式稱(chēng)為“直接訪(fǎng)問(wèn)”方式。int?i=3,j=6,k;???k=i+j;?cout<<k;

      1.2???指針變量

      int?i=3,j=6,k;???int?*i_pointer;?????i_pointer=&i;????*i_pointer=50;如圖2所示:與地址的直接存取不同,指針變量是一種間接存取方式。即先找到變量i_pointer的內(nèi)容2000,再找到該2000地址下所存儲(chǔ)的內(nèi)容50,因此指針變量是一種間接存取的方式。

      1.3??指針變量的定義

      指針變量中存儲(chǔ)的是地址,而不是實(shí)際的數(shù)據(jù),它存儲(chǔ)的是指向該數(shù)據(jù)的地址(閑蕩于房間號(hào)),這是指針變量和普通變量的主要不同。因此,在使用前必須先聲明或定義其為指針變量,并說(shuō)明指針變量中存儲(chǔ)的地址指向的數(shù)據(jù)類(lèi)型(間接存儲(chǔ))。指針類(lèi)型基本定義形式為:類(lèi)型說(shuō)明符??*變量名;其中,*表示該變量是指針變量(存儲(chǔ)地址的),變量名是指針變量名,類(lèi)型說(shuō)明符標(biāo)志了其存儲(chǔ)的地址值所指向的數(shù)據(jù)類(lèi)型[2]。明確了指針變量所指向的變量的類(lèi)型,編譯器就可根據(jù)該類(lèi)型來(lái)讀取內(nèi)存中相應(yīng)的連續(xù)空間。

      例如:int?*p;//,int是類(lèi)型說(shuō)明符?;*是指針類(lèi)型說(shuō)明符;p是變量名

      int?*?arr[8]//?聲明一個(gè)指向整型數(shù)據(jù)的指針數(shù)組,有8個(gè)元素。

      int?(*arr)[10]?//?定義一個(gè)數(shù)組指針,該指針指向一個(gè)?int?類(lèi)型的一維數(shù)組

      int?**p;???????//?定義一個(gè)指針?p?,該指針指向一個(gè)?int?類(lèi)型的指針

      數(shù)組指針:數(shù)組指針可以理解為“數(shù)組的指針”,是指針,該指針指向數(shù)組,即是指向數(shù)據(jù)的指針,它的長(zhǎng)度由數(shù)組本身決定。即首先這個(gè)變量是一個(gè)指針,該指針存放的是地址,類(lèi)似于int?a[5][6]?數(shù)組中的?a,a+1?,a+2?等,是指向行的地址,并沒(méi)有精確到具體的列值。指針數(shù)組:指針數(shù)組是“指針的數(shù)組”,?是數(shù)組,該數(shù)組元素為指針類(lèi)型。

      指針變量的定義中需要說(shuō)明兩問(wèn)題:?1)?用“*”定義該變量為指針變量2)指針變量名;3)?說(shuō)明該變量的名稱(chēng),及其間接指向數(shù)據(jù)的類(lèi)型。指針變量在使用前必須先初試化。初試化之前不會(huì)自動(dòng)分配內(nèi)存空間。

      2?指針變量的賦值和指針運(yùn)算

      2.1?指針變量的賦值

      根據(jù)指針變量的定義和含義,指針變量的內(nèi)容應(yīng)該是編譯后有具體位置的地址。關(guān)于地址,語(yǔ)言中,普通變量有地址,數(shù)組的名字代表數(shù)組的首地址。即?int?arr[10];??則a即與第一個(gè)元素的地址&arr[0]的值是一樣。可以通過(guò)printf(”%d%d",arr,&arr[0])測(cè)試。即:

      int?arr[10];??/*定義包含10個(gè)整型數(shù)據(jù)的數(shù)組*/

      int?*p1;????/*定義p1為指向整型變量的指針*/

      P1=arr;?/*把數(shù)組arr的首地址賦給指針變量p*/

      P1=&arr[0];??/*?把a(bǔ)rr[0]元素的地址賦給指針變量p1。即p1指向數(shù)組arr的第0號(hào)元素。*/

      因此指針變量的賦值有以下三種基本形式:

      指針的3種賦值方式

      Int?a=1,*p;?P=&a;?//?a為普通變量

      Int?a[10],*p;P=a?;//為數(shù)組?程序1為示例

      P2=p1;//?p1已經(jīng)按照上述兩種方式賦值

      注意:“*”出現(xiàn)在不同的位置有不同的意義。出現(xiàn)在類(lèi)型聲明中,它是類(lèi)型說(shuō)明符,除此之外,出現(xiàn)在表達(dá)式中,它是運(yùn)算說(shuō)明符,是指針取內(nèi)容運(yùn)算符*?[3],表示該指針變量間接所指的內(nèi)容。

      2.2??指針運(yùn)算

      常用的指針運(yùn)算有”*”間接訪(fǎng)問(wèn)內(nèi)存,單目運(yùn)算符。++/--自增或自減運(yùn)算符,單目運(yùn)算符[4]。另外還用常用的關(guān)系運(yùn)算符:>,<,>=,<=,!=。基礎(chǔ)必備知識(shí):

      *++p?相當(dāng)于??*(++p)?或者?a[++i],?先對(duì)p做加運(yùn)算,再做*運(yùn)算。

      *p++?相當(dāng)于??*(p++)??或a[i++],先對(duì)?p進(jìn)行取內(nèi)容“*”運(yùn)算,在使?向下移動(dòng)一位。

      (*p)++??先取*p的值,再將數(shù)值自加。++(*p)??先將*p值自加,再取*的值。因此:

      P+i和a+i都表示a[i]的地址,即它們都指向數(shù)組中第i號(hào)元素,即指向a[i]。

      *(P+i)和*(a+i)都表示P+i和a+i所指向?qū)ο蟮膬?nèi)容即a[i]。

      指向數(shù)組元素的指針,即允許指針變量帶下標(biāo),如p[i]與*(p+i)等價(jià)。

      假如p=a+5,則p[2]就相當(dāng)于*(p+2),即p[7],p[-3]就相當(dāng)于*(p-3),即p[2]。

      等價(jià)關(guān)系??p+i?---?a+i??即從當(dāng)前p指向地址往后移i個(gè)元素的地址。

      p=a;?*(p+5)---*(a+5)---a[5]?---p[5]???這幾種方式是a[5]的不同表示方法。

      注意:*和&、++、--都是一元運(yùn)算,它們的優(yōu)先級(jí)比所有的算術(shù)運(yùn)算符都高。*其結(jié)合性為自右至左?。?*p++等價(jià)于*(p++)。

      兩指針變量之間的運(yùn)算:指針變量不指向同一數(shù)組,它們之間的運(yùn)算沒(méi)有意義,即僅僅當(dāng)兩指針變量指向同一數(shù)組時(shí),運(yùn)算才有意義[5]。一般情況下,兩個(gè)指針變量表示同一個(gè)數(shù)組中的元素,它們可以進(jìn)行關(guān)系運(yùn)算,運(yùn)算結(jié)果表示它們所指數(shù)組元素的地址之間的關(guān)系[6]。例如:?p1=p2表示p1和p2指向同一數(shù)組元素;p1>p2表示p1處于高地址位置;p1<p2表示p1處于低地址位置。但是p1+p2是沒(méi)有真實(shí)意義的。

      3?舉例和練習(xí)

      例題:輸入兩個(gè)整數(shù),采用指針?lè)绞綇男〉酱笈判颉?/p>

      #?include?<stdio.h>

      void?main()

      {???int?i,j,k;??int?t;

      int?*p=&i,*q=&j;

      *p=2;*q=1;

      if??(*p>*q)

      {????t=*p;???????*p=*q;??????*q=t;??}

      printf("*p=%d,*q=%d\n",*p,*q);

      4??總結(jié)

      指針在C語(yǔ)言程序設(shè)計(jì)中占有重要的地位,與其它語(yǔ)言相比,指針變量的靈活性是C語(yǔ)言的主要特色之一。指針極大地豐富了C語(yǔ)言的功能,但是凡事有兩面性,指針變量的靈活性也帶給程序一定的危險(xiǎn)性,因此能否正確理解和使用指針是能夠否掌握C語(yǔ)言的一個(gè)標(biāo)志。

      參考文獻(xiàn):

      [1]?王鋮.?一些C庫(kù)函數(shù)的實(shí)現(xiàn)[D].吉林大學(xué)?2021:1-2

      [2]?徐洪麗?語(yǔ)言程序設(shè)計(jì)[M].??北京師范大學(xué)出版社?2019:?199-200

      [3]?李琨,賈立偉,石曉明.C程序設(shè)計(jì)語(yǔ)言中文件讀取問(wèn)題探析[J].電腦編程技巧與維護(hù),2022(02):23-25.

      [4]?尹慧,段華瓊.基于C語(yǔ)言的圖書(shū)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息與電腦(理論版),2021,33(23):116-118

      [5]??Baltasar?Garcia?Perez‐Schofield,Matías?Garcia?Rivera,F(xiàn)rancisco?Ortin,Maria?J.?Lado.?Learning?memory

      management?with?C‐Sim:?A?C‐based?visual?tool[J].?Computer?Applications?in?Engineering?Education,2019(5):27-28.

      [6]?岳珊.C語(yǔ)言程序設(shè)計(jì)過(guò)程中指針概念的理解及使用[J].信息與電腦(理論版),2020,32(15):111-113

      猜你喜歡
      數(shù)組指針指向
      JAVA稀疏矩陣算法
      科學(xué)備考新指向——不等式選講篇
      JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
      偷指針的人
      把準(zhǔn)方向盤(pán) 握緊指向燈 走好創(chuàng)新路
      為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
      尋找勾股數(shù)組的歷程
      基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
      ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
      VB數(shù)組在for循環(huán)中的應(yīng)用
      考試周刊(2012年88期)2012-04-29 04:36:47
      拉萨市| 项城市| 岚皋县| 文登市| 固安县| 云林县| 苏尼特左旗| 小金县| 定兴县| 确山县| 信宜市| 镇赉县| 泸州市| 商都县| 河源市| 昌江| 稷山县| 彭泽县| 万全县| 高邮市| 邵阳市| 喜德县| 疏勒县| 穆棱市| 富民县| 望谟县| 维西| 九龙城区| 黄骅市| 新河县| 高邑县| 房山区| 米易县| 尼玛县| 巴青县| 湖州市| 格尔木市| 郸城县| 澜沧| 饶河县| 阜宁县|