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

從內存的角度解析C語言中的指針

2021-01-18 04:37:38張天友
現代計算機 2020年33期
關鍵詞:區域信息

張天友

(無錫科技職業學院智能制造學院,無錫214000)

0 引言

C語言語法簡潔、運算符豐富、編程靈活、可移植性高,是一門重要的計算機語言。在C語言中,通過指針可以實現硬件的訪問、動態分配和收回內存、減少全局變量的使用、實現函數的回調功能等,被稱為C語言的“靈魂”;但是指針概念抽象,難以把握,使用不當會導致程序退出和內存泄露,甚至系統崩潰,成為學習C語言的難點。

在C Primer Plus[1]一書中,將指針定義為一種變量,其值為內存地址(Basically,a pointer is a variable,(or more generally,a data object),whose value is a memory address)。通過這個定義,理解指針的前提是,理解變量和變量值,內存和內存地址。Data object is a general term for a region of data storage that can be used to hold values.The C standard uses just the term object for this concept.One way to identify an object is by using the name of a variable。數據對象指的是內存的一部分,在C語言標準中稱為對象,定位該對象的方法之一是通過變量名。在A Reference Manual[2]中,指針被定義為,指向類型的對象,指針本身也是一種對象,該對象的值為內存的地址(For any type T,a pointer type“pointer to T”may be formed.A value of pointer type is the address of an object or function of type T.)類型的定義:A type is a set of value and a set of operations on those values。類型是一個數值集合以及對這個數值集合的操作。指針在The C Programming Language[3]一種中的定義為:指針是一種變量,該變量的值時其他變量的內存地址。(A pointer is a variable that contains the address of a vari?able.)Variables and constants are the basic data objects manipulated in a program。變量和常量是程序處理的兩種基本對象。A data object is a named region of storage.一個對象是一個命名的存儲區域。

分析上述C語言領域經典資料對指針及其指針相關概念的定義可知,內存是把握和理解“指針”概念的核心所在。在閻石教授所著的《數字電子技術基礎》中[4],把內存定義為:一種能夠存儲大量二值信息(或稱為數據)的器件[5]。本文利用開關的“閉”“開”兩種狀態,來表示存儲器中的“二值信息”。利用64個“開關”,構建了可論述的內存模型。以此為基礎介紹了C語言中變量、類型、指針等概念的核心特點。

1 內存

1.1 由“開關”到“內存”

對于一個普通的物理開關,存在兩種狀態,開和關;即通電和斷電兩種狀態。假設“開”的狀態,用“0”來表示,“關”的狀態用“1”來表示,那么開關的兩種狀態就可以表示“1”和“0”。表述了內存的特點:“二值信息”。若將8個開關排成一排,得到的結果如圖2所示。圖2中,底部的一行全部為關閉狀態;中間一行,部分處于打開,部分處于關閉;上面一行處于全部打開狀態。因為每個開關存在0和1兩種狀態,8個開關組合到一起,共存在256個狀態。即從全部關閉(0000 0000)到全部打開(1111 1111),共256種狀態。若將64個開關,按照每一排有8個,則可以得到8行,得到結果如圖3所示,它形象地表示了內存基本模型。

圖1 開關示意圖

圖2 開關不同狀態示意圖

圖3 開關“內存模型”示意圖

結合圖2和圖3可以得出,這些開關共有256×8個狀態。我們把這些所有可能的狀態統稱為:“內存狀態信息”。按照8個一排、縱向對其的規則,對64個開關進行統一編碼,得到的結果如圖3所示,右側是按照10進制編碼的結果:0~7。這種結果稱為:內存“地址信息”。

1.2 內存的基本操作

由圖3可知,所有的開關處于打開狀態。現在將第2行第3列、第5列和第7列(從左至右:0~7列)的按鈕閉合,得到的結果如圖4所示。上述描述的過程,在計算機領域用“操作”一詞來表述。這個操作過程有兩個基本的步驟:①選擇某些按鈕,②設置選擇按鈕的狀態(“開”、“閉”)。換而言之,通過內存的“地址信息”,選擇某些按鈕;而后設置這些按鈕的狀態信息(“開”、“閉”),即選中內存的“狀態信息”。這就是內存操作的最本質特點。

圖4 開關“內存模型”操作示意圖

1.3 內存區域與C語言中類型

前述分析可知,一排8個的“開關”(如圖5黑色實線部分所示,標記為:內存區域A),有256種狀態。換而言之,最多可以表示256個數。超過256,一排8個“開關”無法表達。現實中需要表達的數量遠不止256個。為了增加可以表達的數量,可以增加“開關”個數。一種方式如圖5下部虛線方框所示“內存區域B”(第1排和第0排))。當數量范圍在0~255時,可用一排的“開關”表示。視它們“開關”視為一組(圖5第5排)。在C語言中,用“內存區域”指稱這一組開關(如圖5所示內存區域A)。在對它們進行操作是,首選選中它們,而后改變它們的狀態。當數量范圍在0~255×255(65025),可以用 2排“開關”(圖 5 第 1排和第 0排,內存區域B)進行表示,視它們為一組。在對它們進行操作時,首選選中它們,而后改變它們的狀態。

在C語言中,通過類型來表達所用“開關”的數量。例如:unsigned char類型,表示視8個“開關”為一組(內存區域A)。那么char可以表示的狀態總數為256。就C語言中char類型而言,用“取值范圍”一詞,指稱前述狀態總數。再例如,unsigned int16類型,表示視16個開關為一組(內存區域B),可以表示的狀態總數為 65025,取值范圍為:0~65025。

當然,C語言中還有其他的數據類型,如浮點數、數組、結構體等。為了降低論述的復雜程度,本文不再論述。注意,多數情況下,一次最小選擇的數量是1個開關,這個叫位選。但是多數情況下,一次選擇的數量為8個開關。這里面涉及架構知識,本文也不予展開。本文的目的理清指針概念的核心側面,而不是指針概念的全部。

圖5 開關“內存模型”中的內存區域示意圖

1.4 內存區域與C語言中的變量

可以通過內存的“地址信息”(圖5第5排),來選擇所需操作“開關”數量(即內存區域);但是不方便而且也容易出錯。一個解決辦法就是,給相應內存區域命名。一種命名的結果如圖6所示。用“Char-1”表示含有8個開關的內存區域,用“Int-1”表示含有16個開關的內存區域。上述兩個名字,在C語言中稱為變量。由圖6可知,變量“Char-1”包含了相應內存區域的“地址信息”和“狀態信息”。換而言之,通過變量“Char-1”,可以獲得相應內存區域的地址編碼“5”,還可以獲得相應內存區域的狀態“閉閉閉閉閉閉閉開”。假設“閉”用“1”來表,“開”用“0”來表示,相應內存區域的狀態可以表示為“00000001”。若將這種狀態視為“2進制”,則表示的數值為:00000001;對應的“10進制”為1。在C語言中,我們說變量“Char-1”的值為1。同樣的方法可以分析“Int-1”對應的二進制數值為:1011101100001111,對應的十進制為:47887。在C語言中,我們說變量“Int-1”的值為47887。

由圖6可知,變量“Char-1”對應的內存地址信息為5(十進制)。前述可知,變量“Char-1”的值為1(十進制)。在C語言中,變量“Char-1”的“數值”可以用Char-1來表示,而變量“Char-1”的地址,可用“&Char-1”來表示。換而言之,在C語言中,“Char-1”等價于“1”,表達的是“Char-1”對應的內存狀態信息;而“&Char-1”等價“5”,表達的是“Char-1”對應的內存地址信息。一個變量是一個命名了內存區域(如內存區域A)[1],包含了兩個基本的方面“內存地址信息”和“內存狀態信息”。

圖6 開關“內存模型”中的變量示意圖

由圖6可知,變量“Int-1”對應的地址信息為1和0(十進制),前述分析可知,變量“Int-1”的值為47887(十進制)。在 C 語言中“Int-1”等價于“47887”,“&Int-1”指稱/選中的內存區域如由圖6實線方框所示。但是“&Int-1”得到的“值”可能是“0”,也可能是“1”。這與具體的CPU構架有關,不是本文關注的重點。本文關注的重點是“&Int-1”所指稱的內存區域B。為了,論述方便,本文假設“&Int-1”得到的值為“1”。

2 指針變量

在進行內存操作時,存在通過“內存區域A”找到“內存區域B”的需求。換而言之,希望“內存區域A”和“內存區域B”相關聯。假如內存區域A中,有“內存區域B”的地址信息,就可以實現兩個內存區域的關聯。前述分析可以,一個內存區域包含兩個基本的方面:“地址信息”和“狀態信息”。內存的地址信息,一般是不能改變的。換而言之,當把“開關”按照一定規則編碼后,這個編碼信息是基本不變的。方便改變的只有“狀態信息”,若內存的狀態信息,可以表示內存的地址信息,就可以實現兩個內存區域的關聯。如內存區域A的狀態信息,用二進制表示:0000 0001;內存區域B的地址信息,用二進制表示也為:0000 0001。這樣就實現內存區域A和內存區域B的相互關聯。在本文中,開關代表的是二值信息,如果用開用“0”表示,關用“1”表示,得到的結果如圖8所示。直觀地表示了內存地址信息,可以用內存狀態信息來表達。上述內容在C語言中表述為,指針變量的值用于存儲內存地址[6]。

圖7 開關“內存模型”中的指針變量示意圖

圖8 二值信息“內存模型”中的字符型指針變量示意圖

在C語言中,內存區域A和內存區域B相互關聯的實現方式為:指針。下述語句“unsigned char*PChar-1”,定義了一個字符型指針變量“PChar-1”。假設變量“PChar-1”對應的地址信息為:00000101,即內存區域A標記的內存單元。“PChar-1”對應的狀態信息為:00000001。這個狀態信息代表的是存地址信息,即00000001,即“內存區域B”標記的內存單元。在C語言中,“*PChar-1”用以表示“內存區域B”對應狀態信息,即 10111011。而“&(*PChar-1)”用以表示內存區域B的地址信息。PChar-1稱為指針變量,簡稱指針。實際上“*PChar-1”代表的就是一個字符變量。當需要改變內存區域B的狀態信息時,通過給“*PChar-1”賦值即可完成。例如,*PChar-1=255的結果如圖9所示。

2.1 指針變量的類型

如圖10所示,“內存區域A”和“內存區域B”的大小不一致。在這種情況下如將內存區域A與內存區域B聯系起來。在C語言中,也是通過指針實現兩個內存區域的關聯。在這一關聯的過程中,需要知道內內存區域A和內存區域B的一些基本信息,例如內存區域B的大小。由前述分析可知,內存區域的大小可以通過類型來確定。

圖9 二值信息“內存模型”中的無符號字符型指針變量示意圖

圖10 二值信息“內存模型”中的無符號整型指針變量示意圖

在 C 語言中,下述語句“unsigned int*PInt-1”,定義了一個無符號的16位整型指針變量“PInt-1”。假設變量“PInt-1”對應的地址信息為:00000101,即內存區域A標記的內存單元。“PInt-1”對應的狀態信息為:00000001。這個狀態信息代表的是存地址信息,即00000001,即“內存區域B”標記內存單元的第一行。在C語言中“*PInt-1”,指稱/選中的是內存區域B對應的區域,盡管“&(*PInt-1)”得到的結果是 0000 0001。與“*PChar-1”類似,“*PInt-1”代表的就是一個 16 位的整型變量。當需要改變內存區域B的狀態信息時,通過給“*PInt-1”賦值即可完成。例如,*PInt-1=65280的結果(圖10,內存區域B所示)。注意PChar-1和PInt-1 對應的值都是“1”,但是“*PChar-1”和“*PInt-1”的結果明顯不同是,原因是它們的類型不同,更根本的原因是PChar-1和PInt-1指稱/選中的內存區域大小不同。

2.2 指針變量占用的內存區域

一般情況下,當內存的位寬和大小確定后,指針變量占用的內存區域大小是確定的。換而言之,當內存的地址編碼結束之后,存儲每一個地址編碼信息所需內存區域是一定的。在本文中,內存是有64個開關,按照8個一排構成的模型(8,經常被稱為位寬)。內存的地址信息是:0~7。當編碼結束后,存儲內存地址信息所需的開關個數也就確定了。如前述的PChar-1和PInt-1,存放它們所需的內存區域大小是相同的。但是*PChar-1和*PInt-1所指稱/選中的內存區域是不一樣。

2.3 指針變量的基本運算

前述分析可知,PChar-1的值為“1”,PInt-1的值也為“1”。PChar-1+1 的值為“2”,但是 PInt-1+1 的值為3。這是因為,它們指稱/選中的內存區域大小不同;PChar-1指稱/選中的內存區域是一排,而PInt-1選中的內存區域是“兩排”。指針變量的運算結果,與指針變量所指內存區域的大小有關,如圖11和圖12所示。

3 結語

本文以“開關”為元素,構建了簡易的內存模型。以該模型為基礎,介紹了變量概念所包含的兩個基本側面“地址信息”和“狀態信息”,導出了內存區域“狀態信息”表述內存區域“地址信息”,是指針概念的本質所在。從內存的視角,分析了“變量類型”與“指針類型”的關系,進而解析了。C語言中“指針概念”的基本側面。

圖11 二值信息“內存模型”中無符號字符型指針運算示意圖

圖12 二值信息“內存模型”中無符號整型(uint-16) 指針變量的運算

猜你喜歡
區域信息
永久基本農田集中區域“禁廢”
今日農業(2021年9期)2021-11-26 07:41:24
分割區域
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
關于四色猜想
分區域
基于嚴重區域的多PCC點暫降頻次估計
電測與儀表(2015年5期)2015-04-09 11:30:52
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
區域
民生周刊(2012年10期)2012-10-14 09:06:46
信息
建筑創作(2001年3期)2001-08-22 18:48:14
健康信息
祝您健康(1987年3期)1987-12-30 09:52:32
主站蜘蛛池模板: 亚洲国产天堂久久综合226114| 99精品在线看| 亚洲午夜国产精品无卡| 在线视频亚洲色图| 99这里只有精品在线| 男人天堂伊人网| 久久国产免费观看| 欧类av怡春院| 男人天堂亚洲天堂| 国产成年女人特黄特色大片免费| 日韩AV无码免费一二三区| 伊人久久综在合线亚洲2019| 久久久久亚洲精品成人网| 国产精品林美惠子在线观看| 国产精品久久久久久影院| 好紧好深好大乳无码中文字幕| A级全黄试看30分钟小视频| 国产肉感大码AV无码| 国产迷奸在线看| 亚洲色无码专线精品观看| 人妻中文久热无码丝袜| 91久久青青草原精品国产| 伊人久综合| 欧美一级在线播放| 毛片视频网址| 国产精品分类视频分类一区| 国产精品免费电影| 色婷婷丁香| 国产主播喷水| 亚洲国模精品一区| 亚洲区一区| 老色鬼欧美精品| 精品久久久久久久久久久| 亚洲视频免| 日韩毛片免费| 99在线视频免费| 九九免费观看全部免费视频| 国产在线观看一区精品| 天天综合网在线| 无码国产伊人| 在线国产你懂的| 亚洲有无码中文网| 亚洲国产日韩欧美在线| 国产XXXX做受性欧美88| 国产午夜福利在线小视频| 免费中文字幕一级毛片| 午夜视频免费一区二区在线看| 91久久偷偷做嫩草影院精品| 国产福利小视频高清在线观看| 国产亚洲欧美在线视频| 青青网在线国产| 亚洲天堂视频网站| 亚洲资源在线视频| 狠狠色噜噜狠狠狠狠奇米777 | 欧美视频在线不卡| 久久黄色影院| 2022国产无码在线| 大香伊人久久| 国产综合精品日本亚洲777| 久久99热这里只有精品免费看| 国产拍揄自揄精品视频网站| AV天堂资源福利在线观看| 久久黄色毛片| 久久中文字幕不卡一二区| 中文字幕乱码二三区免费| AV熟女乱| 2021国产在线视频| 精品欧美视频| 国产毛片高清一级国语| 久久综合色88| 999国内精品视频免费| 亚洲成在人线av品善网好看| 亚洲AV无码久久天堂| a色毛片免费视频| 国产网站免费看| 夜夜拍夜夜爽| 露脸国产精品自产在线播| 欧美啪啪一区| а∨天堂一区中文字幕| 亚洲伦理一区二区| 久青草国产高清在线视频| 日韩免费中文字幕|