999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C語言中指針用法解析

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

【摘要】 指針是c語言教學中比較難理解的一塊,文章根據本人多年教學經驗,從c語言指針的概念出發,針對指針在教學中的幾個重要應用進行了探討。

【關鍵詞】 c語言 指針 變量 數組

一、引言

指針是c語言的特色之一,也是學生學習c語言程序設計時的一個難點,靈活掌握指針的用法,正確而靈活地運用它可以有效地表示復雜的數據結構,可以動態地分配內存,可以直接處理內存地址等??梢允箯碗s的程序變得簡潔緊湊。

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

二、基本概念辨析

如果在使用中定義了一個變量,在編譯時系統就會給這個變量分配內存單元。

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

變量名 xy

內存單元…34…

單元地址 10001002

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

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

2.1指針變量的定義

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

對指針變量的類型說明包括三個內容

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

2、指針類型說明:即定義變量為一個指針變量,其標志是變量名前的*;

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

2.2指針變量賦初值

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

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; (將數組 a 的首地址賦給p,相當于p=a[0])

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

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

三、指針的應用

3.1數組中指針的應用

在C語言中,數組與指針是兩個非常重要的數據類型,它們之間有著十分密切的關系,它們都適于處理內存中連續存放的一系列數據,數組元素的引用可用指針的描述來實現。

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)等價于a[i]。

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

數組中的行指針和列指針,例:

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

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

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

行指針和列指針可以相互轉換。將行指針降級即轉變為列指針,降級的方法有指針法和下標法,即利用指針運算符*或下標運算符[]都可以使一個指針降級。例如a為行指針,a* 和a[0]則表示列指針;反之,將列指針升級,即前面加地扯運算符就轉換為行指針,例如*a 和a[0]表示列指針,*a和a[0]則表示行指針。

3.2函數參數中指針的應用

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

3.3鏈表中指針的應用

鏈表是一種常見的重要的數據結構,它是動態地進行存儲分配的一種結構,在 C 語言中使用數組必須事先定義固定的長度,是一種靜態存儲分配,不適合用來實現鏈表,而指針可以實現動態存儲分配,用來實現對鏈表的創建、插入和刪除等操作。以下creatlink函數建立一個帶頭結點的單向鏈表,并用隨機函數為各個結點賦值。函數fun的功能是將單向鏈表結點數據域為偶數的值累加起來,并作為函數值返回。

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

四、指針運用的常見錯誤

4.1混淆了*號在指針中的兩個含義

初學者很容易把C語言中的所有*號都理解為指針運算符,實際上,*號在指針中有兩個含義:在變量聲明部分是指針聲明符,只起聲明變量作用;在語句執行部分是指針運算符, 是取指針所指向的存儲單元的作用。

main()

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

*p1=a,*p2=b;

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

上例中*p1=a,*p2=b;顯然不合法,因為在執行語句中的*號是指針運算符, *p1,*p2表示p1,p2所指向的對象,編程者的意圖是把a和b的地址賦給p1和p2,而不是它們指向的對象,所以應把*號去掉,第四行語句則應改為“p1=a,p2=b; ”。

當然,也可以在定義指針的時候賦初值,將程序改為:

main()

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

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

程序中也存在“*p1=a,*p2=b”,但這是正確的對p1,p2進行初始化的語句,因為此語句出現在變量聲明部分,此時*號是變量聲明符,所以不能把*p1,*p2看成是p1,p2所指向的對象。程序實際上是把a和b的地址分別賦給了說明為指針變量的p1和p2。

4.2分不清指針的類型

指針的類型較繁雜,因此,在學習中,注意分清*號的優先級是初學者正確區分復雜指針類型的一條有效途徑。

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

要區分這些變量的含義首先從與運算符的結合性入手,步驟如下:

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

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

p1是數組,它由n個指向整型數據的指針元素組成;

p2是指針,它指向含n個元素的一維整型數組;

p3是函數,它的返回值為一個指向整型數據的指針;

p4是指針,它指向一個返回整型值的函數;

p5是指針,它指向一個指向整型數據的指針變量,是一個二級指針。

總之,要區分指針的類型,首先要確定這個變量是否為指針,關鍵就是看在定義的時候是否先與*號結合。

五、結束語

指針是C語言最具特色的語言成分,也是C語言的精華,當學生理解了指針的內涵,掌握了指針的基本概念及相關操作后,還要讓學生學會如何運用指針解決實際問題。

主站蜘蛛池模板: 日韩无码视频网站| 欧美成人综合视频| 成人福利在线视频| 99精品国产高清一区二区| 国产主播福利在线观看| 日韩高清一区 | 国产精品嫩草影院视频| 国产精品色婷婷在线观看| 国产精品999在线| 91精品久久久无码中文字幕vr| 欧美激情伊人| 国内精品久久久久久久久久影视| 毛片视频网| 成年免费在线观看| 久久国产精品麻豆系列| 日本精品αv中文字幕| 欧美日韩第二页| 99精品一区二区免费视频| 97国产在线播放| 99久久精品视香蕉蕉| 国产尤物jk自慰制服喷水| 亚洲无码高清免费视频亚洲 | 国产主播在线观看| 久久人午夜亚洲精品无码区| 午夜精品久久久久久久无码软件| 好吊色妇女免费视频免费| 欧美专区日韩专区| 狠狠做深爱婷婷久久一区| 激情無極限的亚洲一区免费 | 亚洲午夜久久久精品电影院| 欧美日韩国产高清一区二区三区| 欧美色图第一页| 国产色图在线观看| 国产精品夜夜嗨视频免费视频| 黄色污网站在线观看| 国产人人乐人人爱| 亚洲天堂自拍| 亚洲网综合| 国产主播福利在线观看| 成人亚洲天堂| 影音先锋丝袜制服| 女人18毛片一级毛片在线| 无码内射在线| 夜夜高潮夜夜爽国产伦精品| 亚洲色图综合在线| 美女毛片在线| 欧美日韩中文国产va另类| 午夜福利网址| 一级高清毛片免费a级高清毛片| 99热这里只有精品在线播放| 亚洲精品大秀视频| 国产最爽的乱婬视频国语对白 | 久久永久精品免费视频| 成人午夜天| 99尹人香蕉国产免费天天拍| 欧美天堂在线| 久久综合色天堂av| 日本亚洲成高清一区二区三区| 中文成人在线| 国产激爽大片在线播放| 日韩黄色精品| 日韩亚洲综合在线| 久久毛片免费基地| 伊人五月丁香综合AⅤ| 高清不卡毛片| 97在线公开视频| 国产在线精彩视频二区| 国产精品浪潮Av| 欧美亚洲综合免费精品高清在线观看| 欧美日韩中文字幕在线| 欧类av怡春院| 亚洲欧美日韩色图| 国产a在视频线精品视频下载| 免费aa毛片| 国产精品一线天| 成人在线第一页| 一本色道久久88| 亚洲人成成无码网WWW| 久久综合成人| 亚洲高清中文字幕| 黄色网站在线观看无码| 九九视频免费看|