摘 要:指針變量的運(yùn)用是C語(yǔ)言程序設(shè)計(jì)的重要核心部分。程序中的數(shù)據(jù)在內(nèi)存中的有效讀取及程序執(zhí)行效率的提高多數(shù)情況取決于是否靈活使用指針。本文旨在探索C語(yǔ)言程序設(shè)計(jì)實(shí)踐過(guò)程中如何正確操作指針變量,從而方便操作與之關(guān)聯(lián)的字符串、數(shù)組、函數(shù)間數(shù)據(jù)的傳遞,繼而解決C語(yǔ)言程序設(shè)計(jì)中的許多實(shí)際問(wèn)題。
關(guān)鍵詞:指針變量 數(shù)組 字符串 函數(shù) 常見(jiàn)問(wèn)題
中圖分類(lèi)號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1673-9795(2013)08(b)-0163-01
指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類(lèi)型。運(yùn)用指針編程是C語(yǔ)言最主要的特點(diǎn)之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu),也能很方便地使用數(shù)組和字符串,更加能像匯編語(yǔ)言一樣處理內(nèi)存地址,[1]從而編寫(xiě)出精練而高效的程序。
1 指針變量的使用優(yōu)勢(shì)及常規(guī)用法
(1)使用指針指向數(shù)組首地址,簡(jiǎn)化了數(shù)組相關(guān)的程序內(nèi)容的書(shū)寫(xiě),避免了整體使用數(shù)組,在程序執(zhí)行中減少了先找數(shù)組元素的地址再取數(shù)組元素內(nèi)容的過(guò)程,直接在數(shù)組所在的地址范圍內(nèi)操作數(shù)組元素,提高了程序的執(zhí)行效率。(2)使用指針指向字符串(即字符數(shù)組),把一個(gè)字符串整體當(dāng)作一個(gè)數(shù)組元素,多個(gè)字符串的指針變量就構(gòu)成了指針數(shù)組,不僅節(jié)省了內(nèi)存空間,還大大地提高了程序的執(zhí)行效率。(3)指向單變量的指針變量作為函數(shù)參數(shù),可以在程序執(zhí)行過(guò)程中及時(shí)轉(zhuǎn)向調(diào)用函數(shù)的入口。節(jié)省內(nèi)存空間的同時(shí),把指針變量替代單變量作為直接變量在調(diào)用函數(shù)執(zhí)行過(guò)程中執(zhí)行相應(yīng)程序操作,免去了返回值的執(zhí)行時(shí)間與過(guò)程。(4)指向結(jié)構(gòu)體復(fù)合變量的指針變量作為函數(shù)參數(shù),可以通過(guò)變化結(jié)構(gòu)體變量靈活使用指針變量在調(diào)用函數(shù)中執(zhí)行函數(shù)的程序操作,不僅節(jié)省內(nèi)存空間與執(zhí)行時(shí)間,而且方便程序變量的修改,提高了程序的可移植性。(5)指向函數(shù)的指針變量作為函數(shù)的參數(shù),可以在一個(gè)主函數(shù)中實(shí)現(xiàn)多個(gè)自定義函數(shù)功能間的調(diào)用,大大地提高了程序的靈活性與可移植性及程序執(zhí)行的效率。(6)使用指針指向文件類(lèi)型結(jié)構(gòu)體,可以找到與之相關(guān)的文件,實(shí)現(xiàn)文件的訪(fǎng)問(wèn),在主函數(shù)執(zhí)行過(guò)程中靈活轉(zhuǎn)向其它文件的執(zhí)行。
2 指針變量使用常見(jiàn)問(wèn)題及解決方法的探求
2.1 指針變量的初始化
同其他變量的初始化相似,在指針變量的定義之后就應(yīng)該給指針變量賦一個(gè)初始的地址值。如果沒(méi)有給定義的指針變量賦初值的話(huà),指針變量的值不定,可能會(huì)導(dǎo)致一些隱藏在某些地址號(hào)的內(nèi)存中的難以跟蹤的漏洞(bug)運(yùn)行。如:
int *p; *p=100;
p定義為一個(gè)指向整型變量的指針變量,但是卻沒(méi)有給p賦予一個(gè)初始的地址值,只是把一個(gè)存儲(chǔ)100的常量的存儲(chǔ)單元的首地址賦給了p,而這個(gè)存儲(chǔ)單元的首地址可能在程序其它位置另作它用,就會(huì)產(chǎn)生隱形的難以追蹤的bug的運(yùn)行。因此,為了避免可能性的發(fā)生,就要和其他變量的使用一樣,在定義指針變量的時(shí)候就要同時(shí)給予指針變量一個(gè)初值,以確定指針變量的初始的地址,即指針變量的初始化。將上述例子修改為:
int a=100; int *p=a;
還要注意把“int *p=a;”和“*p=a;”混淆,前者是指針變量的初始化語(yǔ)句,即定義的同時(shí)給指針變量賦初值,而后者是一個(gè)旨意錯(cuò)誤的賦值語(yǔ)句,把整型變量a的首地址賦給了p所指向的整型變量。
2.2 指針變量的賦值
給指針變量賦予的初值一定是地址。同樣,在程序中給指針變量重新賦予的值也只能是地址或使指針變量指向同類(lèi)型的變量值的首地址。如:
int a,*p; p=a;
要使p指向a,就要有地址運(yùn)算符對(duì)a取首地址后賦給p,或者把變量取內(nèi)容賦給p,而不是直接把a(bǔ)賦給p。C語(yǔ)言編譯器會(huì)提示指出這是個(gè)語(yǔ)法錯(cuò)誤,給指針變量賦予的內(nèi)容和指針變量不匹配。正確的賦值一般形式為:
int a,*p; p=a;
或 int a,*p; *p=a;
還要說(shuō)明的是指針的指向要有具體類(lèi)型說(shuō)明。不能給指針賦予與其基類(lèi)型不符的地址,否則也會(huì)出現(xiàn)語(yǔ)法上錯(cuò)誤。如:
int a=100; double *p; p=a;
在給指針賦值時(shí),不只要求是地址,還要是一個(gè)與該指針類(lèi)型相符的變量或常量的首地址。而上述例子中,a是整型的變量,p是基類(lèi)型為雙精度型的變量。二者不相匹配,這種賦值在編譯時(shí)就會(huì)發(fā)生語(yǔ)法錯(cuò)誤。因此,給指針變量的賦值要注意指針變量的基類(lèi)型,即指針變量能夠指向的變量類(lèi)型。
2.3 指針在函數(shù)之間值的傳遞
#include “stdio.h”
void swap(int *a, int *b)
{int t; t=*a; *a=*b; *b=t;}
void main( )
{int x,y; printf(“請(qǐng)輸入兩個(gè)整數(shù):”);
scanf(x,y); printf(“x=%d, y=%d\n”,x,y);
swap(x,y); printf(“x=%d, y=%d\n”,x,y);}
函數(shù)間的值傳遞也可以通過(guò)實(shí)參的地址單向傳遞給形參的指針變量,直接調(diào)用函數(shù),完成函數(shù)間數(shù)據(jù)傳遞的目的。主函數(shù)main( )在調(diào)用函數(shù)swap( )的同時(shí),把變量x和y的地址分別單向傳遞給了指針變量a和b。也就是主函數(shù)中對(duì)整型變量x和y的操作,通過(guò)地址的傳遞,雖然在調(diào)用函數(shù)過(guò)程中形式上是對(duì)指向整型變量x和y的指針變量a和b的內(nèi)容(即x和y)的操作,實(shí)質(zhì)上仍然是繼續(xù)對(duì)整型變量x和y調(diào)用函數(shù)的操作。也就沒(méi)有必要給主函數(shù)返回x和y的值了。省去了返回的時(shí)間和操作過(guò)程,提高了程序的執(zhí)行效率與正確率。
2.4 指向指針變量的指針變量
*p,**p,***p分別叫做一級(jí)指針、二級(jí)指針和三級(jí)指針。如果這樣定義:
int a, *p, **q, ***r;
則第一個(gè)*p中的p可以用來(lái)存放普通整型變量的地址,例如賦值:p=a。第二個(gè)**q中的q可以用來(lái)存放整型變量地址的地址,例如指針變量p的地址,p是指針變量,變量的值是整型變量a的地址,那么p這個(gè)指針變量的地址就需要一個(gè)比p高一層的指針來(lái)存放。因此可以這樣賦值:q=p。第三個(gè)***r,道理相同,可以這樣賦值 r=q。指針的嵌套使用,使程序在執(zhí)行時(shí)更靈活,更有效率。
3 指針的使用是C語(yǔ)言程序設(shè)計(jì)中最重要的一環(huán)
能否正確理解和使用指針是我們是否真正掌握C語(yǔ)言的一個(gè)標(biāo)志。C語(yǔ)言中指針的使用比較靈活,很多人在實(shí)際編程中很容易出錯(cuò),而且這種錯(cuò)誤恰恰又難以發(fā)現(xiàn),所以建議初學(xué)者大量地上機(jī)調(diào)試程序,以弄清一些細(xì)節(jié),并積累經(jīng)驗(yàn),為后續(xù)編程內(nèi)容的學(xué)習(xí)打好堅(jiān)實(shí)的基礎(chǔ)。同時(shí),指針也是C語(yǔ)言中最為困難的一部分,在學(xué)習(xí)中除了要正確理解基本概念,還必須要多編程并上機(jī)調(diào)試。只要做到這些,指針也是不難掌握的。
參考文獻(xiàn)
[1]田淑清.全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程—— C語(yǔ)言程序設(shè)計(jì)[M].北京:高等教育出版社,2006.
作者簡(jiǎn)介:許晶(1978—),女,滿(mǎn)族,籍貫:山東日照,職務(wù):教師,職稱(chēng):講師,研究方向:網(wǎng)絡(luò)編程、數(shù)據(jù)庫(kù)技術(shù)。