前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇c語言指針范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。
中圖分類號:TP312文獻標識碼:A文章編號:16727800(2012)008004302
作者簡介:衛五波(1981-),男,碩士,四川郵電職業技術學院助理講師,研究方向為Web應用和網絡通信;陳冬(1981-),男,碩士,四川郵電職業技術學院助理講師,研究方向為移動游戲平臺和中間件系統。
1指針與指針變量
1.1指針
C語言中,任何數據都會占用內存單元的。計算機內存的每個存儲位置都對應唯一的存儲地址,而變量名作為變量數據存儲區域所取的名字,代表的是一個內存編號,而這個內存編號對于用戶來說是未知的。如定義:int a=12。
變量名a代表某個內存單元,而變量值12則是這塊內存單元里面的內容。在整個程序運行過程中,通過變量名來訪問變量,變量名a所代表的這塊內存單元不變,所改變的只是這塊內存單元里面的值。
C語言也支持使用變量存儲地址來對變量進行存取操作,要取得變量的存儲地址,可使用取地址運算符&,如&a表示變量a的存儲地址;而變量的存儲地址就是指針。
1.2指針變量
指針類型就是C語言中用于表示存儲地址的數據類型,而專門用來存放變量存儲地址的變量則稱為指針變量。
格式:數據類型 *指針變量名。跟普通變量不同的是,所有指針變量占用的內存單元大小是一樣的,前面的數據類型代表的是指針變量所指向變量的數據類型。如以下代碼:
int a,*b;//a是一個int型變量,b是一個指向int型數據的指針變量
b=&a;//代表b指向a
下面代碼是錯誤的:
float a;
int *b=&a//此條語句有誤,b只能指向int型變量
為了訪問指針變量所指向變量的值,可以通過間接訪問運算符*,如:
int a=12,*b=&a;
*b就代表取出b所指向變量a的值,也就是*b=*(&a)=a。
1.3二級指針變量
在C語言中,任何值都有所對應的內存地址,上述介紹的指針變量是指向普通變量的,也就是普通的指針,稱為一級指針變量。
還有一種指針變量所指向的變量不是普通變量反而還是一個指針變量,這種變量稱為二級指針變量。如:
int a=12;//普通變量a
int *b=&a;//一級指針變量b,指向普通變量a
int *c=&b;//二級指針變量c,指向指針變量b
而這時,*c只是代表取c所指向的變量b里面的值:&a,而a的地址又是未知的。所以,對于二級指針變量c,要想取出a的值,必須需要兩個間接訪問運算符**,如**c=**(&b)=*b=*(&a)=a。
2指針與數組的關系
2.1指針與一維數組
數組元素在內存中是順序存放的,并且數組名代表的是這一塊內存單元的首地址,數組其他元素的地址可以根據每個元素所占用的內存單元依次推知。因此,一維數組的數組名實際上就是該數組的指針。如以下定義:
int a\[10\]={1,2,3,4,5};int *p=a;
此時,p指向數組中的第1個元素(a\[0\]),p+1指向第2個元素(a\[1\]),依次類推。當然,p最開始也可以指向其他元素,如指向第4個元素:p=&a\[3\];
在指針的運算中,經常會跟自增或自減運算符結合起來使用,如以下代碼:
int a\[\]={20,21,22,23,24,25,26,27,28,29};
int *p,i;
p=&a\[4\]; //p初始指向第5個元素
printf("%d\n",*(++p));/*由于自增運算符在前,所以p先指向a\[5\],之后輸出為25*/
printf("%d\n",(*p)++);/*先輸出p指向的內容25,之后再把指向的內存單元的內容加1,也就是a\[5\]的值變為26,p的指向不變/
printf("%d\n",*(--p));/*先改變p的指向,指向a\[4\],之后輸出a\[4\]的內容24*/
printf("%d\n",- -(*p)); /*先把p所指向的a\[4\]的內容減1,變為23,之后輸出23*/
for(i=0;i
printf("%4d",a\[i\]);/*輸出結果為20 21 22 23 23 26 26 27 28 29*/
printf("\n");
上述代碼就是指針與數組之間關系的一個典型示例,通過自增或自減運算符不光改變p的指向,也可以改變p所指向的內存單元里面的內容(也就是數組元素的內容)。
C語言編程過程中,假設定義一個變量,編譯時就為這個變量分配一定長度的內存空間。而在內存區每一個內存單元都有一個地址,用來標識內存單元,在地址所標識的單元存放數據。而正確使用指針變量,區分指針變量和指針的指向變量的含義和用法,判斷變量與運算符的結合順序來確定變量的數據類型以及指向變量或成員變量的類型。通過指針來訪問數組元素和下標法數組元素的等價關系,作為函數參數的指針變量,可以改變所指向的主調函數變量的值。動態存儲分配、對鏈表的創建以及相關操作都可以運用指針實現。
類成員的指針,類成員與外部變量相互比較,進行區分的方法就是它所在的域的不同,因為域的不同而決定了變量可以使用的范圍,一個指向類的成員函數或者成員變量的指針,就要規范它的參數列表、返回類型,以及被指向變量或函數的域,所以使用類域限定如下:
classNJUPT{ staticdoublenumber=20000000; intnum; public: NJUPT():num(10){}; intget(){returnnum;}; doublegetNumber(){reuturnnumber;}}
在這里定義的成員指針為intNJUPT::*p;//指向int型成員變量int(NJUPt::*)p()//指向intf()型成員函數。
那么調用的方式為:cout<;
返回指針的函數,一個函數的接口是它的返回值,C語言可以自定義類型,我們使用引用作為函數的實際參數,或在函數的實際參數中使用指針。使用一個函數返回一個指針很容易將一個局部變量的地址傳出來。例如:
UserType*Process(){ UserTypeut(param—list); //processut; return&;ut;//}
變量在函數運行結束已經被銷毀,被傳出的地址實際已經不存在被釋放了。所以很容易出錯。另一點是在運用new的時候。易造成內存泄露。
UserType*Process(){ UserTpye*put=newUserType(param—list); //processput; returnput;}
在函數內部使用一個new,分配了一個空間傳出來。這樣就不會發生問題,只是編程過程中通常會忘記在程序的外面把借來的空間還回去而造成內存泄露,所以把函數的參數設定為指針或引用作為代替。
兩指針變量相減:所得之差是兩個指針所指數組元素之間相差的元素個數。實際上是兩個指針值(地址)相減之差再除以該數組元素的長度(字節數)。例如pf1和pf2是指向同一浮點數組的兩個指針變量,設pf1的值為2010H,pf2的值為2000H,而浮點數組每個元素占4個字節,所以pf1—pf2的結果為(2000H—2010H)/4=4,表示pf1和pf2之間相差4個元素。兩個指針變量不能進行加法運算。例如,pf1+pf2是什么意思呢?毫無實際意義。
關鍵詞:C語言,指針,內存
1 引言
C語言的一大特點就是數據類型豐富,其中一個重要的數據類型就是指針,它也是C語言的精華所在。利用指針可以有效的表示復雜的數據結構,實現動態內存分配,更靈活、方便的使用數組、字符串,還能實現為函數間各類數據的傳遞提供簡潔便利的方法。熟練掌握指針的應用,可以使程序簡潔、緊湊和高效。
2 指針的概念
要想了解什么是指針,就必須弄清楚數據在內存中是如何存儲的,內存是以字節為單位的一片連續的存儲空間,每一個字節單元對應著一個唯一的編號,這個編號被就稱為內存單元的地址,相當于賓館的房號一樣,在地址所標識的內存單元中存放數據,就相當于房間里入住的客人一樣。若有如下定義:
char a;
int b;
float c;
根據變量的類型,內存為其分配相應的存儲空間如圖所示,由于變量a是字符型,所以內存為其分配1個字節的存儲單元,變量b是基本整型,內存為其分配2個字節的存儲單元,變量c是浮點型,內存為其分配4個字節的存儲單元。內存為變量分配存儲空間的首個字節單元的地址稱為該變量的地址。如a的地址是1000,b的地址是1001,c的地址是1003。由此可見,地址就是用來標識每一個存儲單元的,以方便用戶對存儲單元中的數據能夠正確訪問,在高級語言中就形象的將地址稱為指針。指針可以用來指向變量、數組及其元素、結構體、和指針(稱為多級指針)等,但不能用指針來指向表達式、常量、和寄存器變量等,因為這些對象沒有地址的概念。
3 指針變量的定義和初始化
在C語言中規定,所有的變量必須先定義,后使用,對于指針變量,也不例外,其定義形式如下:
類型標識符 *指針變量名
例如:
char *a; /*定義一個指向字符型變量的指針變量a*/
int *b; /*定義一個指向整型變量的指針變量b*/
flaot *c; /*定義一個指向浮點型變量的指針變量c*/
需要注意的是,在定義指針變量時的*僅僅只是一個說明符,表面其后所定義的變量是一個指針變量。
既然指針是一種變量,那么就應該和其他變量一樣,在定義的同時也可初始化。論文參考。例如:
char a=5,*b=&a;
這里由于指針變量b是指向字符型變量a的,所以在定義時,指針變量b的類型要與它所指向變量的類型一致,而“&”是一個取地址運算符,&a就來表示變量a的地址。通過對指針變量初始化,建立起指針變量b的指向,如圖2所示。系統為指針變量b分配的存儲空間地址是4100,b中存放的是變量a的地址,即1000,當需要讀取變量a的值時,如果直接按變量名a的方式,就是對內存單元的直接存取方式,現在既然指針變量b是指向變量a的,那么也就可以先通過指針變量b得到b的值1000,即a的地址,再根據地址1000讀取它所指向存儲單元的值5。論文參考。這種間接的通過變量b得到變量a的地址,然后在存取變量a的值的方式就稱為間接存取方式。
4 指針運算符
“*”運算符稱為指針運算符,“&”是地址運算符,二者可以看作是一對互逆運算符。“&”的作用在前面已經說明,這里不再贅述。而“*”的作用是取其指向變量的內容(不是地址,是地址對應存儲單元的值)。例如有如下程序段:
int i=3,j=4,k,*p,*q;
p=&i;
q=&j;
k=*p**q;
在這個程序段中多次使用到了“*”,要想得出k的結果,就要區分出每個地方出現的“*”所表示的含義,在定義時p和q前的“*”的作用只是用來標識這兩個變量是指針變量,接下來通過將變量i的地址賦給p,變量j的地址賦給q,建立起指針變量p和q的指向,最后就是求解k的值了,在這條語句中出現了三個“*”,其中p和q前的“*”均是指針運算符,也就是用來分別去p、q所指向變量i、j的內容,即就是3和4,剩下的“*”則表示乘運算,所以求得k值為12。由此可見,要想得出正確的結果,首先要分清“*”在每一處的作用,為了方便解題,給出兩個等價轉換關系,供大家使用:
①i=*p=*(&i)
②p=&i=&(*p)
5 指針運算
常用的指針運算主要有三種:賦值運算,關系運算和算術運算。
首先對于賦值運算,前面的例子中已經見過,如:b=&a,p=&i。需要注意的就是不能夠將一個常量地址賦給指針變量,如:int *p;p=1000;也不能讓指針變量指向與它類型不相同的變量,如:int *p;float i;p=&i;
其次指針也可以進行關系運算,但在進行關系運算之前,指針必須先建立指向關系,即指針有初值,另外,只有相同類型的指針才能進行比較。
最后,指針也可以進行算術運算,對一個指針加、減一個整數n是,并不是用指針值直接加、減n,而是與指針的數據類型有關,若用公式表示即為:指針變量值±n×sizeof(指針類型),例如:
int a=1,b=2,c=3,*p=&a;
假設內存為a、b、c3個變量分配在了一個連續的存儲區域內,a的地址為1000, p指向變量a,即p的內容是1000,如圖3所示。執行p=p+2后,表示指針向下移動兩個整型變量的位置,如圖4所示,p的值為1000+2*sizeof(int)=1000+2×2=1004,而不是1002。利用指針的這一特點,指針被大量的使用在數組中,從而在訪問數組元素時更加靈活,快捷。
6 總結
本文中介紹了指針的基本概念和初步應用,由于指針式C語言中一個重要的概念,也是C語言的一大特色,使用指針可以提高程序的效率,可以實現動態存儲分配,也可以在調用函數時變量改變了的值能夠為主調函數使用。論文參考。但是同時由于指針使用過于靈活,使用起來很容易出錯,而且這種錯誤往往比較隱蔽,難于發現,所以在使用指針時要仔細小心,最好通過上機調試程序,弄清每一個細節,累積編程經驗。
7 參考文獻
[1]譚浩強. C程序設計(第三版)[M].清華大學出版社. 2005
[2]宗大華、蔣瑋. C語言程序設計[M].人民郵電出版社. 2003
[3]黃維通,馬力妮. C語言程序設計[M]. 北京:清華大學出版社. 2003
摘 要 指針在C語言學習中起著舉足輕重的作用,c語言學的好不好關鍵在于對指針的掌握。本文介紹了指針學習的現狀、引入指針的作用,并對C語言指針中較易混淆的概念進行了詳細闡述,最后探討了指針與數組、函數的關系和使用方法。
關鍵詞 指針 C語言 數組 函數
中圖分類號: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語言程序設計》①課程教學的重點與難點。通過使用指針變量可以較方便地使用字符串、數組,可以表示各種數據結構,從而能夠編寫出執行效率高、可讀性強的程序,它在很大程度上增強了C語言的功能。
對于一個不涉及指針、只有程序設計結構、函數和數組的程序,許多學生在分析它時還覺得得心應手,一旦引入了指針,便不知所措。究其原因,對指針的理解只停留在表層,沒有從較深層次去理解。指針的概念本身比較復雜,涉及指針與地址、普通變量與指針變量、指針與函數、指針與數組,使用也比較靈活,需要多思考、多總結、多上機,在實際操作中才能逐漸掌握。因此,如何學好C語言中的指針成了一個值得研究的課題,下面就幾年來在實踐教學過程中存在的想法進行總結和學習。
1 引用指針的作用
通過定義指針變量可以確定存儲單元的地址和類型,如有int i, *p=&i;則變量i與*p是等價的,在程序中可以用變量i和*p兩種方式來訪問存儲單元。因此,指針變量是一種新的訪問存儲單元的方法,它的作用主要表現在三個方面:
(1)能夠突破變量作用域的限制。程序中通常把一部分代碼放在一個函數中,基于函數的封閉性,有些操作我們不能在它的外部執行,比如利用函數交換兩個實參的值。當使用指針變量作參數時,實參傳遞的是對應存儲單元的地址,若利用形式參數直接訪問對應存儲單元,將會打破變量作用域的限制,可以在函數中使用外部的存儲單元。
(2)可以提高函數的執行效率。形參相關的存儲單元較大時,如結構體,函數執行中用實參賦值給形參將花費較多時間和存儲空間。如果把形參的類型換成相應的指針類型,函數的執行效率則會大大提高。
(3)使用未命名的存儲單元。內存中的堆存儲空間在程序運行中是用戶自己申請并指定大小,一般通過調用庫函數來完成,沒有變量直接參與,只能利用指針變量間接引用的方式實現。
2 指針中較易混淆概念的理解
2.1 指針變量和指針運算符
C語言中通過變量使用計算機中的內存,變量是內存中某塊存儲單元的標識,它用來存放數據,如整型變量存儲整數,浮點型變量存儲實數。指針變量也是一種變量,定義一個指針變量就會有一塊存儲單元與之對應,只是它存儲的是地址,是某類型的地址,如實型指針變量只能存儲實型變量的地址,短整型指針變量只能存儲短整型變量的地址。
指針運算符“*”在指針中一般在兩種情況下出現:第一種是定義指針,如int i=13,*q;第二種是在賦值語句或程序執行中出現。第一種中“*”代表該變量的類型是指針型變量,指針變量名是p,而不是*p。第二種中 “*” 運算符表示取它指向的內容,*q表示指針變量q所指向的變量。
比如給指針賦值,可以采用兩種方法: ① int i=3,*p; p=&i; ② int i=3,*p=&i;分別是先定義后賦值和邊定義邊賦值。實際教學中許多學生在先定義后賦值p=&i中常常將p錯誤寫成*p ,主要是沒有弄清楚概念,&i表示變量i的地址,而*p表示p指向的變量,變量的內容是數據,數據和地址是兩種不同的值。
2.2 指針變量與自增自減運算符混合
許多學生在編程過程中總是辨不清(*p)++與*p++,其實仔細分析不難發現這兩個表達式在程序執行時是有規律可循的。比如有int i=3,*p; p=&i;成立,則(*p)++可以(下轉第141頁)(上接第114頁)先求括號中的內容,再進行自增運算,相當于i++ ;而對于*p++來說,它需要考慮運算符的優先級和結合方向。由于自增運算符++與指針運算法*優先級別相同,結合方向又為自右而左,它相當于*(p++),可以分成兩步進行計算,第一步執行*p,即i的值,第二步執行指針移動p=p+1, p值發生改變。
2.3 數組名和函數名
數組名不能代表整個數組。C語言規定數組名(不包括形參數組名,形參數組并不占據實際的內存單元)代表數組中首元素的地址,②即序號為0的元素的地址。
假設a是一維數組,如int a[10]; ,數組名a代表數組首地址,則a+i代表從首地址開始,往后偏移i個位置,即相當于是數組元素a[i]的地址。因此,a和&a[0]都代表第一個元素的地址,同理a+i和&a[i]都代表第i+1個元素的地址。
假設b是二維數組,如int b[4][5]; ,可以把數組b看成包含4個元素的一維數組(b[0]、b[1]、b[2]、b[3]),而其中每一個元素又是一個一維數組,包括5個元素。因此,在二維數組中數組名b代表數組的首地址,b+1是序號為1的行的首地址或稱第2行的首地址。
跟數組名一樣,函數名可以退化成指針。函數名是函數的地址,也就是入口地址。
3 指針與數組、函數的關系
3.1 指針與數組
指針可以指向數組,而數組也可以是指針數組。因此,指針與數組關系中有指向數組元素的指針和和指針數組。兩者在形式上很相近,但意義不同。
定義指向數組元素的指針與指針變量的定義相似,如int a[10]; int *p;p=&a[0]; ,那么指針變量p指向了一維數組的第一個元素,通過指針下移可以指向數組中其它元素。而且,可以使用下標法(如a[i]形式)和指針法(如*(a+i)或*(p+i))訪問一個數組元素。同時,在編程過程中我們經常見到形如int(*p)[10]的表示形式,其中p用來表示指向一維數組,p所指向的對象包括10個整型元素的數組。
指針數組是形如*p[5],它是一個數組,每一個元素都相當于一個指針變量。為了更方便、靈活的處理字符串,引入了指針數組。二維字符數組和指針數組都可以用來存放字符串,如果使用二維字符數組存放則會產生一些問題,比如在定義二維字符數組時,需要規定列數,而實際操作中,給定的各個字符串長度往往不相等,若以最長得字符串長度來限定列數,將會浪費許多內存空間。如果以指針數組來存放,只需將指針數組的各個元素指向相應字符串,通過改變指針數組元素的指向就能改變各元素的值。
3.2 指針與函數
指針可以指向字符變量、實型變量、一維數組、字符串,也可以指向一個函數。函數名代表函數的入口地址,即函數的指針,形如c =(*p)(a,b); ,它用指針形式實現了函數的調用。
函數可以返回整型值、實型值,也可以返回一個地址。形如,int *a(int x,int y);從形式上看,該式子與普通函數的定義比較相似,這里函數名a前多了一個*運算符,它表示函數是指針型函數,一般在該函數內部會再定義一個指針變量,同時給出相應的return語句。
4 總結
指針不僅在C語言中占據核心地位,還在一些課程如《數據結構》③中起很重要的作用,該課程里幾乎所有算法的實現都離不開指針。而且,指針也出現在許多重要考試中,如大學計算機等級考試和計算機軟件水平能力考試。因此,指針是學好C語言的關鍵。但C語言概念復雜,使用靈活,大部分學生難以掌握。在上機實驗中,學生更容易出錯,而且錯誤難以發現,這不僅要求教師在教學中能夠深刻理解指針的概念,做到靈活應用,還需要不斷的進行總結、比較和實踐,而且要求教師能夠利用各種教學手段與方法讓學生更容易接受和理解, 同時也要求學生能夠深入理解指針的概念、注重上機,在實踐中不斷學習、提高和完善。
注釋
① 任正云,李素若.C語言程序設計.北京:水利水電出版社,2007.
關鍵詞:指針;C語言;變量
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2012)21-5163-03
C Language Pointer in the Teaching of Basic Application
CHEN Jing-yan1,CHEN Yue-bin2
(1.Medical College of Shantou University, Shantou 515041, China; 2.Zengcheng College of South China Normal University, Guangzhou 511363, China)
Abstract:It can be said that the pointer is the soul of the C language, familiar and flexible use of the pointer, you can effectively represent complex data structures; dynamic memory; the use of string; arrays are very effective. Beginners often an error, how to enable students to acquire and in-depth learning pointer is a difficult and often requires some time. The following combination of experience, discuss and summarize the pointer problem.
Key words:pointer;C language;variable
C語言是一種計算機程序設計語言,是目前最廣泛使用的計算機語言之一,也是各高校專業與非專業主要的計算機教學語言。指針是C語言中最為復雜的一個部分,使用起來非常靈活,因而學習時常出錯,必須小心,多思考,多比較,在實踐中把其掌握好。
1指針概念
指針變量簡稱指針,其實它也是變量,只不過里面存放的內容是一個地址,這個地址指向另外一個變量。指針就是內存的地址,必須弄清楚數據在內存中是如何存儲與讀取的;內存單元地址與內存單元內容是兩個不同的概念。內存單元地址就像賓館每個房間一樣,其房間號就是其地址,單元內容可以理解為房中的賓客;如圖1所示:假設程序定義了三個變量a、b、c,編譯時系統分配1000和10001兩個字節給a,1002和1003給b,1004和1005給c。由此可以知道,地址是用來標識每一個存儲單元,是用戶對存儲單元中的數據的訪問,在C語言中形象的將地址叫做指針,它可以用來指向變量、數組、結構體、和多級指針等等。對于表達式、常量或者是寄存器變量則不能用指針來指向。
2指針變量的定義和引用
2.1指針變量的定義
C語言規定指針變量在使用之前必須被定義,遵循先定義后使用的原則,定義指針變量與一般變量定義開式相似,也是用說明語句來實現的,但不同于其他類型變量的就是它是用來專門存放地址的。
指針變量定義的一般開式為
類型標識符*指針變量名;
下面都是合法的定義:
int *g1,*g2,*g3;定義g1、g2、g3指向整型數據的指針變量。
float *k1,*k2,*k3;定義k1、k2、k3指向實型數據的指針變量。
char *m1,*m2,*m3;定義m1、m2、m指向字符型數據的指針變量3。
在定義指針變量值得注意的是:
①“*”是一個指向符號,表示標識符為指針變量,上面的g1、g2、g3等是指針變量名,而不是*g1、*g2、*g3,值得注意的是指針變量是用來存放地址的。
②一個指針變量只能指向同一個類型的變量。由于不同類型的數據在內存中所占的字節數不同,如果忽而指向一個整型變量,忽而指向一個實型變量,會使系統無法管理變量的字節數而發生錯誤,所以只有同一類型變量的地址才能放到指向該類型變量的指針變量中。
2.2指針變量的引用
例如:
main()
{
int i=10,j=20;
int *g1,*g2;
g1=&i;
g2=&j;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*g1,*g2);}
運行結果為:10,20
10,20
本程序定義了兩個指針變量g1和g2,“g1=&i;和g2=&j;”語句是將i與j的地址分別賦給g1和g2,不能寫成“*g1=&i;和*g2=&j;”。
與指針相關的兩個運符:
①&:取地址運算符。
②*:指針運算符或稱間接訪問運算符,取指針所指向的目標值。
“&”與“*”運算符的優先級別相同,按自右而左的方向結合,如“g1=&i;”語句,若&*g1,先進行的是*g1的運算,再執行&運算。如:*&i的含義是什么?當然先進行&i運算,得到i的地址,再進行*運算。
3數組的指針與函數的指針
3.1數組的指針
有兩個概念我要必須分清。一個是指針數組:首先它是一個數組,數組的元素都是指針,數組占多少個字節由數組本身決定。它是“儲存指針的數組”的簡稱。另一個是數組指針:首先它是一個指針,它指向一個數組。
簡單舉例說明:
int *p[10];首先聲明了一個數組,數組的元素是int型的指針。
int (*p)[2];聲明了一個指針,指向了一個有兩個int元素的數組。
其實這兩種寫法主要是因為運算符的優先級,因為[]的優先級比*高。所以第一種寫法,p先和[]結合,所以是一個數組,后與*結合,是指針。后一種寫法同理。
應當注意,如果數組為int型,指針變量也應是int型。下面是指針元素的賦值:
p=&a[0];
C語言規定數組名代表數組的首地址,是第一個元素的地址。所以p=&a[0]與p=a是等價的。注意a不代表整個數組,“p=a;”的作用是把a數組的首地址賦給p,而不是a的所有元素都賦給p。
在定義指針變量時是可以賦給初值的:
int *p=&a[0];
等效于:
int *p;
p=&a[0];
多維數組(以二維數組為例)
二維數組的定義:
static int a[2][3]={{1,2,3},{4,5,6}};
a是一個數組的名字,包含二個元素:a[0],a[1]。而每個元素又是一個一維數組,每個一維數組又包含有三個元素。如a[0]中的三個元素分別為a[0][0],a[0][1],a[0][2]。a代表的是二維數組的首地址。
3.2函數的指針
指針是可以指向一個函數的,在編譯時被分配給一個入口地址,這個入口地址就叫做函數的指針。在一個程序中,一個指針變量可以先后指向不同的函數。
指向函數的指針變量定義開式為:
數據類型標識符(*指針變量名)(參數1,參數2);
下面通過例子來說明用指針形式實現對函數調用的方法。
int max(int a,int b)
{
if(a>b)return a;
else return b;}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
pmax為函數指針變量,并把函數入口地址賦給該函數指針變量,pmax=max。調用函數的形式:(*指針變量名)(參數表)其中的*號不是求值運算,它只是一種表示符號。如本程序中的z=(*pmax)(x,y);值得注意的是:函數指針變量與數組指針變量是不相同的,數組指針變量加減一個整數可使指針移動指向后面或前面的數組,而函數指針是沒有移動的意義的
4總結
C語言指針對于初學者來說是一個短時間內很難掌握的問題,指針靈活性較大,對于剛開始學習的學生,要搞清楚指針的各個方面內容,例如:指針類型、指針所指向的類型、指針所指向的內存區,還有指針所占據的內存區等基礎方面內容。在多思考、多注重比較和多上機實踐,才能真正的掌握好指針課程。