999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C語言指針變量研究

2023-05-24 04:51:46史宇軒徐洪麗丁頤寧
科技資訊 2023年8期
關(guān)鍵詞:定義

史宇軒 徐洪麗 丁頤寧

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

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

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

1?指針的定義

1.1?地址和指針

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

將地址形象化地稱為“指針”,注意區(qū)分存儲單元的地址和存儲單元的內(nèi)容。例如:VC++為整型變量分配4個字節(jié),對單精度浮點型變量分配4個字節(jié),對字符型變量分配1個字節(jié)。地址是一個直接存取的概念,必須通過地址才能找到存儲變量值的存儲單元,即“地址”指向了變量的存儲單元,C語言形象地將地址稱為“指針”。因此,一個變量的地址稱為該變量的“指針”。圖1為按變量地址存取變量的方式稱為“直接訪問”方式。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地址下所存儲的內(nèi)容50,因此指針變量是一種間接存取的方式。

1.3??指針變量的定義

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

例如:int?*p;//,int是類型說明符?;*是指針類型說明符;p是變量名

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

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

int?**p;???????//?定義一個指針?p?,該指針指向一個?int?類型的指針

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

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

2?指針變量的賦值和指針運算

2.1?指針變量的賦值

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

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

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

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

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

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

指針的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)在類型聲明中,它是類型說明符,除此之外,出現(xiàn)在表達式中,它是運算說明符,是指針取內(nèi)容運算符*?[3],表示該指針變量間接所指的內(nèi)容。

2.2??指針運算

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

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

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

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

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

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

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

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

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

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

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

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

3?舉例和練習(xí)

例題:輸入兩個整數(shù),采用指針方式從小到大排序。

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

參考文獻:

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

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

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

[4]?尹慧,段華瓊.基于C語言的圖書管理系統(tǒng)的設(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語言程序設(shè)計過程中指針概念的理解及使用[J].信息與電腦(理論版),2020,32(15):111-113

猜你喜歡
定義
以愛之名,定義成長
活用定義巧解統(tǒng)計概率解答題
例談橢圓的定義及其應(yīng)用
題在書外 根在書中——圓錐曲線第三定義在教材和高考中的滲透
永遠不要用“起點”定義自己
海峽姐妹(2020年9期)2021-01-04 01:35:44
嚴昊:不定義終點 一直在路上
華人時刊(2020年13期)2020-09-25 08:21:32
定義“風(fēng)格”
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
有壹手——重新定義快修連鎖
修辭學(xué)的重大定義
主站蜘蛛池模板: 3344在线观看无码| 福利一区在线| 亚洲国产综合精品一区| 中文字幕人成人乱码亚洲电影| 香蕉视频在线观看www| 久久青草热| 欧美亚洲中文精品三区| 免费不卡视频| 国产美女无遮挡免费视频| 亚洲午夜福利精品无码| 中文字幕无码中文字幕有码在线| 最新国产你懂的在线网址| 中文字幕在线一区二区在线| 国产精品九九视频| 亚洲Av激情网五月天| 好吊色国产欧美日韩免费观看| 无码中文字幕精品推荐| 99无码熟妇丰满人妻啪啪| 日本日韩欧美| 国产在线一区二区视频| 狠狠操夜夜爽| 久久国产精品娇妻素人| 国产在线视频欧美亚综合| 国产精品一线天| 操国产美女| 色久综合在线| 三上悠亚精品二区在线观看| 美女毛片在线| 亚洲成人一区二区三区| 国产福利微拍精品一区二区| 国产免费高清无需播放器| 精品偷拍一区二区| 午夜视频www| AV色爱天堂网| 国产成人综合在线观看| 久久人妻xunleige无码| 国产99视频在线| 老司机久久99久久精品播放 | 91在线精品麻豆欧美在线| 日本黄色a视频| 乱码国产乱码精品精在线播放| 国产在线第二页| 国产黄在线观看| 亚洲毛片在线看| 欧美精品三级在线| 自慰高潮喷白浆在线观看| 这里只有精品在线播放| 天堂久久久久久中文字幕| 澳门av无码| 亚洲精品中文字幕无乱码| 免费国产一级 片内射老| 伊人成人在线视频| 思思99热精品在线| 国产麻豆精品手机在线观看| 国产丰满成熟女性性满足视频| 精品伊人久久久久7777人| 欧美亚洲欧美区| 91久久精品日日躁夜夜躁欧美| 国产成人麻豆精品| 极品尤物av美乳在线观看| 亚洲AV无码精品无码久久蜜桃| 日日拍夜夜嗷嗷叫国产| 久久黄色一级片| 久久久久亚洲精品成人网| 五月天福利视频| 国产成人禁片在线观看| 久久综合丝袜长腿丝袜| 动漫精品啪啪一区二区三区| 大香伊人久久| 黑人巨大精品欧美一区二区区| 性欧美精品xxxx| 亚洲精品国产成人7777| 国外欧美一区另类中文字幕| 亚洲国产成人在线| 国内精品免费| 免费在线成人网| 91小视频在线观看免费版高清| 青青青国产视频手机| 久久久久中文字幕精品视频| 国产一级精品毛片基地| 2022国产91精品久久久久久| 99精品国产电影|