亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C語言中指針用法解析

        2014-04-29 00:00:00王照
        中國新通信 2014年22期

        【摘要】 指針是c語言教學(xué)中比較難理解的一塊,文章根據(jù)本人多年教學(xué)經(jīng)驗(yàn),從c語言指針的概念出發(fā),針對指針在教學(xué)中的幾個(gè)重要應(yīng)用進(jìn)行了探討。

        【關(guān)鍵詞】 c語言 指針 變量 數(shù)組

        一、引言

        指針是c語言的特色之一,也是學(xué)生學(xué)習(xí)c語言程序設(shè)計(jì)時(shí)的一個(gè)難點(diǎn),靈活掌握指針的用法,正確而靈活地運(yùn)用它可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),可以動(dòng)態(tài)地分配內(nèi)存,可以直接處理內(nèi)存地址等??梢允箯?fù)雜的程序變得簡潔緊湊。

        但是在實(shí)際教學(xué)中發(fā)現(xiàn)大部分學(xué)生對指針的理解和應(yīng)用感到困惑,特別是什么時(shí)候用什么類型的指針變量。他們在編程過程中是能不用就不用,針對這種情況,本文對指針應(yīng)用中的一些問題進(jìn)行了梳理,以便于學(xué)生掌握指針的應(yīng)用。

        二、基本概念辨析

        如果在使用中定義了一個(gè)變量,在編譯時(shí)系統(tǒng)就會(huì)給這個(gè)變量分配內(nèi)存單元。

        例如:int x=5,y=9; (如圖所示)

        變量名 xy

        內(nèi)存單元…34…

        單元地址 10001002

        變量名是指數(shù)據(jù)對象的名稱,例如x,y等為整形變量名,變量值是指數(shù)據(jù)對象的值,例如3,4即為x,y的值,指針即數(shù)據(jù)對象的內(nèi)存地址,例如地址為 1000 的單元中存放的是變量x的值。

        指針變量是一種專門存放數(shù)據(jù)對象的內(nèi)存地址的變量。如何幫助學(xué)生去理解二者呢,我們就可以形象化地打個(gè)比方,假設(shè)衛(wèi)生信息管理2班在門牌號為508的教室,如果把508教室這個(gè)門牌號比做內(nèi)存地址,那么信管2班的學(xué)生就是508教室這個(gè)內(nèi)存地址所存儲(chǔ)的值。

        2.1指針變量的定義

        一般格式為:類型說明符 *指針變量名1,*指針變量名2,…;例如 int *p,*q;

        對指針變量的類型說明包括三個(gè)內(nèi)容

        1、類型說明符:即指針變量的值所指向的數(shù)據(jù)類型值,前例中的int即為指針變量所指向的數(shù)據(jù)類型;

        2、指針類型說明:即定義變量為一個(gè)指針變量,其標(biāo)志是變量名前的*;

        3、指針變量名:前例中的p,q即為指針變量名。

        2.2指針變量賦初值

        由于指針就是地址,因此指針變量中存放的是地址,所以賦值即是將某個(gè)地址賦給指針變量,如下所示(p、q為指向整形數(shù)據(jù)的指針變量,i、j為整形變量,a是存放整形數(shù)據(jù)的數(shù)組)

        int *p,*q; int i=3,j=4; int a[5]={0,1,2,3,4} ;

        p=i; q=j;(將變量i ,j的地址賦給p,q)

        p=a; (將數(shù)組 a 的首地址賦給p,相當(dāng)于p=a[0])

        p=a[i]; (將數(shù)組 a 中第 i 個(gè)元素的地址賦給p)

        q=p; (將指針變量p的地址賦給指針變量q)

        三、指針的應(yīng)用

        3.1數(shù)組中指針的應(yīng)用

        在C語言中,數(shù)組與指針是兩個(gè)非常重要的數(shù)據(jù)類型,它們之間有著十分密切的關(guān)系,它們都適于處理內(nèi)存中連續(xù)存放的一系列數(shù)據(jù),數(shù)組元素的引用可用指針的描述來實(shí)現(xiàn)。

        main()

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

        for(i=0;i<6;i++) printf( “%d”,*(p+i)); }

        從上面的程序中,可以看出 *(p+i)等價(jià)于a[i]。

        例:有char a[4]=”xy”;char *p;執(zhí)行了語句p=a;之后,*( p+2)的值應(yīng)該為’\0’。

        數(shù)組中的行指針和列指針,例:

        int i,j,a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

        *p=a[0];

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

        { printf(“\n”);

        for(j=0,j<4;j++)

        printf(“\5d”,*(p+i*4+j)); }

        一維數(shù)組名表示一維數(shù)組首地址,是列指針常量;二維數(shù)組名表示二維數(shù)組首地址,是行指針常量。歸納可得:一維數(shù)組名+i=列指針;二維數(shù)組名+i=行指針。行指針與列指針是不同類型的指針,但它們存放的地址可能相同,而所表示的含義卻不同。

        例中a和a[0]指向同一個(gè)位置,即a等于a[0],但a+1不等于a[0]+1。因?yàn)閍+1中的1表示數(shù)組中的一行,而a[0]+1中的1表示數(shù)組中的一個(gè)元素。假設(shè)a和a[0]的地址為2000, 可推算出a+1的地址為2008,而a[0]+1的地址則為2002。

        行指針和列指針可以相互轉(zhuǎn)換。將行指針降級即轉(zhuǎn)變?yōu)榱兄羔槪导壍姆椒ㄓ兄羔樂ê拖聵?biāo)法,即利用指針運(yùn)算符*或下標(biāo)運(yùn)算符[]都可以使一個(gè)指針降級。例如a為行指針,a* 和a[0]則表示列指針;反之,將列指針升級,即前面加地扯運(yùn)算符就轉(zhuǎn)換為行指針,例如*a 和a[0]表示列指針,*a和a[0]則表示行指針。

        3.2函數(shù)參數(shù)中指針的應(yīng)用

        在 C 語言中,函數(shù)的形參是局部變量,實(shí)參和形參變量間的傳遞是值傳遞,即將實(shí)參的值傳遞給形參變量,形參在函數(shù)中如何變化,并不改變實(shí)參的值,我們稱之為單向傳遞。這種參數(shù)的單向傳遞減少了函數(shù)之間的耦合性,增加了其內(nèi)聚性,有利于結(jié)構(gòu)化編程。但是 如果調(diào)用函數(shù)想從被調(diào)函數(shù)中得到一個(gè)以上的返回值,就比較困難。雖然通過全局變量也能實(shí)現(xiàn),但過多的全局變量不利于結(jié)構(gòu)化編程。如果實(shí)參和形參都使用指針變量,就可達(dá)到此目的。需要說明的是,實(shí)參和形參之間傳遞的仍然是值,但該值不是變量的值,而是變量的地址。

        3.3鏈表中指針的應(yīng)用

        鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu),它是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu),在 C 語言中使用數(shù)組必須事先定義固定的長度,是一種靜態(tài)存儲(chǔ)分配,不適合用來實(shí)現(xiàn)鏈表,而指針可以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)分配,用來實(shí)現(xiàn)對鏈表的創(chuàng)建、插入和刪除等操作。以下creatlink函數(shù)建立一個(gè)帶頭結(jié)點(diǎn)的單向鏈表,并用隨機(jī)函數(shù)為各個(gè)結(jié)點(diǎn)賦值。函數(shù)fun的功能是將單向鏈表結(jié)點(diǎn)數(shù)據(jù)域?yàn)榕紨?shù)的值累加起來,并作為函數(shù)值返回。

        typedef struct aa

        {int data; struct aa *next;}NODE;

        int fun(NODE *h)

        {int sum = 0 ; NODE *p; p=h->next;

        while(p)

        {if(p->data%2==0)

        sum +=p->data; p=p->next; }

        return sum;}

        NODE *creatlink(int n)

        {NODE *h, *p, *s; int i;

        h=p=(NODE *)malloc(sizeof(NODE));

        for(i=1; i<=n; i++)

        {s=(NODE *)malloc(sizeof(NODE));

        s->data=rand()%16; s->next=p->next; p->next=s; p=p->next; }

        p->next=NULL; return h;}

        四、指針運(yùn)用的常見錯(cuò)誤

        4.1混淆了*號在指針中的兩個(gè)含義

        初學(xué)者很容易把C語言中的所有*號都理解為指針運(yùn)算符,實(shí)際上,*號在指針中有兩個(gè)含義:在變量聲明部分是指針聲明符,只起聲明變量作用;在語句執(zhí)行部分是指針運(yùn)算符, 是取指針?biāo)赶虻拇鎯?chǔ)單元的作用。

        main()

        { int a=10,b=20,*p1,*p2;

        *p1=a,*p2=b;

        printf(“a=%d,b=%d”,*p1,*p2); }

        上例中*p1=a,*p2=b;顯然不合法,因?yàn)樵趫?zhí)行語句中的*號是指針運(yùn)算符, *p1,*p2表示p1,p2所指向的對象,編程者的意圖是把a(bǔ)和b的地址賦給p1和p2,而不是它們指向的對象,所以應(yīng)把*號去掉,第四行語句則應(yīng)改為“p1=a,p2=b; ”。

        當(dāng)然,也可以在定義指針的時(shí)候賦初值,將程序改為:

        main()

        { int a=10,b=20,*p1=a,*p2=b;

        printf(“a=%d,b=%d”,*p1,*p2); }

        程序中也存在“*p1=a,*p2=b”,但這是正確的對p1,p2進(jìn)行初始化的語句,因?yàn)榇苏Z句出現(xiàn)在變量聲明部分,此時(shí)*號是變量聲明符,所以不能把*p1,*p2看成是p1,p2所指向的對象。程序?qū)嶋H上是把a(bǔ)和b的地址分別賦給了說明為指針變量的p1和p2。

        4.2分不清指針的類型

        指針的類型較繁雜,因此,在學(xué)習(xí)中,注意分清*號的優(yōu)先級是初學(xué)者正確區(qū)分復(fù)雜指針類型的一條有效途徑。

        例: int *p1[n]; int (*p2)[n]; int *p3(); int (*p4)(); int **p5;

        要區(qū)分這些變量的含義首先從與運(yùn)算符的結(jié)合性入手,步驟如下:

        第一、先看變量名首先與哪個(gè)運(yùn)算符相結(jié)合,確定它是否為指針變量。四個(gè)變量中先與說明符*結(jié)合的表明是指針變量,先與[]結(jié)合的表明是一個(gè)數(shù)組,先與()結(jié)合的表明是一個(gè)函數(shù)。因?yàn)閇]和()的優(yōu)先級高,所以p1和p3是數(shù)組和函數(shù), 而p2,p4和 p5是指針變量;

        第二、再根據(jù)變量名與次運(yùn)算符的結(jié)合確定變量的具體含義, 所以它們的含義分別是:

        p1是數(shù)組,它由n個(gè)指向整型數(shù)據(jù)的指針元素組成;

        p2是指針,它指向含n個(gè)元素的一維整型數(shù)組;

        p3是函數(shù),它的返回值為一個(gè)指向整型數(shù)據(jù)的指針;

        p4是指針,它指向一個(gè)返回整型值的函數(shù);

        p5是指針,它指向一個(gè)指向整型數(shù)據(jù)的指針變量,是一個(gè)二級指針。

        總之,要區(qū)分指針的類型,首先要確定這個(gè)變量是否為指針,關(guān)鍵就是看在定義的時(shí)候是否先與*號結(jié)合。

        五、結(jié)束語

        指針是C語言最具特色的語言成分,也是C語言的精華,當(dāng)學(xué)生理解了指針的內(nèi)涵,掌握了指針的基本概念及相關(guān)操作后,還要讓學(xué)生學(xué)會(huì)如何運(yùn)用指針解決實(shí)際問題。

        91久国产在线观看| 国产精品无码午夜福利| 99久久免费看少妇高潮a片特黄| 成年女人在线观看毛片| 国产午夜视频高清在线观看| 99视频在线精品免费观看6| 精品无码久久久久成人漫画| 久久se精品一区精品二区国产| 午夜一区二区在线视频| 色婷婷av一区二区三区久久| 国产三级精品三级在线观看| 日中文字幕在线| 大又黄又粗又爽少妇毛片| 少妇高潮太爽了在线看| 无码中文字幕日韩专区视频| 在线无码国产精品亚洲а∨| 极品精品视频在线观看| 天天做天天添av国产亚洲| 又色又污又爽又黄的网站| 亚洲AⅤ樱花无码| 蜜桃高清视频在线看免费1 | 97人人模人人爽人人少妇| 精品手机在线视频| 99精品又硬又爽又粗少妇毛片| 91九色免费视频网站| 久久夜色精品国产噜噜av| 国产va在线播放| 日韩精品极品系列在线免费视频 | 国产无遮挡又黄又爽在线视频| 久久99久久99精品免观看女同 | 狠狠色噜噜狠狠狠8888米奇| 朝鲜女子内射杂交bbw| 无码专区无码专区视频网址| 三上悠亚亚洲精品一区| 国产精品久久久久久久妇| 国产精品原创巨作av无遮| 亚洲国产精品久久性色av| 久久亚洲日韩精品一区二区三区| 国产96在线 | 亚洲| 一区二区视频网站在线观看| 爽爽影院免费观看|