c语言 指针_C语言——指针
學(xué)習(xí)階段:高中信競、大學(xué)編程。
前置知識:二進(jìn)制與十六進(jìn)制,C語言基礎(chǔ),數(shù)組。
指針初學(xué)可能比較難理解,我這篇文章盡量用通俗易懂的方式來講解。
1. 指針概述
為什么有指針這個東西?因為指針很貼近計算機(jī)內(nèi)部的實際工作原理,與內(nèi)存實際的尋址方式類似。C語言可以說是高級語言中最貼近機(jī)器的語言,而像Python、JavaScript這種更親和于人類的語言與機(jī)器的關(guān)系則比較遠(yuǎn)了,甚至它們本身可能還是用C語言寫出來的呢。
指針可以形象地比喻為在內(nèi)存中定位的導(dǎo)航員。內(nèi)存那么大,怎么知道我需要的東西存在哪里呢?可以讓指針來記錄與導(dǎo)航。我們先來了解一下內(nèi)存。
2. 預(yù)備知識
2.1 內(nèi)存
研究過組裝機(jī)、電腦配件的話,一定知道內(nèi)存條這個東西。現(xiàn)在這個時代,一臺家用電腦的內(nèi)存一般是2GB、4GB、8GB、16GB、32GB、64GB等等。
把CPU比作干活的人,則內(nèi)存就相當(dāng)于工作臺。CPU在跑的程序以及很多相關(guān)數(shù)據(jù)都存在內(nèi)存內(nèi),這就相當(dāng)于人在干活時要把相關(guān)資料放在工作臺上使用。
內(nèi)存可以看成是一個巨大的數(shù)組,我這里記為
memory[0..n]memory的每一個單元存1B=8bit,memory[0]就是內(nèi)存的第一個單元。這個中括號里面的數(shù),即數(shù)組下標(biāo),被稱為內(nèi)存地址,簡稱為地址。我確定了一個地址,也就相當(dāng)于確定了內(nèi)存中的一個單元。
通常,我們說的32位機(jī)器,意思就是地址是32bit的,最大支持的內(nèi)存是
memory[0x00000000..0xFFFFFFFF]最小地址是0,最大地址是0xFFFFFFFF=2^32-1,最大支持
也就是說32位機(jī)器理論上最大支持4GB的內(nèi)存,這就是它逐漸被淘汰的原因。
而64位機(jī)器理論上最大支持的內(nèi)存是
這個量級遠(yuǎn)大于目前的需求,因此128位機(jī)器在相當(dāng)長的時間內(nèi)不會出現(xiàn)。
2.2 變量與數(shù)據(jù)類型
C語言有很多數(shù)據(jù)類型,不同的數(shù)據(jù)類型在內(nèi)存中的占用空間和存儲格式也不一樣。不同數(shù)據(jù)類型的存儲格式比較復(fù)雜,這里不詳述。我只談?wù)劜煌恼加每臻g。
一個變量在內(nèi)存中占用都是連續(xù)空間,記T類型的變量在內(nèi)存中占用sizeof(T)字節(jié)的空間。當(dāng)我聲明一個T類型的變量a時,內(nèi)存會尋找連續(xù)且可用的sizeof(T)個單元,把它們分配給變量a,比如說是memory[100..103]這4B的空間。此后我對變量a進(jìn)行讀寫,也就相當(dāng)于對memory[100..103]這4B的空間進(jìn)行讀寫。
某些數(shù)據(jù)類型的占用空間:short短整形占用2B,int整形占用4B;float浮點(diǎn)形占用4B,double雙浮點(diǎn)型占用8B;char字符型占用1B.
3. 指針
指針是一種特殊的數(shù)據(jù)類型,指針類型的變量應(yīng)存儲的是內(nèi)存地址。在32位機(jī)器上,任何一個內(nèi)存地址都是32bit=4B,故任何一個指針型變量都占用4B.
現(xiàn)在問題來了,指針指向內(nèi)存中的一個單元,我怎么知道這個單元里面存的是什么東西,是什么類型的數(shù)據(jù)?因此,在聲明指針變量的時候,也要聲明這個指針指向數(shù)據(jù)的類型,比如int型指針、char型指針等。
3.1 指針的聲明
在語法上,聲明指針類型使用*符號,例如
int *a, b, *c; //a和c是指針,b不是指針 char *ch;這兩句代碼聲明了int*型的變量a與c、int型變量b以及char*型變量ch. 根據(jù)語法,我們習(xí)慣上稱T型指針為T*型,含義就是T*型變量是指針,其所指的相關(guān)內(nèi)存單元存的是T型數(shù)據(jù)。 (注意,這里的b變量不是指針,僅僅為普通的int整形。)
3.2 指針的使用
指針有很多種使用方式,包括動態(tài)申請內(nèi)存、函數(shù)地址傳參等等。我這里僅介紹最簡單的使用方式。我提供一份例程,可直接從例程中學(xué)習(xí)指針的聲明與使用。
例程:
int x=1, y=2; //聲明x與y并賦初值 int *p=&x; //聲明p且p指向x *p=11; //p修改x p=&y; //p指向y *p=12; //p修改y printf("x=%d, y=%d", x, y); //打印x與y第一行,在內(nèi)存中申請連續(xù)的4B區(qū)域存入int型數(shù)據(jù)1,記為變量x;再在內(nèi)存中申請連續(xù)的4B區(qū)域存入int型數(shù)據(jù)2,記為變量y. 假設(shè)x對應(yīng)內(nèi)存區(qū)域memory[100..103],y對應(yīng)內(nèi)存區(qū)域memory[200..203]. 第一行執(zhí)行完畢,內(nèi)存如圖1所示:
圖1 第一行執(zhí)行完畢第二行, 在內(nèi)存中申請連續(xù)的4B區(qū)域存入int*型地址數(shù)據(jù)100,記為變量p. 這里&符號是取地址運(yùn)算符,表示取變量x的首地址,在本例中就是100. 這一行代碼是聲明指針同時賦初值,相當(dāng)于以下兩行代碼:
int *p; p=&x;第二行執(zhí)行完畢,內(nèi)存如圖2所示(100的十六進(jìn)制是0x64):
圖2 第二行執(zhí)行完畢第三行,將p所指的地址起4B空間內(nèi)存入int型數(shù)據(jù)11. 這里*是解地址運(yùn)算符, 表示取得指針?biāo)傅膬?nèi)存空間。 第三行執(zhí)行完畢,內(nèi)存如圖3所示:
圖3 第三行執(zhí)行完畢如果第三行改為執(zhí)行p=(int*)11;,則是先把int型數(shù)據(jù)11強(qiáng)制轉(zhuǎn)換為int*型數(shù)據(jù)11,然后賦值給p,如圖3.2所示:
圖3.2 第三行改為執(zhí)行p=(int*)11;此時p所指的內(nèi)存空間不一定是可用的。因此像這樣直接給指針賦值一個常數(shù)的情況非常罕見。
第四行,p存y的首地址。第四行執(zhí)行完畢,內(nèi)存如圖4所示:
圖4 第四行執(zhí)行完畢第五行,把變量y的值改為12. 第五行執(zhí)行完畢,內(nèi)存如圖5所示:
圖5 第五行執(zhí)行完畢第六行,打印x與y的值,打印結(jié)果應(yīng)為:
x=11, y=124. 多級指針
指針也可以指向指針,稱為多級指針。
例程:
int x=1; int *p=&x; int **p2=&p;這里p2就是一個二級指針,它的類型是int**,它也存了一個地址,但是這個地址是某個int*型變量的地址,在這里是存了int*型變量p的地址。
假設(shè)x的首地址是0x10,p的首地址是0x20,那么內(nèi)存的情況如圖6所示:
圖6 多級指針示例三級、四級等等更多級的指針也是存在的,但是幾乎不會用到。二級指針一般只在二維數(shù)組中會用到,其他情況也很少見。盡量不要使用多級指針,不然真的容易弄暈自己。
5. 答疑
5.1 星號*的不同作用
在指針聲明、數(shù)據(jù)類型中,*表示是指針類型;在已聲明變量前面的*是解地址運(yùn)算符,比如說*p就是用p的內(nèi)容求得其所指的區(qū)域;當(dāng)然,*還有算數(shù)乘法等含義。
總結(jié)
以上是生活随笔為你收集整理的c语言 指针_C语言——指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京环球影城速通卡怎么买
- 下一篇: vant input框禁止调用手机键盘_