c语言中指针的类型,学习C语言中的指针类型
摘要:結(jié)合我院學(xué)生十年來參加全國(guó)計(jì)算機(jī)等級(jí)考試(C語言部分)情況,通過分析成績(jī)分布與題型關(guān)系,我們發(fā)現(xiàn)指針方面的題型失分率最高。在此基礎(chǔ)上結(jié)合教學(xué)實(shí)際,本文提出學(xué)習(xí)指針知識(shí)的方法和順序過程,并將其應(yīng)用在C程序設(shè)計(jì)課程教學(xué)中,取得了較好的實(shí)踐效果。
關(guān)鍵詞:等級(jí)考試;指針;指針類型;指針常量;指針變量;數(shù)組與指針;行指針;列指針
據(jù)統(tǒng)計(jì),十年來我院有450多名學(xué)生先后參加了全國(guó)計(jì)算機(jī)等級(jí)考試。我們對(duì)C語言筆試和上機(jī)成績(jī)分析發(fā)現(xiàn),指針類型方面的題型出錯(cuò)率最高,占平均錯(cuò)誤率的60%左右,這說明指針知識(shí)的學(xué)習(xí)是學(xué)生學(xué)習(xí)C語言的難點(diǎn)。指針類型是一種特別的數(shù)據(jù)類型,與C語言中其他數(shù)據(jù)類型相比,既抽象又復(fù)雜,同時(shí)有關(guān)C語言的教程類圖書對(duì)指針論述的差別也給學(xué)生帶來了困惑。根據(jù)筆者的經(jīng)驗(yàn),學(xué)生只有掌握了與指針類型相關(guān)的基礎(chǔ)知識(shí),才能較好地理解、掌握和應(yīng)用指針數(shù)據(jù)類型。
1計(jì)算機(jī)內(nèi)存儲(chǔ)器地址的編碼方法
欲學(xué)好指針類型,首先要知道計(jì)算機(jī)內(nèi)存儲(chǔ)器地址的編碼方法。計(jì)算機(jī)內(nèi)存儲(chǔ)器里存儲(chǔ)的信息都是由1和0構(gòu)成的二進(jìn)制數(shù)來表示,每一位二進(jìn)制數(shù)位是表示信息的最小單位,計(jì)算機(jī)技術(shù)規(guī)定在內(nèi)存儲(chǔ)器里用八位二進(jìn)制數(shù)位來存儲(chǔ)信息,這八位二進(jìn)制數(shù)位叫一個(gè)字節(jié),即在內(nèi)存儲(chǔ)器里是以字節(jié)為單位存儲(chǔ)信息的,如大寫英文字母A,在內(nèi)存儲(chǔ)器里用01000001表示。把能表示八位二進(jìn)制數(shù)的存儲(chǔ)空間叫一個(gè)字節(jié)存儲(chǔ)單元。
在實(shí)模式下“為了訪問存儲(chǔ)器的不同字節(jié)存儲(chǔ)單元,每個(gè)字節(jié)存儲(chǔ)單元人為給以一個(gè)編號(hào),叫存儲(chǔ)器的地址,地址從0開始編號(hào),順序地每次加1。”如PC計(jì)算機(jī)配置512MB內(nèi)存條,其存儲(chǔ)空間地址編號(hào)范圍用十六進(jìn)制數(shù)表示為00000000~3FFFFFFF,即十進(jìn)制數(shù)的范圍為:0~536870911,有536870912個(gè)字節(jié)存儲(chǔ)單元,相當(dāng)于可存放536870912個(gè)英文字符(半角字符)。配置1G內(nèi)存條,其存儲(chǔ)空間地址編號(hào)范圍用十六進(jìn)制數(shù)表示為00000000~7FFFFFFF,即十進(jìn)制數(shù)的范圍為:0~1073741823,有1073741824個(gè)字節(jié)存儲(chǔ)單元,相當(dāng)于可存放1073741824個(gè)英文字符(半角字符)[1]。
2存儲(chǔ)單元的地址
C語言中數(shù)據(jù)有基本類型(字符型、整型、長(zhǎng)整型、實(shí)型、枚舉型)、構(gòu)造類型、指針類型等。不同數(shù)據(jù)類型在內(nèi)存中存儲(chǔ)時(shí),占用的字節(jié)數(shù)不同,如字符型需要1個(gè)字節(jié)空間,整型需要2個(gè)字節(jié)空間,長(zhǎng)整型需要4個(gè)字節(jié)空間等。把不同數(shù)據(jù)類型存儲(chǔ)時(shí)需要的N個(gè)字節(jié)看成一個(gè)整體,叫一個(gè)存儲(chǔ)單元。對(duì)字符型N=1,整型N=2,長(zhǎng)整型N=4等。對(duì)1個(gè)字節(jié)構(gòu)成的存儲(chǔ)單元,其字節(jié)單元地址編號(hào)就是該存儲(chǔ)單元的地址,對(duì)多個(gè)(N>=2)字節(jié)構(gòu)成的存儲(chǔ)單元,其低字節(jié)單元地址為該存儲(chǔ)單元的地址,也叫存儲(chǔ)單元的首地址[1-2]。
3指針類型
語言中的指針類型有指針常量和指針變量。指針常量簡(jiǎn)稱為指針,即存儲(chǔ)單元的地址。可以認(rèn)為配置不同容量的內(nèi)存,其指針值的范圍是不同的,但都是
作者簡(jiǎn)介:楊加義(1960-),男,高級(jí)講師,研究方向?yàn)榍度胧较到y(tǒng)、Matlab仿真技術(shù)、Matlab語言與學(xué)科教學(xué)。
從0起始的。每個(gè)存儲(chǔ)單元的指針值都是固定不變的。指針變量就是用來存放指針的變量。指針變量是一種較特別的變量,它的值是一些特定的整數(shù)值,不是任何整數(shù)(如負(fù)整數(shù))都可以存放到指針變量,指針變量與整數(shù)加減運(yùn)算也不同于數(shù)學(xué)中的運(yùn)算方法。指針變量也有自己的內(nèi)存空間,空間的大小由編譯器決定,在Turbo C 2.0下是2個(gè)字節(jié),在Visual VC++下是4個(gè)字節(jié)[1,3]。
4變量的指針
在編譯C語言程序時(shí),要在內(nèi)存為各種變量分配相應(yīng)的存儲(chǔ)單元,相應(yīng)的變量名稱對(duì)應(yīng)著存儲(chǔ)單元的首地址,這首地址就是變量的指針。可以將一變量的指針賦給一指針變量(存到指針變量代表的存儲(chǔ)單元中),這時(shí)就說指針變量指向了該變量(也可以說指針變量指向了該變量表示的存儲(chǔ)單元)。對(duì)存儲(chǔ)單元的存取操作即可以用變量名,也可以通過指向該變量的指針變量來進(jìn)行,這要用到指針運(yùn)算符“*”[3]。
5指針變量類型和它所指向的數(shù)據(jù)類型
指針變量的類型以聲明它時(shí)其前面的“*”為標(biāo)志,無論指針變量指向何種數(shù)據(jù)類型,它所占用的內(nèi)存空間大小是一定的(如2個(gè)字節(jié)),這與其他數(shù)據(jù)類型的變量所占有的內(nèi)存空間大小一定一樣,所以指針變量的類型就是指針類型,與它所指向的數(shù)據(jù)類型無關(guān)。有資料把可指向不同數(shù)據(jù)類型的指針變量說成有整型指針(int *)變量、實(shí)型指針(float *)變量、字符型指針(char *)變量等,筆者覺得沒必要。如果非要這樣說,理解成指針變量可指向什么數(shù)據(jù)類型變量就叫什么數(shù)據(jù)類型指針變量為好,如 int *p;的聲明p可以指向整型變量,說p是整型指針變量為好。
聲明指針變量時(shí),還要聲明允許指針變量指向的數(shù)據(jù)類型,這由聲明指針變量時(shí)“*”前面的“基類型”決定。指針類型加減整數(shù)運(yùn)算時(shí)移動(dòng)的位置大小由指向的數(shù)據(jù)類型來決定。指向同一種數(shù)據(jù)類型的不同指針變量間可以進(jìn)行加減或大小比較運(yùn)算,指向不同數(shù)據(jù)類型的指針變量不能進(jìn)行加減運(yùn)算或大小比較運(yùn)算。指針變量一旦被“基類型”聲明可指向某種數(shù)據(jù)類型,就不能再指向其他別的數(shù)據(jù)類型。
指針類型中的指針變量還可進(jìn)行自增自減運(yùn)算,而指針不能。指針變量既可以是左值,也可以是右值,指針只能是右值。由指針、指針變量與運(yùn)算符構(gòu)成指針類型表達(dá)式。下面說的“&”作為單目運(yùn)算符時(shí)與一個(gè)變量結(jié)合就構(gòu)成指針表達(dá)式,如&a,&p等,而“*”作為單目運(yùn)算符只可與指針類型結(jié)合,構(gòu)成指針類型指向的數(shù)據(jù)類型表達(dá)式,如有:
int *p,a,b;
p=&a;
b=*p;
*p=10;
*&a=20;
其中“b=*p;”的*p就是整型表達(dá)式,也是一個(gè)整型變量,&a是指針類型表達(dá)式,*&a是一個(gè)整形表達(dá)式,也是一個(gè)整形變量。
對(duì)于指向指針變量的指針變量,還要復(fù)雜些[3]。
6 “&”和“*”運(yùn)算符
C語言中有“&:按位與運(yùn)算符,是雙目運(yùn)算符,結(jié)合性是由左到右”和“&:取地址運(yùn)算符,是單目運(yùn)算符,結(jié)合性是由右到左”,有“*:乘法運(yùn)算符,是雙目運(yùn)算符,結(jié)合性是由左到右”和“*:指針運(yùn)算符,是單目運(yùn)算符,結(jié)合性是由右到左(“*”在聲明指針變量時(shí)也用到了)”。
對(duì)于取地址運(yùn)算符&只能與一個(gè)變量結(jié)合構(gòu)成指針類型表達(dá)式,如有變量name,則&name就得到變量name的指針。
對(duì)于指針運(yùn)算符*,意義是“取其指向的內(nèi)容”,這里說“取其指向的內(nèi)容”不是指存儲(chǔ)單元里存放的值,而是表示指針變量指向的變量。在有的書中說“例如:&a為變量a的地址,*p為指針變量p所指向的存儲(chǔ)單元的內(nèi)容(即p所指向的變量的值)[1]”,這種說法值得商榷。筆者認(rèn)為用“*p代表指針變量p所指向的存儲(chǔ)單元(即p所指向的變量)”的說法比較合適,更直接說 *p是一個(gè)變量,因?yàn)?p可以是左值。如下代碼:
void main()
{int a,*p;
p=&a;
*p=10;
printf("%d,%d\n",a,*p);
*&a=20;}
輸出a和*p的結(jié)果都為10,說明*p與a等價(jià)。通過 *&a= 20;語句還可以改變a的值,也說明 *&a與a等價(jià),*&a可以是左值[4]。
總結(jié)
以上是生活随笔為你收集整理的c语言中指针的类型,学习C语言中的指针类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux qos 实现机制,linux
- 下一篇: 电脑桌面软件怎么隐藏 电脑如何隐藏桌面软