版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章指針本章學(xué)習(xí)內(nèi)容
1.指針的概念2.指針與數(shù)組3.指向指針的指針4.指針與函數(shù)5.內(nèi)存管理6.1指針的概念
指針是C語言的重要組成部分。指針本質(zhì)上就是內(nèi)存中的一個(gè)地址。有了指針,可以更靈活地訪問內(nèi)存。如果不理解指針的工作原理,就不能真正掌握C語言程序。想成為優(yōu)秀的C語言程序員,必須學(xué)會在程序中高效利用指針。在C語言中,指針有多種用途。指針可以增加訪問變量的方式,使變量不僅可以直接通過變量名訪問,還可以通過指針進(jìn)行間接訪問。指針主要有兩大用途:使程序不同部分之間可以共享數(shù)據(jù),以及在程序運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存空間。6.3.1地址、變量和指針
在C語言中,指針用于表示內(nèi)存單元的地址。將這個(gè)地址保存于一個(gè)變量中,該變量即稱為指針變量。指針變量也有不同類型,用于保存不同類型變量的地址。嚴(yán)格來說,指針與指針變量不同,但為了敘述簡便,通常將指針變量稱為指針。內(nèi)存是計(jì)算機(jī)用于存儲數(shù)據(jù)的存儲器,以字節(jié)為基本存儲單元。6.3.1地址、變量和指針
計(jì)算機(jī)中的所有數(shù)據(jù)都存放在內(nèi)存中。每個(gè)內(nèi)存單元占用的字節(jié)數(shù)因數(shù)據(jù)類型不同而異。為了正確訪問內(nèi)存單元,必須給每個(gè)單元一個(gè)地址編號。內(nèi)存就像旅店,內(nèi)存單元像房間,地址號相當(dāng)于房間門牌號。以整型數(shù)據(jù)占4個(gè)單元為例。如圖6.1所示,其中的3000、3001、3002、3003就是變量i所占4個(gè)內(nèi)存單元的地址,整形變量i的值以二進(jìn)制的形式存放在這4個(gè)內(nèi)存單元中,變量i的值為2,變量i的指針是另一個(gè)變量,它存放的是變量i的首地址:3000。這里變量i的指針有一個(gè)統(tǒng)一的名稱:指針變量。6.3.1地址、變量和指針
變量的地址是連接變量和指針之間的橋梁。當(dāng)一個(gè)變量存儲了另一個(gè)變量的地址時(shí),我們可以說第一個(gè)變量指向了第二個(gè)變量。這種“指向”是通過地址來表示的。指針變量是存儲另一個(gè)變量地址的變量,因此當(dāng)把一個(gè)變量的地址賦給指針變量后,這個(gè)指針變量就指向了那個(gè)變量。比如,把變量i的地址存儲到指針變量pi中,那么pi就指向了變量i。這種關(guān)系可以如圖6.2所示。6.3.2指針變量的定義和引用
因?yàn)榈刂房梢杂脕碓L問特定的內(nèi)存存儲單元,所以我們可以說地址“指向”這個(gè)內(nèi)存單元。地址可以被形象地稱為指針,因?yàn)樗苤赶騼?nèi)存單元。一個(gè)變量的地址被稱為該變量的指針。當(dāng)一個(gè)變量被用來專門存儲另一個(gè)變量的地址時(shí),這個(gè)存儲地址的變量就是指針變量。在C語言中,有一種專門用來存儲內(nèi)存單元地址的變量類型,就是指針類型。下面將介紹如何定義一個(gè)指針變量、給它賦值以及引用它。6.3.2指針變量的定義
指針變量在C語言中是一種特殊類型的變量,它用來存儲內(nèi)存地址。定義一個(gè)指針變量需要指定該指針變量可以指向的數(shù)據(jù)類型。語法通常是通過在變量名前加上“*”來聲明一個(gè)指針變量。類型說明符*變量名在這種聲明中,“*”符號用于指示變量是一個(gè)指針變量,緊隨其后的是所定義的指針變量名稱,而類型說明符則表示了這個(gè)指針變量所指向的數(shù)據(jù)類型。int*prt1 //定義了一個(gè)名為ptr1的指針變量,它可以存儲一個(gè)整數(shù)類型的地址。char*ptr2 //定義了一個(gè)名為ptr2的指針變量,它可以存儲一個(gè)字符類型的地址。6.3.2指針變量的賦值
指針變量可以通過賦值操作來存儲另一個(gè)變量的地址。要將一個(gè)變量的地址賦給指針變量,可以使用取地址符“&”獲取該變量的地址,并將該地址賦給指針變量。例如,假設(shè)有一個(gè)整型變量num和一個(gè)指向整型的指針變量ptr,可以這樣將num的地址賦給ptr:intnum=10; //定義一個(gè)整型變量num并賦值為10int*ptr; //定義一個(gè)指向整型的指針變量ptrptr=# //將num的地址賦給ptr上面的例子還可以寫成,定義指針變量的同時(shí)初始化完成賦值,例如:intnum=10;int*ptr=#6.3.2指針變量的引用
引用指針變量實(shí)際上是獲取指針?biāo)赶虻刂诽幋鎯Φ闹?。這可以通過解引用操作符“*”來完成。當(dāng)使用“*”操作符與指針變量一起使用時(shí),可以訪問指針?biāo)赶虻刂分写鎯Φ臄?shù)據(jù)。解引用操作符“*”在C語言中用于訪問指針?biāo)赶虻刂诽幍闹?。它允許你通過指針訪問存儲在內(nèi)存中的實(shí)際數(shù)據(jù)。舉例來說,如果有一個(gè)指向整型數(shù)據(jù)的指針變量ptr,要獲取它所指向地址處的值,可以這樣做:intnum=10; //定義一個(gè)整型變量num并賦值為10int*ptr; //定義一個(gè)指向整型的指針變量ptrptr=# //將num的地址賦給ptrintvalue=*ptr; //使用*ptr獲取ptr所指向地址處的值,將其賦給value在這個(gè)例子中,*ptr表示獲取指針ptr所指向地址處的值,然后將這個(gè)值賦給value變量,所以變量value的值也是10。6.4指針與數(shù)組
數(shù)組是一系列元素的集合,而指針則是用于跟蹤、訪問和操作這些元素的工具。在C語言中,數(shù)組名通常可以看作指向數(shù)組首元素的指針,這為指針和數(shù)組之間的交互提供了許多可能性。理解指針和數(shù)組之間的關(guān)系,以及它們?nèi)绾螀f(xié)同工作,對于有效地利用C語言進(jìn)行內(nèi)存管理和數(shù)據(jù)操作至關(guān)重要。6.4.1指針與一維數(shù)組
當(dāng)定義一個(gè)一維數(shù)組時(shí),系統(tǒng)會在內(nèi)存中為改數(shù)組分配一個(gè)儲存空間,其數(shù)組的變量名就是數(shù)組的首地址。C語言對數(shù)組的訪問是通過數(shù)組名(數(shù)組的起始地址)加上相對于起始地址的相對量(由下標(biāo)變量給出),得到要訪問的數(shù)組元素的單元地址,然后再對計(jì)算出的單元地址的內(nèi)容進(jìn)行訪問。若定義一個(gè)指針變量,并將數(shù)組的首地址賦值給指針變量,則我們說該指針指向了這個(gè)一維數(shù)組。int*p,a[4];p=a;//數(shù)組的變量名a就是數(shù)組的首地址另一種賦值方式也可寫為:int*p,a[4];p=&a[0];//a[0]的地址也是數(shù)組的首地址6.4.1指針與一維數(shù)組
數(shù)組名a代表數(shù)組的首地址,即元素a[0]的地址(&a[0]
),所以a+1表示首地址后下一個(gè)元素的地址,即數(shù)組中下標(biāo)為1的元素a[1]的地址(&a[1])。由此可知,a+i代表數(shù)組中下標(biāo)為i的元素a[i]的地址,即&a[i]。于是,通過解引用操作符“*”就可以訪問數(shù)組中的元素了。例如,*a或*(a+0)表示取出下標(biāo)為0的元素a[0],*(a+i)表示取出下標(biāo)i的元素a[i]。數(shù)組元素之所以能通過這種方法來訪問,是因?yàn)閿?shù)組的下標(biāo)運(yùn)算符[]實(shí)際上執(zhí)行就是指針運(yùn)算。例如,a[i]被編譯器解釋為*(a+i),而&a[i]被解釋為指針表達(dá)式a+i。如果定義了一個(gè)int型指針變量p,并且讓p指向了int型數(shù)組a的首地址,那么p的值就是&a[0],*p就是p指向的數(shù)組元素a[0],p+i的值就是&a[i],*(p+i)就表示數(shù)組元素a[i]。這種關(guān)系如圖6.3所示。6.4.1指針的遞增、遞減
指針的遞增和遞減運(yùn)算是針對指針變量進(jìn)行的操作,用于移動(dòng)指針指向的內(nèi)存地址位置。遞增運(yùn)算(++):對指針進(jìn)行遞增操作會使指針指向下一個(gè)相同類型的內(nèi)存位置。例如,如果一個(gè)指針指向一個(gè)整型數(shù)組的元素,執(zhí)行ptr++將使指針指向數(shù)組中的下一個(gè)整數(shù)元素。遞減運(yùn)算(--):對指針進(jìn)行遞減操作會使指針指向前一個(gè)相同類型的內(nèi)存位置。類似于遞增操作,執(zhí)行ptr--將使指針向數(shù)組的前一個(gè)元素移動(dòng)。這些操作是依據(jù)指針指向的數(shù)據(jù)類型來確定移動(dòng)的步長,確保在同一數(shù)據(jù)類型內(nèi)移動(dòng)。同時(shí),需要注意確保不會越界或者訪問非法的內(nèi)存位置。6.4.2指針與二維數(shù)組
二維數(shù)組在內(nèi)存中是連續(xù)存儲的,這意味著每一行的元素緊挨著存儲。當(dāng)你使用指針來訪問二維數(shù)組時(shí),你需要知道如何計(jì)算特定元素的內(nèi)存地址。以下是一個(gè)簡單的例子來說明這一點(diǎn):假設(shè)有一個(gè)3x3的二維數(shù)組,首地址為1000:intarr[3][3]={{1,2,3},{4,5,6},{7,8,9}};則其二維數(shù)組的行地址與列地址如圖6.4所示。6.4.2指針與二維數(shù)組首先,在C語言編程中,二維數(shù)組可以被視為由多個(gè)一維數(shù)組組成的結(jié)構(gòu),圖6.4中的二維數(shù)組可以理解為a是由a[0]、a[1]、a[2]三個(gè)元素組成的一維數(shù)組,其中數(shù)組名a代表其第一個(gè)元素a[0]的地址(即&a[0])。根據(jù)上一小節(jié),一維數(shù)組與指針的關(guān)系,a+1(即&a[1])指向的是緊隨第一行之后的第二行的首元素地址,而a+2(即&a[2])則指向第三行的首元素地址。因此,借助這些地址,我們能夠?qū)崿F(xiàn)對各元素值的引用操作。具體來說,表達(dá)式*(a+0)或*a獲取的是數(shù)組a的第一個(gè)元素a[0]的值;*(a+1)用于訪問數(shù)組a中第二個(gè)元素a[1]的值;*(a+2)則對應(yīng)著第三個(gè)元素a[2]的值。需要注意的是,這里的元素實(shí)際上仍然是數(shù)組的地址,而不是直接的數(shù)據(jù)值。6.4.2指針與二維數(shù)組其次,二維數(shù)組中的每一行都可以視作一個(gè)一維數(shù)組。對于數(shù)組a,如果它是一個(gè)二維數(shù)組,且a[0]、a[1]和a[2]分別代表該二維數(shù)組的第一、第二和第三行,那么每行包含3個(gè)整型元素。例如,a[0]可以看成由a[0][0]、a[0][1]和a[0][2]這3個(gè)整型元素組成的一維數(shù)組,其地址即為&a[0][0]。當(dāng)我們說a[0]+1時(shí),這實(shí)際上意味著從a[0](即a[0][0]的地址)開始向后移動(dòng)一個(gè)整型元素的大小,因此指向了同一行中的下一個(gè)元素a[0][1]的地址,即&a[0][1]。同理,a[0]+2指向的是同一行中的第三個(gè)元素a[0][2]的地址,即&a[0][2]。解引用這些指針表達(dá)式,我們可以得到對應(yīng)的元素值:*(a[0]+0)獲取的是a[0][0]的值;*(a[0]+1)獲取的是a[0][1]的值;*(a[0]+2)獲取的是a[0][2]的值。6.4.2指針與二維數(shù)組最后,二維數(shù)組的每一行視為一個(gè)一維數(shù)組,那么a[0]就可以被視為一個(gè)包含三個(gè)整型元素的一維數(shù)組。在這種情況下,a[0]+1中的數(shù)字1表示的是單個(gè)整型元素的字節(jié)大小,這是因?yàn)樵贑語言中,數(shù)組的索引是從0開始的,所以a[0]+1實(shí)際上是指向同一行中的下一個(gè)元素。同樣地,由于a本身代表的是整個(gè)二維數(shù)組,它由三個(gè)這樣的一維數(shù)組(即三行)組成,所以a+1中的數(shù)字1表示的是整個(gè)一行的字節(jié)大小,這等于一行中的元素?cái)?shù)量(3個(gè)整型元素)乘以每個(gè)元素的字節(jié)大?。╯izeof(int))。6.4.2指針與二維數(shù)組根據(jù)上述分析,我們可以得出以下結(jié)論:a[i],即*(a+i),可以被視為一維數(shù)組a中索引為i的元素。同時(shí),a[i]即*(a+i)也相當(dāng)于由a[i][0]、a[i][1]、a[i][2]三個(gè)整型元素組成的一維數(shù)組的數(shù)組名,它代表的是這個(gè)一維數(shù)組中第一個(gè)元素a[i][0]的地址(即&a[i][0])。而a[i]+j或*(a+i)+j則表示在這個(gè)一維數(shù)組中索引為j的元素的地址,也就是&a[i][j]。因此,*(a[i]+j)或*(*(a+i)+j)就是這個(gè)地址所指向的元素的值,也就是a[i][j]。這樣,我們有四種等價(jià)的方式來表示a[i][j]:a[i][j] <==> *(a[i]+j) <==> *(*(a+i)+j) <==> (*(a+i))[j]6.4.2行指針在二維數(shù)組中,行指針(也稱為行地址)通常指的是指向二維數(shù)組第一行的指針。由于C語言中的數(shù)組名在表達(dá)式中會被解釋為指向其首元素的指針,所以對于二維數(shù)組a,a本身就是一個(gè)指向第一行的指針。換句話說,a是一個(gè)指向包含3個(gè)整型元素的數(shù)組的指針。例如,對于圖6.4所示的二維數(shù)組a,可定義如下的行指針:int(*p)[3];在解釋變量聲明語句中變量的類型時(shí),雖然說明符[]的優(yōu)先級高于*,但由于圓括號的優(yōu)先級更高,所以先解釋*,再解釋[]。所以,在C語言中,int(*p)[3];這行代碼聲明了一個(gè)名為p的指針變量,它指向一個(gè)包含3個(gè)整型元素的數(shù)組。這里的指針類型是int(*)[3],這是一個(gè)指向數(shù)組的指針,而不是指向單個(gè)整型值的指針(int*)。6.4.2列指針二維數(shù)組的列指針和行指針的定義是不同的。列指針實(shí)際上是指向數(shù)組的指針,而不是指向數(shù)組的行。在二維數(shù)組inta[3][3];中,列指針的聲明方式如下:int*p;6.4.3指針數(shù)組指針數(shù)組是C語言中一種特殊的數(shù)據(jù)結(jié)構(gòu),它是一個(gè)數(shù)組,但數(shù)組中的每個(gè)元素都是一個(gè)指針變量。這些指針可以指向相同類型的任何對象或數(shù)據(jù),在內(nèi)存中存儲一系列相關(guān)變量的地址。在C語言中,指針數(shù)組的聲明通常采用以下形式:int*p[10];上面的代碼定義了一個(gè)包含10個(gè)元素的指針數(shù)組,每個(gè)元素都能存儲一個(gè)整型變量的地址。其中,int是指針?biāo)赶虻臄?shù)據(jù)類型,p是指針數(shù)組的名稱,10表示數(shù)組的大小,即數(shù)組中指針的數(shù)量。6.5指向指針的指針指向指針的指針,通常被稱為“二級指針”或“指針的指針”。在C語言中,指針是一種特殊的數(shù)據(jù)類型,用來存儲內(nèi)存地址。指針變量存儲的是另一個(gè)變量的地址,通過指針可以間接地訪問或修改該變量的內(nèi)容。指針允許對內(nèi)存進(jìn)行動(dòng)態(tài)分配和管理,是實(shí)現(xiàn)諸如動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)、內(nèi)存管理等功能的重要工具。指向指針的指針變量定義如下:int**p;6.5指向指針的指針int:這表示p是一個(gè)指針,它指向一個(gè)整型數(shù)據(jù)類型的變量或值。*p:*符號表示間接引用或解引用操作符。因此,*p表示指針p所指向的內(nèi)容。在這里,p是一個(gè)指向指針的指針,因此*p將得到一個(gè)指針。int*p:這意味著p是一個(gè)指向整型變量的指針。也就是說,p可以存儲一個(gè)整型變量的地址。int**p:這一行代碼進(jìn)一步擴(kuò)展了上一行的聲明。它表明p是一個(gè)指向指針的指針。換句話說,p可以存儲一個(gè)指向整型變量的指針的地址。指向指針的指針變量如圖6.7所示。6.6指針與函數(shù)在C語言中,指針是一種變量,其存儲的是另一個(gè)變量的內(nèi)存地址。指針使得程序能夠直接訪問和操作內(nèi)存中的數(shù)據(jù),提供了對數(shù)據(jù)結(jié)構(gòu)的引用,以及在函數(shù)間傳遞數(shù)據(jù)的靈活性。函數(shù)是一段可重用的代碼塊,它可以接收輸入?yún)?shù)(可以是值或指針),執(zhí)行特定的任務(wù),并可以返回一個(gè)結(jié)果。指針在函數(shù)中的應(yīng)用非常廣泛,它們可以用來傳遞數(shù)組、結(jié)構(gòu)體等復(fù)雜數(shù)據(jù)類型,允許函數(shù)內(nèi)部修改傳遞進(jìn)來的數(shù)據(jù),或者動(dòng)態(tài)分配和釋放內(nèi)存。指針的使用提高了C語言的效率和靈活性,但同時(shí)也要求程序員對內(nèi)存管理有更深入的理解。6.6.1指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)允許函數(shù)直接訪問并可能修改調(diào)用者作用域中的原始數(shù)據(jù)。通過傳遞變量的地址(即指針),函數(shù)能夠操作指向的內(nèi)存位置,實(shí)現(xiàn)對數(shù)據(jù)的直接控制,這不僅提高了效率,尤其是在處理大型數(shù)據(jù)結(jié)構(gòu)時(shí),而且提供了一種靈活的方式來傳遞和操作數(shù)據(jù)。6.6.1指針變量作為函數(shù)參數(shù)【例6.9】編寫程序,交換兩個(gè)變量的值。試分析下面的程序能實(shí)現(xiàn)這一功能嗎?如果不能,該如何修改。6.6.1指針變量作為函數(shù)參數(shù)上面這段代碼是一個(gè)簡單的C語言程序,用于交換兩個(gè)整數(shù)變量的值。但是,這個(gè)程序有一個(gè)問題。在swap函數(shù)中,雖然局部變量x和y的值被交換了,但是這個(gè)交換并不會影響到main函數(shù)中的a和b。如圖6.8、圖6.9所示。這是因?yàn)樵贑語言中,函數(shù)參數(shù)是通過值傳遞的,這意味著傳遞給swap函數(shù)的是a和b的副本,而不是它們的引用。所以,即使在swap函數(shù)內(nèi)部改變了這些值,main函數(shù)中的原始變量也不會受到影響。6.6.1指針變量作為函數(shù)參數(shù)【例6.10】編寫程序,交換兩個(gè)變量的值。Swap()函數(shù)的參數(shù)修改為指針變量。6.6.1指針變量作為函數(shù)參數(shù)swap函數(shù)定義了一個(gè)通過指針傳遞參數(shù)的函數(shù),它接受兩個(gè)整型指針作為參數(shù)。在函數(shù)內(nèi)部,使用一個(gè)臨時(shí)變量temp來幫助交換兩個(gè)指針指向的整數(shù)值。首先,它將x指針指向的值(即變量a的地址中的值)保存到temp中,然后將y指針指向的值賦給x指針指向的地址(即變量a的地址),最后將temp中的值(原a的值)賦給y指針指向的地址(即變量b的地址)。6.6.1指針變量作為函數(shù)參數(shù)
main函數(shù)首先聲明了兩個(gè)整型變量a和b。然后,程序提示用戶輸入兩個(gè)整數(shù),并使用scanf函數(shù)讀取用戶輸入的值存儲到a和b中。在顯示了原始的a和b的值之后,調(diào)用swap函數(shù)并傳遞a和b的地址,從而觸發(fā)值的交換。交換完成后,再次打印a和b的值,此時(shí)會發(fā)現(xiàn)它們的值已經(jīng)交換。6.6.2函數(shù)的返回值為指針
在C語言中,函數(shù)的返回值可以是指針類型,這意味著函數(shù)執(zhí)行完畢后,可以返回一個(gè)指向內(nèi)存地址的值。這種類型的函數(shù)通常用于創(chuàng)建動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)、返回?cái)?shù)組或結(jié)構(gòu)體的引用,或者在函數(shù)內(nèi)部分配內(nèi)存并將其地址返回給調(diào)用者。返回指針的函數(shù)允許調(diào)用者在函數(shù)執(zhí)行完畢后繼續(xù)訪問和操作返回的數(shù)據(jù)。返回值為指針類型的函數(shù)定義如下:類型說明符*函數(shù)名(參數(shù)列表)例如,如下函數(shù):int*fun(intx,inty);fun()函數(shù)接收兩個(gè)整型變量作為參數(shù),返回值為一個(gè)指針類型,int表示該指針指向一個(gè)整數(shù)。6.6.3函數(shù)的返回值為指針
指向函數(shù)的指針在C語言中是一種特殊的指針,它存儲了函數(shù)的地址,允許你像調(diào)用普通函數(shù)一樣調(diào)用指針?biāo)赶虻暮瘮?shù)。這種指針類型通常用于回調(diào)函數(shù)、事件處理、排序算法等場景,其中函數(shù)的地址作為參數(shù)傳遞給另一個(gè)函數(shù),然后在適當(dāng)?shù)臅r(shí)機(jī)被調(diào)用。指向函數(shù)的指針的聲明需要指定指針指向的函數(shù)的返回類型和參數(shù)類型。定義函數(shù)指針的一般形式如下:類型說明符(*指針名)(函數(shù)參數(shù)列表);6.6.3函數(shù)的返回值為指針
指向函數(shù)的指針的聲明需要指定指針指向的函數(shù)的返回類型和參數(shù)類型。例如,如果有一個(gè)返回類型為int且接受兩個(gè)int參數(shù)的函數(shù),那么指向這種函數(shù)的指針的聲明如下:int(*functionPtr)(intx,inty);其中functionPtr就是函數(shù)指針,它指向一個(gè)函數(shù),該函數(shù)的參數(shù)是兩個(gè)整型變量,返回類型是整型。當(dāng)然,在定義functionPtr時(shí),也可以將函數(shù)參數(shù)列表中的變量名省略,如下:int(*functionPtr)(int,int);可以將任何一個(gè)參數(shù)為兩個(gè)整型變量并且返回值為整型的函數(shù)地址賦給functionPtr,然后通過functionPtr來調(diào)用該函數(shù),通過函數(shù)指針調(diào)用函數(shù)的方式如下:函數(shù)指針名(函數(shù)參數(shù)列表);6.7內(nèi)存管理
C語言中的內(nèi)存管理是指程序在運(yùn)行時(shí)對內(nèi)存的分配、釋放和管理。在C語言中,內(nèi)存管理是由程序員負(fù)責(zé)的,因此程序員需要謹(jǐn)慎地分配和釋放內(nèi)存,以避免內(nèi)存泄漏和內(nèi)存溢出等問題。6.7.1C語言內(nèi)存區(qū)域劃分
C語言內(nèi)存區(qū)域劃分包括棧用于存儲函數(shù)調(diào)用信息和局部變量、堆用于動(dòng)態(tài)內(nèi)存分配與釋放、全局/靜態(tài)存儲區(qū)用于全局變量和靜態(tài)變量、常量存儲區(qū)用于存儲常量數(shù)據(jù)、代碼區(qū)用于存儲程序的執(zhí)行指令,每個(gè)區(qū)域有不同的生命周期、作用和訪問權(quán)限。如圖6.8所示。6.7.1C語言內(nèi)存區(qū)域劃分
棧(Stack):棧是一種后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),用于存儲函數(shù)的局部變量、函數(shù)參數(shù)以及函數(shù)調(diào)用的返回地址等信息。棧的大小在程序運(yùn)行時(shí)是固定的,并且棧的空間是由編譯器自動(dòng)管理的,當(dāng)函數(shù)調(diào)用結(jié)束時(shí),函數(shù)的棧幀會被銷毀,棧上的數(shù)據(jù)也會被自動(dòng)釋放。堆(Heap):堆是一種動(dòng)態(tài)分配的內(nèi)存區(qū)域,用于存儲程序運(yùn)行時(shí)動(dòng)態(tài)分配的內(nèi)存。堆的大小通常比棧大得多,堆的內(nèi)存空間由程序員手動(dòng)分配和釋放,通常使用malloc()、calloc()、realloc()等函數(shù)分配內(nèi)存,使用free()函數(shù)釋放內(nèi)存。6.7.1C語言內(nèi)存區(qū)域劃分
全局/靜態(tài)存儲區(qū)(Global/StaticStorageArea):全局變量和靜態(tài)變量存儲在全局/靜態(tài)存儲區(qū)中。全局變量在程序的整個(gè)生命周期內(nèi)都存在,并且在程序啟動(dòng)時(shí)就被初始化。靜態(tài)變量的生命周期也與程序的運(yùn)行周期相關(guān),但是作用域有所不同。全局變量和靜態(tài)變量的內(nèi)存分配由編譯器管理,它們的內(nèi)存空間在程序加載時(shí)就已經(jīng)分配,并且在程序結(jié)束時(shí)被釋放。常量存儲區(qū)(ConstantStorageArea):常量字符串和全局常量存儲在常量存儲區(qū)中。常量存儲區(qū)通常是只讀的,程序無法修改常量存儲區(qū)中的數(shù)據(jù)。常量存儲區(qū)的內(nèi)存空間在程序加載時(shí)就已經(jīng)分配,并且在程序結(jié)束時(shí)被釋放。代碼區(qū)(CodeArea):代碼區(qū)存儲程序的執(zhí)行代碼,包括函數(shù)的機(jī)器指令等。代碼區(qū)通常是只讀的,并且在程序加載時(shí)就已經(jīng)分配,程序無法修改代碼區(qū)的內(nèi)容。6.7.2動(dòng)態(tài)內(nèi)存分配函數(shù)
動(dòng)態(tài)內(nèi)存分配函數(shù)在C語言中提供了靈活地分配和釋放內(nèi)存空間的能力。主要的函數(shù)包括malloc()、calloc()、realloc()和free()。這些函數(shù)允許程序在運(yùn)行時(shí)根據(jù)需要分配內(nèi)存,提供了靈活且有效地管理內(nèi)存的方式,但程序員需要確保合理地分配和釋放內(nèi)存,以避免內(nèi)存泄漏和內(nèi)存溢出等問題。6.7.2動(dòng)態(tài)內(nèi)存分配函數(shù)
malloc()函數(shù):void*malloc(size_tsize)函數(shù)用于分配指定大小的內(nèi)存空間,并返回一個(gè)指向該內(nèi)存空間的指針。參數(shù)size表示要分配的內(nèi)存空間的大小,以字節(jié)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家長行為規(guī)范培訓(xùn)課件
- 2026年網(wǎng)絡(luò)游戲開發(fā)合作合同
- 2026年品牌形象廣告合作合同協(xié)議
- 2026年工廠油煙管道消毒清潔合同
- 二手設(shè)備典當(dāng)合同2026年
- 2026年市場專員離職競業(yè)限制合同范本
- 2026年編劇獨(dú)家聘用合同
- 2026年倉儲作業(yè)外包合同
- 2026年電商倉儲配送服務(wù)合同協(xié)議
- 2026年寵物殯葬服務(wù)合同協(xié)議
- 信息寫作知識培訓(xùn)課件
- 內(nèi)分泌外出進(jìn)修后回院匯報(bào)
- 電子行業(yè)國際標(biāo)準(zhǔn)J-STD-020中文版
- 2025年重點(diǎn)城市公共汽車客運(yùn)行業(yè)研究報(bào)告及未來發(fā)展趨勢預(yù)測
- 神經(jīng)外科出科考試試題(含答案)
- 過程安全衡量指標(biāo)-領(lǐng)先和滯后CCPS
- 睡眠護(hù)理技術(shù)及護(hù)理記錄
- 微視野計(jì)在青光眼診斷中的應(yīng)用-洞察及研究
- DB31∕T 1564-2025 企業(yè)實(shí)驗(yàn)室危險(xiǎn)化學(xué)品安全管理規(guī)范
- 企業(yè)安全生產(chǎn)培訓(xùn)檔案
- 超聲波局部放電檢測技術(shù)專題
評論
0/150
提交評論