日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 指针_C语言——指针

發(fā)布時間:2023/12/1 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 指针_C语言——指针 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學(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=12

4. 多級指針

指針也可以指向指針,稱為多級指針。

例程:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。