在线观看av毛片亚洲_伊人久久大香线蕉成人综合网_一级片黄色视频播放_日韩免费86av网址_亚洲av理论在线电影网_一区二区国产免费高清在线观看视频_亚洲国产精品久久99人人更爽_精品少妇人妻久久免费

首頁(yè) > 文章中心 > c語(yǔ)言指針

c語(yǔ)言指針

前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇c語(yǔ)言指針范文,相信會(huì)為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。

c語(yǔ)言指針

c語(yǔ)言指針范文第1篇

關(guān)鍵詞:C語(yǔ)言; 指針; 指針變量; 地址傳遞

中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):16727800(2012)008004302

作者簡(jiǎn)介:衛(wèi)五波(1981-),男,碩士,四川郵電職業(yè)技術(shù)學(xué)院助理講師,研究方向?yàn)閃eb應(yīng)用和網(wǎng)絡(luò)通信;陳冬(1981-),男,碩士,四川郵電職業(yè)技術(shù)學(xué)院助理講師,研究方向?yàn)橐苿?dòng)游戲平臺(tái)和中間件系統(tǒng)。

1指針與指針變量

1.1指針

C語(yǔ)言中,任何數(shù)據(jù)都會(huì)占用內(nèi)存單元的。計(jì)算機(jī)內(nèi)存的每個(gè)存儲(chǔ)位置都對(duì)應(yīng)唯一的存儲(chǔ)地址,而變量名作為變量數(shù)據(jù)存儲(chǔ)區(qū)域所取的名字,代表的是一個(gè)內(nèi)存編號(hào),而這個(gè)內(nèi)存編號(hào)對(duì)于用戶來說是未知的。如定義:int a=12。

變量名a代表某個(gè)內(nèi)存單元,而變量值12則是這塊內(nèi)存單元里面的內(nèi)容。在整個(gè)程序運(yùn)行過程中,通過變量名來訪問變量,變量名a所代表的這塊內(nèi)存單元不變,所改變的只是這塊內(nèi)存單元里面的值。

C語(yǔ)言也支持使用變量存儲(chǔ)地址來對(duì)變量進(jìn)行存取操作,要取得變量的存儲(chǔ)地址,可使用取地址運(yùn)算符&,如&a表示變量a的存儲(chǔ)地址;而變量的存儲(chǔ)地址就是指針。

1.2指針變量

指針類型就是C語(yǔ)言中用于表示存儲(chǔ)地址的數(shù)據(jù)類型,而專門用來存放變量存儲(chǔ)地址的變量則稱為指針變量。

格式:數(shù)據(jù)類型 *指針變量名。跟普通變量不同的是,所有指針變量占用的內(nèi)存單元大小是一樣的,前面的數(shù)據(jù)類型代表的是指針變量所指向變量的數(shù)據(jù)類型。如以下代碼:

int a,*b;//a是一個(gè)int型變量,b是一個(gè)指向int型數(shù)據(jù)的指針變量

b=&a;//代表b指向a

下面代碼是錯(cuò)誤的:

float a;

int *b=&a//此條語(yǔ)句有誤,b只能指向int型變量

為了訪問指針變量所指向變量的值,可以通過間接訪問運(yùn)算符*,如:

int a=12,*b=&a;

*b就代表取出b所指向變量a的值,也就是*b=*(&a)=a。

1.3二級(jí)指針變量

在C語(yǔ)言中,任何值都有所對(duì)應(yīng)的內(nèi)存地址,上述介紹的指針變量是指向普通變量的,也就是普通的指針,稱為一級(jí)指針變量。

還有一種指針變量所指向的變量不是普通變量反而還是一個(gè)指針變量,這種變量稱為二級(jí)指針變量。如:

int a=12;//普通變量a

int *b=&a;//一級(jí)指針變量b,指向普通變量a

int *c=&b;//二級(jí)指針變量c,指向指針變量b

而這時(shí),*c只是代表取c所指向的變量b里面的值:&a,而a的地址又是未知的。所以,對(duì)于二級(jí)指針變量c,要想取出a的值,必須需要兩個(gè)間接訪問運(yùn)算符**,如**c=**(&b)=*b=*(&a)=a。

2指針與數(shù)組的關(guān)系

2.1指針與一維數(shù)組

數(shù)組元素在內(nèi)存中是順序存放的,并且數(shù)組名代表的是這一塊內(nèi)存單元的首地址,數(shù)組其他元素的地址可以根據(jù)每個(gè)元素所占用的內(nèi)存單元依次推知。因此,一維數(shù)組的數(shù)組名實(shí)際上就是該數(shù)組的指針。如以下定義:

int a\[10\]={1,2,3,4,5};int *p=a;

此時(shí),p指向數(shù)組中的第1個(gè)元素(a\[0\]),p+1指向第2個(gè)元素(a\[1\]),依次類推。當(dāng)然,p最開始也可以指向其他元素,如指向第4個(gè)元素:p=&a\[3\];

在指針的運(yùn)算中,經(jīng)常會(huì)跟自增或自減運(yùn)算符結(jié)合起來使用,如以下代碼:

int a\[\]={20,21,22,23,24,25,26,27,28,29};

int *p,i;

p=&a\[4\]; //p初始指向第5個(gè)元素

printf("%d\n",*(++p));/*由于自增運(yùn)算符在前,所以p先指向a\[5\],之后輸出為25*/

printf("%d\n",(*p)++);/*先輸出p指向的內(nèi)容25,之后再把指向的內(nèi)存單元的內(nèi)容加1,也就是a\[5\]的值變?yōu)?6,p的指向不變/

printf("%d\n",*(--p));/*先改變p的指向,指向a\[4\],之后輸出a\[4\]的內(nèi)容24*/

printf("%d\n",- -(*p)); /*先把p所指向的a\[4\]的內(nèi)容減1,變?yōu)?3,之后輸出23*/

for(i=0;i

printf("%4d",a\[i\]);/*輸出結(jié)果為20 21 22 23 23 26 26 27 28 29*/

printf("\n");

上述代碼就是指針與數(shù)組之間關(guān)系的一個(gè)典型示例,通過自增或自減運(yùn)算符不光改變p的指向,也可以改變p所指向的內(nèi)存單元里面的內(nèi)容(也就是數(shù)組元素的內(nèi)容)。

c語(yǔ)言指針范文第2篇

C語(yǔ)言編程過程中,假設(shè)定義一個(gè)變量,編譯時(shí)就為這個(gè)變量分配一定長(zhǎng)度的內(nèi)存空間。而在內(nèi)存區(qū)每一個(gè)內(nèi)存單元都有一個(gè)地址,用來標(biāo)識(shí)內(nèi)存單元,在地址所標(biāo)識(shí)的單元存放數(shù)據(jù)。而正確使用指針變量,區(qū)分指針變量和指針的指向變量的含義和用法,判斷變量與運(yùn)算符的結(jié)合順序來確定變量的數(shù)據(jù)類型以及指向變量或成員變量的類型。通過指針來訪問數(shù)組元素和下標(biāo)法數(shù)組元素的等價(jià)關(guān)系,作為函數(shù)參數(shù)的指針變量,可以改變所指向的主調(diào)函數(shù)變量的值。動(dòng)態(tài)存儲(chǔ)分配、對(duì)鏈表的創(chuàng)建以及相關(guān)操作都可以運(yùn)用指針實(shí)現(xiàn)。

類成員的指針,類成員與外部變量相互比較,進(jìn)行區(qū)分的方法就是它所在的域的不同,因?yàn)橛虻牟煌鴽Q定了變量可以使用的范圍,一個(gè)指向類的成員函數(shù)或者成員變量的指針,就要規(guī)范它的參數(shù)列表、返回類型,以及被指向變量或函數(shù)的域,所以使用類域限定如下:

classNJUPT{ staticdoublenumber=20000000; intnum; public: NJUPT():num(10){}; intget(){returnnum;}; doublegetNumber(){reuturnnumber;}}

在這里定義的成員指針為intNJUPT::*p;//指向int型成員變量int(NJUPt::*)p()//指向intf()型成員函數(shù)。

那么調(diào)用的方式為:cout<;

返回指針的函數(shù),一個(gè)函數(shù)的接口是它的返回值,C語(yǔ)言可以自定義類型,我們使用引用作為函數(shù)的實(shí)際參數(shù),或在函數(shù)的實(shí)際參數(shù)中使用指針。使用一個(gè)函數(shù)返回一個(gè)指針很容易將一個(gè)局部變量的地址傳出來。例如:

UserType*Process(){ UserTypeut(param—list); //processut; return&;ut;//}

變量在函數(shù)運(yùn)行結(jié)束已經(jīng)被銷毀,被傳出的地址實(shí)際已經(jīng)不存在被釋放了。所以很容易出錯(cuò)。另一點(diǎn)是在運(yùn)用new的時(shí)候。易造成內(nèi)存泄露。

UserType*Process(){ UserTpye*put=newUserType(param—list); //processput; returnput;}

在函數(shù)內(nèi)部使用一個(gè)new,分配了一個(gè)空間傳出來。這樣就不會(huì)發(fā)生問題,只是編程過程中通常會(huì)忘記在程序的外面把借來的空間還回去而造成內(nèi)存泄露,所以把函數(shù)的參數(shù)設(shè)定為指針或引用作為代替。

兩指針變量相減:所得之差是兩個(gè)指針?biāo)笖?shù)組元素之間相差的元素個(gè)數(shù)。實(shí)際上是兩個(gè)指針值(地址)相減之差再除以該數(shù)組元素的長(zhǎng)度(字節(jié)數(shù))。例如pf1和pf2是指向同一浮點(diǎn)數(shù)組的兩個(gè)指針變量,設(shè)pf1的值為2010H,pf2的值為2000H,而浮點(diǎn)數(shù)組每個(gè)元素占4個(gè)字節(jié),所以pf1—pf2的結(jié)果為(2000H—2010H)/4=4,表示pf1和pf2之間相差4個(gè)元素。兩個(gè)指針變量不能進(jìn)行加法運(yùn)算。例如,pf1+pf2是什么意思呢?毫無實(shí)際意義。

c語(yǔ)言指針范文第3篇

關(guān)鍵詞:C語(yǔ)言,指針,內(nèi)存

 

1 引言

C語(yǔ)言的一大特點(diǎn)就是數(shù)據(jù)類型豐富,其中一個(gè)重要的數(shù)據(jù)類型就是指針,它也是C語(yǔ)言的精華所在。利用指針可以有效的表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配,更靈活、方便的使用數(shù)組、字符串,還能實(shí)現(xiàn)為函數(shù)間各類數(shù)據(jù)的傳遞提供簡(jiǎn)潔便利的方法。熟練掌握指針的應(yīng)用,可以使程序簡(jiǎn)潔、緊湊和高效。

2 指針的概念

要想了解什么是指針,就必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)的,內(nèi)存是以字節(jié)為單位的一片連續(xù)的存儲(chǔ)空間,每一個(gè)字節(jié)單元對(duì)應(yīng)著一個(gè)唯一的編號(hào),這個(gè)編號(hào)被就稱為內(nèi)存單元的地址,相當(dāng)于賓館的房號(hào)一樣,在地址所標(biāo)識(shí)的內(nèi)存單元中存放數(shù)據(jù),就相當(dāng)于房間里入住的客人一樣。若有如下定義:

char a;

int b;

float c;

根據(jù)變量的類型,內(nèi)存為其分配相應(yīng)的存儲(chǔ)空間如圖所示,由于變量a是字符型,所以內(nèi)存為其分配1個(gè)字節(jié)的存儲(chǔ)單元,變量b是基本整型,內(nèi)存為其分配2個(gè)字節(jié)的存儲(chǔ)單元,變量c是浮點(diǎn)型,內(nèi)存為其分配4個(gè)字節(jié)的存儲(chǔ)單元。內(nèi)存為變量分配存儲(chǔ)空間的首個(gè)字節(jié)單元的地址稱為該變量的地址。如a的地址是1000,b的地址是1001,c的地址是1003。由此可見,地址就是用來標(biāo)識(shí)每一個(gè)存儲(chǔ)單元的,以方便用戶對(duì)存儲(chǔ)單元中的數(shù)據(jù)能夠正確訪問,在高級(jí)語(yǔ)言中就形象的將地址稱為指針。指針可以用來指向變量、數(shù)組及其元素、結(jié)構(gòu)體、和指針(稱為多級(jí)指針)等,但不能用指針來指向表達(dá)式、常量、和寄存器變量等,因?yàn)檫@些對(duì)象沒有地址的概念。

3 指針變量的定義和初始化

在C語(yǔ)言中規(guī)定,所有的變量必須先定義,后使用,對(duì)于指針變量,也不例外,其定義形式如下:

類型標(biāo)識(shí)符 *指針變量名

例如:

char *a; /*定義一個(gè)指向字符型變量的指針變量a*/

int *b; /*定義一個(gè)指向整型變量的指針變量b*/

flaot *c; /*定義一個(gè)指向浮點(diǎn)型變量的指針變量c*/

需要注意的是,在定義指針變量時(shí)的*僅僅只是一個(gè)說明符,表面其后所定義的變量是一個(gè)指針變量。

既然指針是一種變量,那么就應(yīng)該和其他變量一樣,在定義的同時(shí)也可初始化。論文參考。例如:

char a=5,*b=&a;

這里由于指針變量b是指向字符型變量a的,所以在定義時(shí),指針變量b的類型要與它所指向變量的類型一致,而“&”是一個(gè)取地址運(yùn)算符,&a就來表示變量a的地址。通過對(duì)指針變量初始化,建立起指針變量b的指向,如圖2所示。系統(tǒng)為指針變量b分配的存儲(chǔ)空間地址是4100,b中存放的是變量a的地址,即1000,當(dāng)需要讀取變量a的值時(shí),如果直接按變量名a的方式,就是對(duì)內(nèi)存單元的直接存取方式,現(xiàn)在既然指針變量b是指向變量a的,那么也就可以先通過指針變量b得到b的值1000,即a的地址,再根據(jù)地址1000讀取它所指向存儲(chǔ)單元的值5。論文參考。這種間接的通過變量b得到變量a的地址,然后在存取變量a的值的方式就稱為間接存取方式。

4 指針運(yùn)算符

“*”運(yùn)算符稱為指針運(yùn)算符,“&”是地址運(yùn)算符,二者可以看作是一對(duì)互逆運(yùn)算符。“&”的作用在前面已經(jīng)說明,這里不再贅述。而“*”的作用是取其指向變量的內(nèi)容(不是地址,是地址對(duì)應(yīng)存儲(chǔ)單元的值)。例如有如下程序段:

int i=3,j=4,k,*p,*q;

p=&i;

q=&j;

k=*p**q;

在這個(gè)程序段中多次使用到了“*”,要想得出k的結(jié)果,就要區(qū)分出每個(gè)地方出現(xiàn)的“*”所表示的含義,在定義時(shí)p和q前的“*”的作用只是用來標(biāo)識(shí)這兩個(gè)變量是指針變量,接下來通過將變量i的地址賦給p,變量j的地址賦給q,建立起指針變量p和q的指向,最后就是求解k的值了,在這條語(yǔ)句中出現(xiàn)了三個(gè)“*”,其中p和q前的“*”均是指針運(yùn)算符,也就是用來分別去p、q所指向變量i、j的內(nèi)容,即就是3和4,剩下的“*”則表示乘運(yùn)算,所以求得k值為12。由此可見,要想得出正確的結(jié)果,首先要分清“*”在每一處的作用,為了方便解題,給出兩個(gè)等價(jià)轉(zhuǎn)換關(guān)系,供大家使用:

①i=*p=*(&i)

②p=&i=&(*p)

5 指針運(yùn)算

常用的指針運(yùn)算主要有三種:賦值運(yùn)算,關(guān)系運(yùn)算和算術(shù)運(yùn)算。

首先對(duì)于賦值運(yùn)算,前面的例子中已經(jīng)見過,如:b=&a,p=&i。需要注意的就是不能夠?qū)⒁粋€(gè)常量地址賦給指針變量,如:int *p;p=1000;也不能讓指針變量指向與它類型不相同的變量,如:int *p;float i;p=&i;

其次指針也可以進(jìn)行關(guān)系運(yùn)算,但在進(jìn)行關(guān)系運(yùn)算之前,指針必須先建立指向關(guān)系,即指針有初值,另外,只有相同類型的指針才能進(jìn)行比較。

最后,指針也可以進(jìn)行算術(shù)運(yùn)算,對(duì)一個(gè)指針加、減一個(gè)整數(shù)n是,并不是用指針值直接加、減n,而是與指針的數(shù)據(jù)類型有關(guān),若用公式表示即為:指針變量值±n×sizeof(指針類型),例如:

int a=1,b=2,c=3,*p=&a;

假設(shè)內(nèi)存為a、b、c3個(gè)變量分配在了一個(gè)連續(xù)的存儲(chǔ)區(qū)域內(nèi),a的地址為1000, p指向變量a,即p的內(nèi)容是1000,如圖3所示。執(zhí)行p=p+2后,表示指針向下移動(dòng)兩個(gè)整型變量的位置,如圖4所示,p的值為1000+2*sizeof(int)=1000+2×2=1004,而不是1002。利用指針的這一特點(diǎn),指針被大量的使用在數(shù)組中,從而在訪問數(shù)組元素時(shí)更加靈活,快捷。

6 總結(jié)

本文中介紹了指針的基本概念和初步應(yīng)用,由于指針式C語(yǔ)言中一個(gè)重要的概念,也是C語(yǔ)言的一大特色,使用指針可以提高程序的效率,可以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)分配,也可以在調(diào)用函數(shù)時(shí)變量改變了的值能夠?yàn)橹髡{(diào)函數(shù)使用。論文參考。但是同時(shí)由于指針使用過于靈活,使用起來很容易出錯(cuò),而且這種錯(cuò)誤往往比較隱蔽,難于發(fā)現(xiàn),所以在使用指針時(shí)要仔細(xì)小心,最好通過上機(jī)調(diào)試程序,弄清每一個(gè)細(xì)節(jié),累積編程經(jīng)驗(yàn)。

7 參考文獻(xiàn)

[1]譚浩強(qiáng). C程序設(shè)計(jì)(第三版)[M].清華大學(xué)出版社. 2005

[2]宗大華、蔣瑋. C語(yǔ)言程序設(shè)計(jì)[M].人民郵電出版社. 2003

[3]黃維通,馬力妮. C語(yǔ)言程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社. 2003

c語(yǔ)言指針范文第4篇

摘 要 指針在C語(yǔ)言學(xué)習(xí)中起著舉足輕重的作用,c語(yǔ)言學(xué)的好不好關(guān)鍵在于對(duì)指針的掌握。本文介紹了指針學(xué)習(xí)的現(xiàn)狀、引入指針的作用,并對(duì)C語(yǔ)言指針中較易混淆的概念進(jìn)行了詳細(xì)闡述,最后探討了指針與數(shù)組、函數(shù)的關(guān)系和使用方法。

關(guān)鍵詞 指針 C語(yǔ)言 數(shù)組 函數(shù)

中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼: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語(yǔ)言的精華,也是大學(xué)《C語(yǔ)言程序設(shè)計(jì)》①課程教學(xué)的重點(diǎn)與難點(diǎn)。通過使用指針變量可以較方便地使用字符串、數(shù)組,可以表示各種數(shù)據(jù)結(jié)構(gòu),從而能夠編寫出執(zhí)行效率高、可讀性強(qiáng)的程序,它在很大程度上增強(qiáng)了C語(yǔ)言的功能。

對(duì)于一個(gè)不涉及指針、只有程序設(shè)計(jì)結(jié)構(gòu)、函數(shù)和數(shù)組的程序,許多學(xué)生在分析它時(shí)還覺得得心應(yīng)手,一旦引入了指針,便不知所措。究其原因,對(duì)指針的理解只停留在表層,沒有從較深層次去理解。指針的概念本身比較復(fù)雜,涉及指針與地址、普通變量與指針變量、指針與函數(shù)、指針與數(shù)組,使用也比較靈活,需要多思考、多總結(jié)、多上機(jī),在實(shí)際操作中才能逐漸掌握。因此,如何學(xué)好C語(yǔ)言中的指針成了一個(gè)值得研究的課題,下面就幾年來在實(shí)踐教學(xué)過程中存在的想法進(jìn)行總結(jié)和學(xué)習(xí)。

1 引用指針的作用

通過定義指針變量可以確定存儲(chǔ)單元的地址和類型,如有int i, *p=&i;則變量i與*p是等價(jià)的,在程序中可以用變量i和*p兩種方式來訪問存儲(chǔ)單元。因此,指針變量是一種新的訪問存儲(chǔ)單元的方法,它的作用主要表現(xiàn)在三個(gè)方面:

(1)能夠突破變量作用域的限制。程序中通常把一部分代碼放在一個(gè)函數(shù)中,基于函數(shù)的封閉性,有些操作我們不能在它的外部執(zhí)行,比如利用函數(shù)交換兩個(gè)實(shí)參的值。當(dāng)使用指針變量作參數(shù)時(shí),實(shí)參傳遞的是對(duì)應(yīng)存儲(chǔ)單元的地址,若利用形式參數(shù)直接訪問對(duì)應(yīng)存儲(chǔ)單元,將會(huì)打破變量作用域的限制,可以在函數(shù)中使用外部的存儲(chǔ)單元。

(2)可以提高函數(shù)的執(zhí)行效率。形參相關(guān)的存儲(chǔ)單元較大時(shí),如結(jié)構(gòu)體,函數(shù)執(zhí)行中用實(shí)參賦值給形參將花費(fèi)較多時(shí)間和存儲(chǔ)空間。如果把形參的類型換成相應(yīng)的指針類型,函數(shù)的執(zhí)行效率則會(huì)大大提高。

(3)使用未命名的存儲(chǔ)單元。內(nèi)存中的堆存儲(chǔ)空間在程序運(yùn)行中是用戶自己申請(qǐng)并指定大小,一般通過調(diào)用庫(kù)函數(shù)來完成,沒有變量直接參與,只能利用指針變量間接引用的方式實(shí)現(xiàn)。

2 指針中較易混淆概念的理解

2.1 指針變量和指針運(yùn)算符

C語(yǔ)言中通過變量使用計(jì)算機(jī)中的內(nèi)存,變量是內(nèi)存中某塊存儲(chǔ)單元的標(biāo)識(shí),它用來存放數(shù)據(jù),如整型變量存儲(chǔ)整數(shù),浮點(diǎn)型變量存儲(chǔ)實(shí)數(shù)。指針變量也是一種變量,定義一個(gè)指針變量就會(huì)有一塊存儲(chǔ)單元與之對(duì)應(yīng),只是它存儲(chǔ)的是地址,是某類型的地址,如實(shí)型指針變量只能存儲(chǔ)實(shí)型變量的地址,短整型指針變量只能存儲(chǔ)短整型變量的地址。

指針運(yùn)算符“*”在指針中一般在兩種情況下出現(xiàn):第一種是定義指針,如int i=13,*q;第二種是在賦值語(yǔ)句或程序執(zhí)行中出現(xiàn)。第一種中“*”代表該變量的類型是指針型變量,指針變量名是p,而不是*p。第二種中 “*” 運(yùn)算符表示取它指向的內(nèi)容,*q表示指針變量q所指向的變量。

比如給指針賦值,可以采用兩種方法: ① int i=3,*p; p=&i; ② int i=3,*p=&i;分別是先定義后賦值和邊定義邊賦值。實(shí)際教學(xué)中許多學(xué)生在先定義后賦值p=&i中常常將p錯(cuò)誤寫成*p ,主要是沒有弄清楚概念,&i表示變量i的地址,而*p表示p指向的變量,變量的內(nèi)容是數(shù)據(jù),數(shù)據(jù)和地址是兩種不同的值。

2.2 指針變量與自增自減運(yùn)算符混合

許多學(xué)生在編程過程中總是辨不清(*p)++與*p++,其實(shí)仔細(xì)分析不難發(fā)現(xiàn)這兩個(gè)表達(dá)式在程序執(zhí)行時(shí)是有規(guī)律可循的。比如有int i=3,*p; p=&i;成立,則(*p)++可以(下轉(zhuǎn)第141頁(yè))(上接第114頁(yè))先求括號(hào)中的內(nèi)容,再進(jìn)行自增運(yùn)算,相當(dāng)于i++ ;而對(duì)于*p++來說,它需要考慮運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向。由于自增運(yùn)算符++與指針運(yùn)算法*優(yōu)先級(jí)別相同,結(jié)合方向又為自右而左,它相當(dāng)于*(p++),可以分成兩步進(jìn)行計(jì)算,第一步執(zhí)行*p,即i的值,第二步執(zhí)行指針移動(dòng)p=p+1, p值發(fā)生改變。

2.3 數(shù)組名和函數(shù)名

數(shù)組名不能代表整個(gè)數(shù)組。C語(yǔ)言規(guī)定數(shù)組名(不包括形參數(shù)組名,形參數(shù)組并不占據(jù)實(shí)際的內(nèi)存單元)代表數(shù)組中首元素的地址,②即序號(hào)為0的元素的地址。

假設(shè)a是一維數(shù)組,如int a[10]; ,數(shù)組名a代表數(shù)組首地址,則a+i代表從首地址開始,往后偏移i個(gè)位置,即相當(dāng)于是數(shù)組元素a[i]的地址。因此,a和&a[0]都代表第一個(gè)元素的地址,同理a+i和&a[i]都代表第i+1個(gè)元素的地址。

假設(shè)b是二維數(shù)組,如int b[4][5]; ,可以把數(shù)組b看成包含4個(gè)元素的一維數(shù)組(b[0]、b[1]、b[2]、b[3]),而其中每一個(gè)元素又是一個(gè)一維數(shù)組,包括5個(gè)元素。因此,在二維數(shù)組中數(shù)組名b代表數(shù)組的首地址,b+1是序號(hào)為1的行的首地址或稱第2行的首地址。

跟數(shù)組名一樣,函數(shù)名可以退化成指針。函數(shù)名是函數(shù)的地址,也就是入口地址。

3 指針與數(shù)組、函數(shù)的關(guān)系

3.1 指針與數(shù)組

指針可以指向數(shù)組,而數(shù)組也可以是指針數(shù)組。因此,指針與數(shù)組關(guān)系中有指向數(shù)組元素的指針和和指針數(shù)組。兩者在形式上很相近,但意義不同。

定義指向數(shù)組元素的指針與指針變量的定義相似,如int a[10]; int *p;p=&a[0]; ,那么指針變量p指向了一維數(shù)組的第一個(gè)元素,通過指針下移可以指向數(shù)組中其它元素。而且,可以使用下標(biāo)法(如a[i]形式)和指針法(如*(a+i)或*(p+i))訪問一個(gè)數(shù)組元素。同時(shí),在編程過程中我們經(jīng)常見到形如int(*p)[10]的表示形式,其中p用來表示指向一維數(shù)組,p所指向的對(duì)象包括10個(gè)整型元素的數(shù)組。

指針數(shù)組是形如*p[5],它是一個(gè)數(shù)組,每一個(gè)元素都相當(dāng)于一個(gè)指針變量。為了更方便、靈活的處理字符串,引入了指針數(shù)組。二維字符數(shù)組和指針數(shù)組都可以用來存放字符串,如果使用二維字符數(shù)組存放則會(huì)產(chǎn)生一些問題,比如在定義二維字符數(shù)組時(shí),需要規(guī)定列數(shù),而實(shí)際操作中,給定的各個(gè)字符串長(zhǎng)度往往不相等,若以最長(zhǎng)得字符串長(zhǎng)度來限定列數(shù),將會(huì)浪費(fèi)許多內(nèi)存空間。如果以指針數(shù)組來存放,只需將指針數(shù)組的各個(gè)元素指向相應(yīng)字符串,通過改變指針數(shù)組元素的指向就能改變各元素的值。

3.2 指針與函數(shù)

指針可以指向字符變量、實(shí)型變量、一維數(shù)組、字符串,也可以指向一個(gè)函數(shù)。函數(shù)名代表函數(shù)的入口地址,即函數(shù)的指針,形如c =(*p)(a,b); ,它用指針形式實(shí)現(xiàn)了函數(shù)的調(diào)用。

函數(shù)可以返回整型值、實(shí)型值,也可以返回一個(gè)地址。形如,int *a(int x,int y);從形式上看,該式子與普通函數(shù)的定義比較相似,這里函數(shù)名a前多了一個(gè)*運(yùn)算符,它表示函數(shù)是指針型函數(shù),一般在該函數(shù)內(nèi)部會(huì)再定義一個(gè)指針變量,同時(shí)給出相應(yīng)的return語(yǔ)句。

4 總結(jié)

指針不僅在C語(yǔ)言中占據(jù)核心地位,還在一些課程如《數(shù)據(jù)結(jié)構(gòu)》③中起很重要的作用,該課程里幾乎所有算法的實(shí)現(xiàn)都離不開指針。而且,指針也出現(xiàn)在許多重要考試中,如大學(xué)計(jì)算機(jī)等級(jí)考試和計(jì)算機(jī)軟件水平能力考試。因此,指針是學(xué)好C語(yǔ)言的關(guān)鍵。但C語(yǔ)言概念復(fù)雜,使用靈活,大部分學(xué)生難以掌握。在上機(jī)實(shí)驗(yàn)中,學(xué)生更容易出錯(cuò),而且錯(cuò)誤難以發(fā)現(xiàn),這不僅要求教師在教學(xué)中能夠深刻理解指針的概念,做到靈活應(yīng)用,還需要不斷的進(jìn)行總結(jié)、比較和實(shí)踐,而且要求教師能夠利用各種教學(xué)手段與方法讓學(xué)生更容易接受和理解, 同時(shí)也要求學(xué)生能夠深入理解指針的概念、注重上機(jī),在實(shí)踐中不斷學(xué)習(xí)、提高和完善。

注釋

① 任正云,李素若.C語(yǔ)言程序設(shè)計(jì).北京:水利水電出版社,2007.

c語(yǔ)言指針范文第5篇

關(guān)鍵詞:指針;C語(yǔ)言;變量

中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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語(yǔ)言是一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,是目前最廣泛使用的計(jì)算機(jī)語(yǔ)言之一,也是各高校專業(yè)與非專業(yè)主要的計(jì)算機(jī)教學(xué)語(yǔ)言。指針是C語(yǔ)言中最為復(fù)雜的一個(gè)部分,使用起來非常靈活,因而學(xué)習(xí)時(shí)常出錯(cuò),必須小心,多思考,多比較,在實(shí)踐中把其掌握好。

1指針概念

指針變量簡(jiǎn)稱指針,其實(shí)它也是變量,只不過里面存放的內(nèi)容是一個(gè)地址,這個(gè)地址指向另外一個(gè)變量。指針就是內(nèi)存的地址,必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)與讀取的;內(nèi)存單元地址與內(nèi)存單元內(nèi)容是兩個(gè)不同的概念。內(nèi)存單元地址就像賓館每個(gè)房間一樣,其房間號(hào)就是其地址,單元內(nèi)容可以理解為房中的賓客;如圖1所示:假設(shè)程序定義了三個(gè)變量a、b、c,編譯時(shí)系統(tǒng)分配1000和10001兩個(gè)字節(jié)給a,1002和1003給b,1004和1005給c。由此可以知道,地址是用來標(biāo)識(shí)每一個(gè)存儲(chǔ)單元,是用戶對(duì)存儲(chǔ)單元中的數(shù)據(jù)的訪問,在C語(yǔ)言中形象的將地址叫做指針,它可以用來指向變量、數(shù)組、結(jié)構(gòu)體、和多級(jí)指針等等。對(duì)于表達(dá)式、常量或者是寄存器變量則不能用指針來指向。

2指針變量的定義和引用

2.1指針變量的定義

C語(yǔ)言規(guī)定指針變量在使用之前必須被定義,遵循先定義后使用的原則,定義指針變量與一般變量定義開式相似,也是用說明語(yǔ)句來實(shí)現(xiàn)的,但不同于其他類型變量的就是它是用來專門存放地址的。

指針變量定義的一般開式為

類型標(biāo)識(shí)符*指針變量名;

下面都是合法的定義:

int *g1,*g2,*g3;定義g1、g2、g3指向整型數(shù)據(jù)的指針變量。

float *k1,*k2,*k3;定義k1、k2、k3指向?qū)嵭蛿?shù)據(jù)的指針變量。

char *m1,*m2,*m3;定義m1、m2、m指向字符型數(shù)據(jù)的指針變量3。

在定義指針變量值得注意的是:

①“*”是一個(gè)指向符號(hào),表示標(biāo)識(shí)符為指針變量,上面的g1、g2、g3等是指針變量名,而不是*g1、*g2、*g3,值得注意的是指針變量是用來存放地址的。

②一個(gè)指針變量只能指向同一個(gè)類型的變量。由于不同類型的數(shù)據(jù)在內(nèi)存中所占的字節(jié)數(shù)不同,如果忽而指向一個(gè)整型變量,忽而指向一個(gè)實(shí)型變量,會(huì)使系統(tǒng)無法管理變量的字節(jié)數(shù)而發(fā)生錯(cuò)誤,所以只有同一類型變量的地址才能放到指向該類型變量的指針變量中。

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);}

運(yùn)行結(jié)果為:10,20

10,20

本程序定義了兩個(gè)指針變量g1和g2,“g1=&i;和g2=&j;”語(yǔ)句是將i與j的地址分別賦給g1和g2,不能寫成“*g1=&i;和*g2=&j;”。

與指針相關(guān)的兩個(gè)運(yùn)符:

①&:取地址運(yùn)算符。

②*:指針運(yùn)算符或稱間接訪問運(yùn)算符,取指針?biāo)赶虻哪繕?biāo)值。

“&”與“*”運(yùn)算符的優(yōu)先級(jí)別相同,按自右而左的方向結(jié)合,如“g1=&i;”語(yǔ)句,若&*g1,先進(jìn)行的是*g1的運(yùn)算,再執(zhí)行&運(yùn)算。如:*&i的含義是什么?當(dāng)然先進(jìn)行&i運(yùn)算,得到i的地址,再進(jìn)行*運(yùn)算。

3數(shù)組的指針與函數(shù)的指針

3.1數(shù)組的指針

有兩個(gè)概念我要必須分清。一個(gè)是指針數(shù)組:首先它是一個(gè)數(shù)組,數(shù)組的元素都是指針,數(shù)組占多少個(gè)字節(jié)由數(shù)組本身決定。它是“儲(chǔ)存指針的數(shù)組”的簡(jiǎn)稱。另一個(gè)是數(shù)組指針:首先它是一個(gè)指針,它指向一個(gè)數(shù)組。

簡(jiǎn)單舉例說明:

int *p[10];首先聲明了一個(gè)數(shù)組,數(shù)組的元素是int型的指針。

int (*p)[2];聲明了一個(gè)指針,指向了一個(gè)有兩個(gè)int元素的數(shù)組。

其實(shí)這兩種寫法主要是因?yàn)檫\(yùn)算符的優(yōu)先級(jí),因?yàn)閇]的優(yōu)先級(jí)比*高。所以第一種寫法,p先和[]結(jié)合,所以是一個(gè)數(shù)組,后與*結(jié)合,是指針。后一種寫法同理。

應(yīng)當(dāng)注意,如果數(shù)組為int型,指針變量也應(yīng)是int型。下面是指針元素的賦值:

p=&a[0];

C語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的首地址,是第一個(gè)元素的地址。所以p=&a[0]與p=a是等價(jià)的。注意a不代表整個(gè)數(shù)組,“p=a;”的作用是把a(bǔ)數(shù)組的首地址賦給p,而不是a的所有元素都賦給p。

在定義指針變量時(shí)是可以賦給初值的:

int *p=&a[0];

等效于:

int *p;

p=&a[0];

多維數(shù)組(以二維數(shù)組為例)

二維數(shù)組的定義:

static int a[2][3]={{1,2,3},{4,5,6}};

a是一個(gè)數(shù)組的名字,包含二個(gè)元素:a[0],a[1]。而每個(gè)元素又是一個(gè)一維數(shù)組,每個(gè)一維數(shù)組又包含有三個(gè)元素。如a[0]中的三個(gè)元素分別為a[0][0],a[0][1],a[0][2]。a代表的是二維數(shù)組的首地址。

3.2函數(shù)的指針

指針是可以指向一個(gè)函數(shù)的,在編譯時(shí)被分配給一個(gè)入口地址,這個(gè)入口地址就叫做函數(shù)的指針。在一個(gè)程序中,一個(gè)指針變量可以先后指向不同的函數(shù)。

指向函數(shù)的指針變量定義開式為:

數(shù)據(jù)類型標(biāo)識(shí)符(*指針變量名)(參數(shù)1,參數(shù)2);

下面通過例子來說明用指針形式實(shí)現(xiàn)對(duì)函數(shù)調(diào)用的方法。

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為函數(shù)指針變量,并把函數(shù)入口地址賦給該函數(shù)指針變量,pmax=max。調(diào)用函數(shù)的形式:(*指針變量名)(參數(shù)表)其中的*號(hào)不是求值運(yùn)算,它只是一種表示符號(hào)。如本程序中的z=(*pmax)(x,y);值得注意的是:函數(shù)指針變量與數(shù)組指針變量是不相同的,數(shù)組指針變量加減一個(gè)整數(shù)可使指針移動(dòng)指向后面或前面的數(shù)組,而函數(shù)指針是沒有移動(dòng)的意義的

4總結(jié)

C語(yǔ)言指針對(duì)于初學(xué)者來說是一個(gè)短時(shí)間內(nèi)很難掌握的問題,指針靈活性較大,對(duì)于剛開始學(xué)習(xí)的學(xué)生,要搞清楚指針的各個(gè)方面內(nèi)容,例如:指針類型、指針?biāo)赶虻念愋?、指針?biāo)赶虻膬?nèi)存區(qū),還有指針?biāo)紦?jù)的內(nèi)存區(qū)等基礎(chǔ)方面內(nèi)容。在多思考、多注重比較和多上機(jī)實(shí)踐,才能真正的掌握好指針課程。

永靖县| 崇礼县| 车险| 东方市| 伊通| 庆阳市| 奉化市| 尉氏县| 申扎县| 兴海县| 阿拉善盟| 苏州市| 彭泽县| 镇巴县| 南靖县| 安义县| 灌云县| 孝感市| 嘉峪关市| 萨嘎县| 招远市| 巴马| 米林县| 肃宁县| 岳阳市| 绥德县| 保亭| 泸水县| 文安县| 体育| 师宗县| 龙游县| 颍上县| 镇平县| 延寿县| 都江堰市| 石渠县| 利津县| 张家界市| 安徽省| 通渭县|