国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺談《C語言程序設(shè)計(jì)》中指針的應(yīng)用

2012-04-29 20:31:22胡曉燕,龐潤芳
電腦知識與技術(shù) 2012年2期
關(guān)鍵詞:存儲單元鏈表C語言程序設(shè)計(jì)

胡曉燕,龐潤芳

摘要:該文從指針的概念、運(yùn)算、使用、靈活應(yīng)用時應(yīng)注意的事項(xiàng)等方面對C語言指針進(jìn)行淺析和探討。指導(dǎo)學(xué)生如何應(yīng)用指針。

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

中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)02-0389-03

Discuss Application Of The Pointer in C Language Program

HU Xiao-yan,PANG Run-fang

(Engineering & Training Center Inner Mongolia University of Seicence and Technology, Baotou 014010, China)

Abstract: In this paper,the concept of pointer,pointer arithmetic,pointer of use, flexible application should pay attention to in terms of C language pointer analysis and discussion. Guide the students how to use the pointer.

Key words: C Langwage; Pointer; Pointer Variables; Address

《C語言程序設(shè)計(jì)》課程是我校理工科非計(jì)算機(jī)專業(yè)學(xué)生進(jìn)入大學(xué)所接觸的第一門計(jì)算機(jī)語言課程。實(shí)踐證明,該門課程對于初學(xué)者來說難度比較大,這也是由于C語言的特點(diǎn)決定的。因?yàn)镃語言功能強(qiáng)大,它既有高級語言的特點(diǎn),也有低級語言的特點(diǎn)。而在這門課程中指針又是C語言的精華,因此靈活地應(yīng)用指針,可有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、動態(tài)分配內(nèi)存、方便地引用字符串和數(shù)組;在進(jìn)行函數(shù)調(diào)用時還可獲得多個返回值,并可直接處理內(nèi)存地址,實(shí)現(xiàn)其它高級語言難以實(shí)現(xiàn)的功能;運(yùn)用指針編程是C語言最重要的風(fēng)格之一。但指針比較難以掌握,使用時常犯一些錯誤,即使是熟練的程序員也很難發(fā)現(xiàn)和排除這些錯誤。為了設(shè)計(jì)出高效、簡潔、緊湊的用戶程序,正確理解和使用指針非常重要。因此如何引導(dǎo)學(xué)生學(xué)會C語言的指針在編程中應(yīng)用是很重要的事情。

1指針的概念

計(jì)算機(jī)對信息的處理都由操作系統(tǒng)調(diào)入存儲器存放并執(zhí)行,存儲器中有眾多的存儲單元,存儲單元是用來存放數(shù)據(jù)的。存放在存儲單元中的數(shù)據(jù)稱為存儲單元的內(nèi)容(或值)。計(jì)算機(jī)為了對存儲單元進(jìn)行有效的管理,便為存儲單元進(jìn)行編號(以字節(jié)為單位),這個編號就是“地址”,這個“地址”又稱為指針[1]。每個變量都有一個地址。不同數(shù)據(jù)類型的變量,占用的字節(jié)數(shù)不同,系統(tǒng)把變量占據(jù)存儲單元的第一個字節(jié)的地址作為該變量的地址。有了地址我們就可以引入指針變量。指針變量是一種特殊的變量,變量中存放的不是某種數(shù)據(jù)類型的數(shù)據(jù),而是存放另一個變量的地址。如果一個指針變量存放了另一個變量的地址,則形象地稱指針變量指向那個變量。下面提供一個指針的例題,通過分析例題來理解指針的概念。

例:利用指針,求兩個整數(shù)的和。main()

{ int i,j,sum;

int *p,*q;/*定義指針變量*/

p=&i;q=&j/*建立關(guān)聯(lián)*/

scanf(“%d,%d”,p,q);

sum=*p+*q;/*使用指針變量*/

printf (“%d,%d ”,*p,*q);

printf(“和= %d ”,sum);

}

在程序當(dāng)中,首先定義兩個普通變量i,j,再定義兩個指針變量p,q,為了進(jìn)行區(qū)分普通變量和指針變量,所以在指針變量名前加*號。不能引用沒有賦值的指針變量,否則可能會造成系統(tǒng)癱瘓,所以將&i賦值給p,&j賦值給q,說明指針變量指向了普通變量。如圖所示:

有了指向關(guān)系,在輸出語句中就可以利用指針來訪問普通變量i,j。

2指針的運(yùn)算

指針變量和其他變量一樣,也可以進(jìn)行運(yùn)算,由于指針的運(yùn)算實(shí)際上是地址的運(yùn)算,所以和其它變量的運(yùn)算又有區(qū)別[1]。

1)間接訪問運(yùn)算

用變量名對其所對應(yīng)的存儲單元的內(nèi)容進(jìn)行讀寫稱為直接訪問,而通過存儲單元的地址對其內(nèi)容進(jìn)行讀寫的則稱為間接訪問。盡管指針變量中保存的是存儲單元的地址,而引入指針的目的主要是為了更方便快捷地訪問存儲單元的內(nèi)容。

間接訪問是在引用的指針變量前面加一個“*”號,用來表示指針?biāo)赶虻拇鎯卧闹祷騼?nèi)容。例如:

int a=5, *p;

p=&a

printf("%d",*p);

當(dāng)指針p指向a后,若用指針p訪問所指存儲單元的內(nèi)容時,可以寫成*p,也就是說在這里*p與a是等價的。由于“&”與“*”兩個運(yùn)算符優(yōu)先級別相同,且結(jié)合方向均為自右至左,又是一對互逆運(yùn)算,所以有*&a=*p,&*p=&a。

2)指針變量加或減一個整型量,從而得到另一個地址,當(dāng)然自增自減運(yùn)算也是合法的。如先使p指向數(shù)組a的首地址(即p=a),則p+n表示的是下標(biāo)為n的元素地址。p++表示:使p指向下一個元素a[1]。如果接著執(zhí)行*p,則取出a[1]的值。*p++等價于*(p++)作用是:先得到p指向的變量的值(即*p),然后再將p+1=>p;*(p++)與*(++p)的作用不同,前者是先取*p的值,然后使p加1,而后者是先使p加1,再取*p;++ (*p)表示p所指向的元素的值加1。指針變量乘除一個整型量無意義,C語言也不允許此類語句出現(xiàn)。

3)由于指針變量中的地址也是一數(shù)值,所以指針變量間也可以進(jìn)行關(guān)系運(yùn)算。

4)兩個類型相同的指針變量可以相減,例如指向同一數(shù)組的指針變量相減可以得到兩個指針間元素的個數(shù)。相加或相乘則無意義[1]。

3指針的使用[3]

鏈表是數(shù)據(jù)結(jié)構(gòu)的一種存儲形式,能夠?qū)崿F(xiàn)動態(tài)分配存儲空間。我們知道,用數(shù)組存放數(shù)據(jù)時,必須事先對數(shù)組定義固定的長度(即元素的個數(shù))。例如,有的班級有100人,而有的班級有50人,如果要用同一數(shù)組先后存放不同班級的學(xué)生數(shù)據(jù),則必須定義長度為100的數(shù)組。如果事先難以確定元素的個數(shù),則必須把數(shù)組定義得足夠大,以便夠用;但實(shí)際若使用得很少,那樣就造成了內(nèi)存空間的浪費(fèi)。定義小了又滿足不了需求,為了解決這一矛盾,C語言提供了“需之則有,不需則無”的動態(tài)數(shù)據(jù)結(jié)構(gòu)--鏈表,它根據(jù)需要開辟存儲單元。

指針和結(jié)構(gòu)體配合可以實(shí)現(xiàn)動態(tài)存儲分配,用來實(shí)現(xiàn)對鏈表的建立、插入和刪除等操作。

建立一個簡單鏈表,結(jié)點(diǎn)類型定義的一般形式:

struct類型名

{數(shù)據(jù)域定義;

struct類型名*指針域名}

其中,數(shù)據(jù)域和指針域都可以不止一個,當(dāng)指針域不止一個時,將構(gòu)成比較復(fù)雜的鏈表。以4個結(jié)構(gòu)體變量為結(jié)點(diǎn)建立一個簡單鏈表并且輸出。

#include

struct node

{int data;

struct node *next; };

main()

{struct node a,b,c,d,*head,*p;

head=&a/*頭指針指向a結(jié)點(diǎn)*/

a.data=10;a.next=&b/*a結(jié)點(diǎn)指向b結(jié)點(diǎn)*/

b.data=20;b.next=&c/*b結(jié)點(diǎn)指向c結(jié)點(diǎn)*/

c.data=30;c.next=&d/*c結(jié)點(diǎn)指向d結(jié)點(diǎn)*/

d.data=40;d.next=NULL;/*d結(jié)點(diǎn)是尾結(jié)點(diǎn)*/

p=head;

while(p!=NULL)/*輸出鏈表,p作為工作指針*/

{printf(“%d-->”,p-->data);

p=p-->next;/*工作指針后移*/}

printf(“NULL ”);}

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

10-->20-->30-->40-->NULL

建立一個簡單鏈表很容易,只需將引用自身的結(jié)構(gòu)體變量的地址賦給前驅(qū)的next即可。在后面需增加結(jié)點(diǎn)(即一個此類型的結(jié)構(gòu)體變量)時,只要將原鏈尾結(jié)構(gòu)體變量中的引用自身的指針指向新增加的結(jié)點(diǎn)即可。

4靈活應(yīng)用指針還必須注意如下問題[2]

1)要注意指針變量的當(dāng)前值。我們在做指針變量指向數(shù)組的練習(xí)時,經(jīng)常會有這樣的情況發(fā)生:

main()

{ int a[6],i,*p;

p=a;

for(i=0;i<6;i++)

scanf(“%d”,p++);

for(i=0;i<6;i++,p++)

printf(“%d”,*p);}

當(dāng)我們運(yùn)行程序時,輸出的6個數(shù)據(jù)和我們輸入的不一致,就是由于指針變量進(jìn)行了移動,已經(jīng)移出了我們的數(shù)據(jù)區(qū)域,當(dāng)再利用指針進(jìn)行訪問元素時必須把指針變量的當(dāng)前值重新指向數(shù)組中的第一個元素a[0]才可以。所以上面的程序在第二個for循環(huán)的前面加一條p=a或p=&a[0];程序的結(jié)果才是正確的。

2)在一維數(shù)組a[10]中,有語句p=a,則p+i和a+i都表示地址相當(dāng)于&a[i],p和a都是指針,但是它們有區(qū)別,p是變量,可以實(shí)現(xiàn)p++,a是常量,a的值不能改變。

3)當(dāng)指針指向字符串時,字符指針變量和字符數(shù)組之間是有區(qū)別的。

A、字符數(shù)組由若干個元素組成,每個元素中存放一個字符,而字符指針變量中存放的是地址。

B、定義了字符數(shù)組之后,只能對各個數(shù)組元素賦值,不能用下面方法對字符數(shù)組賦值:char str[]; str=“I have a book!”;

而對指針變量,可以采用下面方法賦值:

char *a; a=“I have a book”;

賦給a的不是字符,是字符串的首地址。

C、對字符指針變量賦初值

char *a=“I have a book”等價于

char *a;

a=“I have a book”;

對數(shù)組初始化

char str[]=“I have a book”不等價

char str[20];

str[]=“I have a book”

5結(jié)束語

指針是C語言的難點(diǎn),但也是精髓,只要我們掌握了其本質(zhì)含義,也就不難了。上面所介紹的是C指針使用過程中的一些常用、重要的方法和規(guī)則。要達(dá)到熟練靈活應(yīng)用,還需要在實(shí)踐中不斷積累、總結(jié)、提高。

參考文獻(xiàn):

[1]郝長勝.C語言程序設(shè)計(jì)[M].內(nèi)蒙古:內(nèi)蒙古大學(xué)出版社,2007.

[2]鄧滿英.淺析C語言指針[J].襄樊職業(yè)技術(shù)學(xué)院學(xué)報,2010(1).

[3]溫娟娟.C語言中指針的探討[J].河南職業(yè)技術(shù)師范學(xué)院學(xué)報,2003.

猜你喜歡
存儲單元鏈表C語言程序設(shè)計(jì)
一種28 nm工藝下抗單粒子翻轉(zhuǎn)SRAM的12T存儲單元設(shè)計(jì)
基于二進(jìn)制鏈表的粗糙集屬性約簡
跟麥咭學(xué)編程
數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的存儲形式及實(shí)驗(yàn)驗(yàn)證
基于鏈表多分支路徑樹的云存儲數(shù)據(jù)完整性驗(yàn)證機(jī)制
一種成本更低的全新靜態(tài)DRAM存儲單元
MiR-125a-5p is Upregulated in Plasma of Residents from An Electronic Waste Recycling Site
以“學(xué)生為中心”的《C語言程序設(shè)計(jì)》教學(xué)設(shè)計(jì)探究
基于翻轉(zhuǎn)課堂的《C語言程序設(shè)計(jì)》課程教學(xué)系統(tǒng)的實(shí)現(xiàn)與研究
軟件工程(2016年8期)2016-10-25 16:02:07
淺談《C語言程序設(shè)計(jì)》課程的教學(xué)改革
遂川县| 简阳市| 香格里拉县| 滦平县| 敦煌市| 公主岭市| 嘉义市| 桂林市| 祥云县| 西城区| 建平县| 大田县| 商河县| 铅山县| 江山市| 昆山市| 盘锦市| 哈巴河县| 霍城县| 永平县| 林州市| 乌拉特后旗| 桦川县| 蒙自县| 凌源市| 石景山区| 剑河县| 连城县| 正定县| 周口市| 张掖市| 抚顺县| 嘉善县| 莆田市| 磐安县| 叙永县| 伊吾县| 达孜县| 璧山县| 南靖县| 建昌县|