李祥琴
荊楚理工學院計算機工程學院 湖北·荊門 448000)
摘 要 指針在C語言學習中起著舉足輕重的作用,c語言學的好不好關鍵在于對指針的掌握。本文介紹了指針學習的現(xiàn)狀、引入指針的作用,并對C語言指針中較易混淆的概念進行了詳細闡述,最后探討了指針與數(shù)組、函數(shù)的關系和使用方法。
關鍵詞 指針 C語言 數(shù)組 函數(shù)
中圖分類號:TP393 文獻標識碼:A
Study and Summary on Pointer in C Language
LI Xiangqin
(School of Computer Science, Wuhan University, Wuhan, Hubei 430079;
School of Computer Engineering, Jingchu University of Technology, Jingmen, Hubei 448000)
Abstract Pointer in C language learning plays an important role, the key is to master the pointer in C Language. This article describes the learning status of pointer, the role of introduction of the pointer, and C language pointer more confusing concepts were elaborated, and finally explore the relationship between pointers and arrays, functions, and use.
Key words pointer; C Language; array; function
0 引言
指針是C語言的精華,也是大學《C語言程序設計》①課程教學的重點與難點。通過使用指針變量可以較方便地使用字符串、數(shù)組,可以表示各種數(shù)據(jù)結構,從而能夠編寫出執(zhí)行效率高、可讀性強的程序,它在很大程度上增強了C語言的功能。
對于一個不涉及指針、只有程序設計結構、函數(shù)和數(shù)組的程序,許多學生在分析它時還覺得得心應手,一旦引入了指針,便不知所措。究其原因,對指針的理解只停留在表層,沒有從較深層次去理解。指針的概念本身比較復雜,涉及指針與地址、普通變量與指針變量、指針與函數(shù)、指針與數(shù)組,使用也比較靈活,需要多思考、多總結、多上機,在實際操作中才能逐漸掌握。因此,如何學好C語言中的指針成了一個值得研究的課題,下面就幾年來在實踐教學過程中存在的想法進行總結和學習。
1 引用指針的作用
通過定義指針變量可以確定存儲單元的地址和類型,如有int i, *p=&i;則變量i與*p是等價的,在程序中可以用變量i和*p兩種方式來訪問存儲單元。因此,指針變量是一種新的訪問存儲單元的方法,它的作用主要表現(xiàn)在三個方面:
(1)能夠突破變量作用域的限制。程序中通常把一部分代碼放在一個函數(shù)中,基于函數(shù)的封閉性,有些操作我們不能在它的外部執(zhí)行,比如利用函數(shù)交換兩個實參的值。當使用指針變量作參數(shù)時,實參傳遞的是對應存儲單元的地址,若利用形式參數(shù)直接訪問對應存儲單元,將會打破變量作用域的限制,可以在函數(shù)中使用外部的存儲單元。
(2)可以提高函數(shù)的執(zhí)行效率。形參相關的存儲單元較大時,如結構體,函數(shù)執(zhí)行中用實參賦值給形參將花費較多時間和存儲空間。如果把形參的類型換成相應的指針類型,函數(shù)的執(zhí)行效率則會大大提高。
(3)使用未命名的存儲單元。內(nèi)存中的堆存儲空間在程序運行中是用戶自己申請并指定大小,一般通過調(diào)用庫函數(shù)來完成,沒有變量直接參與,只能利用指針變量間接引用的方式實現(xiàn)。
2 指針中較易混淆概念的理解
2.1 指針變量和指針運算符
C語言中通過變量使用計算機中的內(nèi)存,變量是內(nèi)存中某塊存儲單元的標識,它用來存放數(shù)據(jù),如整型變量存儲整數(shù),浮點型變量存儲實數(shù)。指針變量也是一種變量,定義一個指針變量就會有一塊存儲單元與之對應,只是它存儲的是地址,是某類型的地址,如實型指針變量只能存儲實型變量的地址,短整型指針變量只能存儲短整型變量的地址。
指針運算符“*”在指針中一般在兩種情況下出現(xiàn):第一種是定義指針,如inti=13,*q;第二種是在賦值語句或程序執(zhí)行中出現(xiàn)。第一種中“*”代表該變量的類型是指針型變量,指針變量名是p,而不是*p。第二種中 “*” 運算符表示取它指向的內(nèi)容,*q表示指針變量q所指向的變量。
比如給指針賦值,可以采用兩種方法: ① int i=3,*p; p=&i ② int i=3,*p=&i分別是先定義后賦值和邊定義邊賦值。實際教學中許多學生在先定義后賦值p=&i中常常將p錯誤寫成*p ,主要是沒有弄清楚概念,&i表示變量i的地址,而*p表示p指向的變量,變量的內(nèi)容是數(shù)據(jù),數(shù)據(jù)和地址是兩種不同的值。
2.2 指針變量與自增自減運算符混合
許多學生在編程過程中總是辨不清(*p)++與*p++,其實仔細分析不難發(fā)現(xiàn)這兩個表達式在程序執(zhí)行時是有規(guī)律可循的。比如有int i=3,*p; p=&i成立,則(*p)++可以(下轉第141頁)(上接第114頁)先求括號中的內(nèi)容,再進行自增運算,相當于i++ ;而對于*p++來說,它需要考慮運算符的優(yōu)先級和結合方向。由于自增運算符++與指針運算法*優(yōu)先級別相同,結合方向又為自右而左,它相當于*(p++),可以分成兩步進行計算,第一步執(zhí)行*p,即i的值,第二步執(zhí)行指針移動p=p+1, p值發(fā)生改變。
2.3 數(shù)組名和函數(shù)名
數(shù)組名不能代表整個數(shù)組。C語言規(guī)定數(shù)組名(不包括形參數(shù)組名,形參數(shù)組并不占據(jù)實際的內(nèi)存單元)代表數(shù)組中首元素的地址,②即序號為0的元素的地址。
假設a是一維數(shù)組,如inta[10]; ,數(shù)組名a代表數(shù)組首地址,則a+i代表從首地址開始,往后偏移i個位置,即相當于是數(shù)組元素a[i]的地址。因此,a和&a[0]都代表第一個元素的地址,同理a+i和&a[i]都代表第i+1個元素的地址。
假設b是二維數(shù)組,如intb[4][5]; ,可以把數(shù)組b看成包含4個元素的一維數(shù)組(b[0]、b[1]、b[2]、b[3]),而其中每一個元素又是一個一維數(shù)組,包括5個元素。因此,在二維數(shù)組中數(shù)組名b代表數(shù)組的首地址,b+1是序號為1的行的首地址或稱第2行的首地址。
跟數(shù)組名一樣,函數(shù)名可以退化成指針。函數(shù)名是函數(shù)的地址,也就是入口地址。
3 指針與數(shù)組、函數(shù)的關系
3.1 指針與數(shù)組
指針可以指向數(shù)組,而數(shù)組也可以是指針數(shù)組。因此,指針與數(shù)組關系中有指向數(shù)組元素的指針和和指針數(shù)組。兩者在形式上很相近,但意義不同。
定義指向數(shù)組元素的指針與指針變量的定義相似,如int a[10]; int*p;p=&a[0]; ,那么指針變量p指向了一維數(shù)組的第一個元素,通過指針下移可以指向數(shù)組中其它元素。而且,可以使用下標法(如a[i]形式)和指針法(如*(a+i)或*(p+i))訪問一個數(shù)組元素。同時,在編程過程中我們經(jīng)常見到形如int(*p)[10]的表示形式,其中p用來表示指向一維數(shù)組,p所指向的對象包括10個整型元素的數(shù)組。
指針數(shù)組是形如*p[5],它是一個數(shù)組,每一個元素都相當于一個指針變量。為了更方便、靈活的處理字符串,引入了指針數(shù)組。二維字符數(shù)組和指針數(shù)組都可以用來存放字符串,如果使用二維字符數(shù)組存放則會產(chǎn)生一些問題,比如在定義二維字符數(shù)組時,需要規(guī)定列數(shù),而實際操作中,給定的各個字符串長度往往不相等,若以最長得字符串長度來限定列數(shù),將會浪費許多內(nèi)存空間。如果以指針數(shù)組來存放,只需將指針數(shù)組的各個元素指向相應字符串,通過改變指針數(shù)組元素的指向就能改變各元素的值。
3.2 指針與函數(shù)
指針可以指向字符變量、實型變量、一維數(shù)組、字符串,也可以指向一個函數(shù)。函數(shù)名代表函數(shù)的入口地址,即函數(shù)的指針,形如c =(*p)(a,b); ,它用指針形式實現(xiàn)了函數(shù)的調(diào)用。
函數(shù)可以返回整型值、實型值,也可以返回一個地址。形如,int*a(int x,int y);從形式上看,該式子與普通函數(shù)的定義比較相似,這里函數(shù)名a前多了一個*運算符,它表示函數(shù)是指針型函數(shù),一般在該函數(shù)內(nèi)部會再定義一個指針變量,同時給出相應的return語句。
4 總結
指針不僅在C語言中占據(jù)核心地位,還在一些課程如《數(shù)據(jù)結構》③中起很重要的作用,該課程里幾乎所有算法的實現(xiàn)都離不開指針。而且,指針也出現(xiàn)在許多重要考試中,如大學計算機等級考試和計算機軟件水平能力考試。因此,指針是學好C語言的關鍵。但C語言概念復雜,使用靈活,大部分學生難以掌握。在上機實驗中,學生更容易出錯,而且錯誤難以發(fā)現(xiàn),這不僅要求教師在教學中能夠深刻理解指針的概念,做到靈活應用,還需要不斷的進行總結、比較和實踐,而且要求教師能夠利用各種教學手段與方法讓學生更容易接受和理解, 同時也要求學生能夠深入理解指針的概念、注重上機,在實踐中不斷學習、提高和完善。
注釋
① 任正云,李素若.C語言程序設計.北京:水利水電出版社,2007.
② 譚浩強.C程序設計(第三版).北京:清華大學出版社,2005.
③ 嚴蔚敏,吳偉民.數(shù)據(jù)結構.北京:清華大學出版社,2004.