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

論指針中需要認真辨識的3組概念

2020-10-21 05:40:48賴玲
赤峰學院學報·自然科學版 2020年3期
關鍵詞:定義

賴玲

摘 要:通過對指針中3組容易混淆的概念研究,介紹了它們的辨識方法,以具體實例為依據,介紹了對數據加工和處理的方法,有助于夯實編程基礎,促進編程能力的提高.

關鍵詞:指針;地址;數組;函數

中圖分類號:TP312? 文獻標識碼:A? 文章編號:1673-260X(2020)03-0022-03

指針是C語言中的一個重要概念,是其最具特色的部分,是C語言的精華,同時也是C語言的難點.指針除了能動態地分配地址,表示復雜的數據結構,在調用函數的時候能夠得到1個以上的結果外,在系統軟件的設計也是非常重要的.筆者在實際的教學和學生的實際編程指導中發現,很多學生對“指針變量的定義符”和“指針變量的取值運算符”“指針函數”和“函數指針”“指針數組與數組指針”等概念混淆不清;認真辨識有關概念,礪清它們間的相互關系,對于編制簡潔、緊湊、高效的應用程序非常有用,下面談談應該辨識的幾個概念.

1 “指針變量的定義符”和“指針變量的取值運算符”

操作符“*”既可以用來作為指針變量的定義符,也可以用作指針變量的取值運算符.要根據“*”操作符出現的位置進行判斷.

例1 int i=3, *p;

p=&i;

printf("%d",*p);

scanf("%d",p);

*p=5;

程序的第一句“int i=3;*p;”定義了一個整型變量i和一個整型的指針變量p,i里面只能存放整型變量的值,p(這里P前面的操作符“*”就是指針變量的定義符)里面只能存放整型變量的地址,i的初始值為3,執行“p=&i;”中的“&”是取地址操作符,“p=&i;”將i的地址存到指針變量p的空間里面,也可以理解為將指針變量p指向整型變量i的首地址,見圖1所示.

程序中的第三句,以十進制整數的形式輸出*p,對于*p理解十分重要,這里p前面的操作符“*”就是取值運算符,就是p當前所指向變量i的存儲空間里面存放的內容3.第四句是向指針變量p所指向的空間輸入十進制整型數據,等價于scanf("%d",&a),第五句是用5覆蓋指針變量p所指存儲空間里面的內容,等價于“i=5;”,因為p是指向整型變量i的首地址,“*p=5;”就是將p當前所指向變量i的存儲空間里面的內容修改為5,這是間接尋址方式.

這里辨識的原則:一級指針變量中存放目標變量的地址,凡是在聲明的語句中出現的操作符“*”是指針變量定義符,如例1程序第1行中的操作符“*”;在操作和控制部分出現的操作符“*”就是取值運算符,如例1程序第3行和第5行中的操作符“*”.

對于取值的理解一定要注意取值的內容,對于一級指針,取得內容為“指針所指向存儲空間里面的內容”即存儲空間的值,對于二級指針或者多級指針有“取存儲空間的地址”和“取存儲空間里面的內容”的區別.

例2 int a,*p,**pp;

a=22;

p=&a;

pp=&p;

printf("%p,%d",*pp, **pp);

假設變量a的地址為4000,指針p的地址為4100,二級指針pp的地址為4800,a、p、pp三者的關系如圖2所示.

由圖2可以看出,a的地址為4000,保存在指針變量p中,p指向a,p的地址為4100,保存在pp中,即二級指針pp指向指針變量p,此時,要引用a的值,可以使用*p,也可以使用**pp.注意:雖然p、pp都是指針變量,但p和pp指向的內容有著本質上的不同,p指向的是普通變量的地址,pp只能指向指針變量的地址而不能指向普通變量的地址.

也就是說,二級指針的指針變量中存放的是一級指針變量的地址,對于指針變量的定義符和一級指針一樣,只要是在聲明語句中出現的操作符“*”都是指針變量的定義符,例2中第1行中的操作符“*”和操作符“**”都是指針變量的定義符,第5行“printf("%p,%d",*pp,**pp);”中“*pp”的“*”和“**pp”前面的“*”是指針變量取值運算符,只不過它們取值的內容不一樣,“*pp”取的是目標對象的地址,“**pp”也就是“*(*pp)”,取的是目標對象的內容.

2 “指針數組”與“數組指針”

2.1 “指針數組”

對于給定的一個數組,其元素都是存放同一類型數據的地址,這樣的數組稱為“指針數組”. “指針數組”其本質為數組,只不過數組元素是同一類型數據的地址.例如:

int *p[4];

這里定義了一個指針數組,該數組的每個元素是整形變量的地址.對于“*p[4]”可以這樣理解,由于“[ ]”操作符比“*”操作符的優先級高,因此p先與操作符“[ ]”結合,形成p[4]形式,這顯然是數組的形式,表示p數組里面有4個元素,p[4]中的p再與前面的操作符“*”結合,“*”是指針類型定義符,表示此數組是個指針類型,每個數組元素都可以指向一個整型變量.*p[i]相當于*(p[i]),都表示下標為i元素的地址,因為操作符“[ ]”優先級高于操作符“*”.

注意:這里提到的優先級,操作符“()”高于操作符“[ ]”高于操作符“*”.

2.2 “數組指針”

“數組指針”也稱為行指針,是指向數組地址的指針,其本質為指針.其定義形式為:

(*指針變量名)[長度]

例如:int (*P)[n]

這里操作符“()”的優先級比操作符“[ ]”優先級高,“(*P)”表示是個指針,再與操作符“[ ]”結合,表示“數組指針”,“長度”表示二維數組分解為多個一維數組時,一維數組的長度,也就是二維數組的列數.

例3

main()

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

int *q,(*p)[4];

for(p=a;p

{ for(q=p[0];q

printf("%5d",*q);

}

}

本程序的目的是輸出二維數組的各元素,使用了普通的指針變量和二維數組的行指針,行指針指向二維數組的首地址(p=a),p++跳過的是一行,而不是一個元素.

兩者的區別:數組指針只是一個指針變量,占有目標對象一個地址的存儲空間;指針數組是多個指針變量,以數組的形式存儲在內存當中,占有多個指針的存儲空間.

3 “指針函數”與“函數指針”

3.1 指針函數

指針函數是指返回值是指針的函數,即本質是一個函數.函數返回值是某一類型的指針.其定義形式為:

類型標識符 *函數名(參數表)

int *f(x,y);

首先它是一個函數,這個函數的返回值是一個地址值.

3.2 函數指針

如果在程序中定義了一個函數,編譯器在程序編譯之后,會為每個函數分配一個入口地址,即該函數第一條指令的地址,這個地址就是函數的指針.函數指針是指向函數的指針變量,其本質是一個指針變量.

int (*f) (int x); /*聲明一個函數指針*/

f=func; /*將func函數的首地址賦給指針f */

一般情況下,我們可以用一個指針來保存這個地址,而這個指針就是函數指針,該指針可以看作是它指向函數的別名,所以我們可以用該指針來調用這個函數.

例4 用函數指針變量作函數參數實例,從鍵盤任意輸入兩個整數,求其最大值.

include"stdio.h"

int max (int x,int y)

{

return x>=y?x:y;

}

void main()

{

int a,b,c;

int (*p)(int x,int y);

scanf("%d,%d",&a,&b);

p=max;

c=(*p)(a,b);

printf("a=%d,b=%d,max=%d\n",a,b,c);

}

程序中max (int x,int y)是已經定義的函數,用來求兩個數的最大值.函數int (*p)(int x,int y)中p先與操作符“*”結合,是指針變量,然后再與后面的操作符“()”結合,表示此指針變量指向函數,這個函數的返回值是個整數.

程序中的第11行“p=max;”將指針變量p指向了“max (int x,int y)”函數的入口地址,即p指向函數max ( ).a,b的值分別傳遞給x,y.函數的返回值是a,b的最大值.

必須注意:(1)一個指向函數的指針必須確保該函數被定義且分配了內存,否則它將指向一個空地址,這是程序設計的大忌!

(2)要注意“int (*p)(int x,int y);”中第一個括號的位置.如果寫成 “int *p (int x,int y);”情形,由于操作符“( )”高于操作符“*”,這就不是一個指向函數的指針了,它就成了聲明聲明一個函數,這個函數的返回值一個int類型的地址.

(3)給函數的指針變量賦值時只賦函數名,不允許帶參數.如第11行“p=max;”.

(4)發生函數調用的時候可以通過函數名,也可以通過函數的指針,本例中的調用形式“c=(*p)(a,b);”用函數指針調用的參數與函數調用的參數完全一致,用函數指針變量調用函數時,只需要將“(*p)”代替函數名.

(5)對指向函數的指針變量不允許做加減運算,如:p++、p—、p+n都是錯誤的.

4 使用指針,一定要注意指針當前的指向

使用指針可以方便訪問內存,具有很強的靈活性,但在設計程序的時候,一定要留意指針當前的指向.下面的程序企圖利用指針輸出數組中的元素.

例5 利用指針知識給數組元素賦值,再將數組中的各元素輸出.

main()

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

p=a;

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

scanf("%d",p++);

printf("\n");

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

printf("%d",*p);

}

程序中的第一個for語句實現了對數組元素賦值的功能,for結束的時候,執行“p++”,指針已經指向數組以后的空間.執行第二個for語句,由于p所指的空間不是數組a的起始地址,執行目標地址取值運算符“*p”時,就無法和數組元素建立聯系,所以,就實現不了項目所要求的具體功能,為了解決這個問題,必須在程序的第6行后添加“p=a;”指令,使指針變量p重新指向數組a的首地址,才能實現項目所要求的具體功能.

5 結束語

程序設計中涉及的概念很多,對數據加工和處理的方法也靈活多變,只有認真厘清知識間的相互關系,認真辨析指針中常用的有關概念,注意指針當前的指向,腳踏實地認認真真的書寫每行程序,才是編寫出符合要求的程序.

參考文獻:

〔1〕任正云,李素若.C語言程序設計(第三版)[M].北京:中國水利水電出版社,2016.

〔2〕譚浩強.C語言程序設計教程(第3版)[M].北京:高等教育出版社,2006.

〔3〕徐士良,等.C語言程序設計教程(第三版)[M].北京:人民郵電出版社,2009.

〔4〕[美]K.N.King著,呂秀峰,黃倩譯.C語言程序設計:現代方法(第2版)[M].北京:人民郵電出版社,2010.

〔5〕[美]Stephen Prata著,云巔工作室譯.C Primer Plus(第五版)中文版【M】.北京:人民郵電出版社,2005.

〔6〕劉軍.C程序設計教學探討[J].電腦知識與技術,2011(06).

猜你喜歡
定義
以愛之名,定義成長
活用定義巧解統計概率解答題
例談橢圓的定義及其應用
題在書外 根在書中——圓錐曲線第三定義在教材和高考中的滲透
永遠不要用“起點”定義自己
海峽姐妹(2020年9期)2021-01-04 01:35:44
嚴昊:不定義終點 一直在路上
華人時刊(2020年13期)2020-09-25 08:21:32
定義“風格”
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
有壹手——重新定義快修連鎖
修辭學的重大定義
當代修辭學(2014年3期)2014-01-21 02:30:44
主站蜘蛛池模板: 欧美成人在线免费| 欧美一级在线播放| 国产成人精品2021欧美日韩| 国产精品亚欧美一区二区| 伊人久久婷婷五月综合97色| 国产成年女人特黄特色毛片免| 欧美成人午夜影院| 无码中文AⅤ在线观看| 国产丝袜无码精品| 在线精品亚洲一区二区古装| 粗大猛烈进出高潮视频无码| 日韩无码视频网站| 四虎亚洲国产成人久久精品| 91在线激情在线观看| 免费观看成人久久网免费观看| 久久国产精品77777| 2021国产乱人伦在线播放| 色久综合在线| 国产一级毛片在线| 在线日韩一区二区| 日韩欧美中文字幕在线韩免费| 国产美女精品一区二区| 九九这里只有精品视频| 亚洲日本中文字幕乱码中文| 欧洲日本亚洲中文字幕| 中文毛片无遮挡播放免费| 日韩a在线观看免费观看| 四虎影视永久在线精品| 午夜福利在线观看入口| 国产成人毛片| 亚洲精品另类| 国产主播一区二区三区| a网站在线观看| 亚洲高清免费在线观看| 特级aaaaaaaaa毛片免费视频| 国产91成人| 亚洲精品午夜天堂网页| 91福利片| 亚洲成a人在线播放www| 在线看片国产| 国产精品视频导航| 婷婷中文在线| 日韩麻豆小视频| 亚洲国产精品日韩av专区| 国产国模一区二区三区四区| 国产成人亚洲精品蜜芽影院| 婷婷激情五月网| 激情五月婷婷综合网| 欧美成人区| 99re免费视频| 亚洲天堂视频网站| 青青草原偷拍视频| 亚洲欧州色色免费AV| 久久精品中文字幕免费| 成人国产免费| 亚洲精品大秀视频| 亚洲va在线∨a天堂va欧美va| 国产乱子伦无码精品小说| 中文字幕永久视频| 日本三级精品| 另类综合视频| 欧美午夜精品| 波多野结衣一区二区三区四区| 曰AV在线无码| 欧美精品亚洲日韩a| 99在线视频免费| 久久天天躁夜夜躁狠狠| 亚洲高清无码久久久| 国产精品网拍在线| 亚洲视频色图| 丰满的少妇人妻无码区| 亚洲黄色片免费看| 四虎影院国产| 国产白浆一区二区三区视频在线| 国产欧美在线观看视频| 国产精品.com| 日本高清视频在线www色| 国产成人精品一区二区秒拍1o| 午夜毛片免费观看视频 | 国产噜噜噜视频在线观看| 欧美专区在线观看| 欧美三级视频网站|