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