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

C語言程序設計課程中指針的幾個教學要點

2020-11-23 12:02:16田維蓮羊巍六盤水師范學院
數碼世界 2020年11期
關鍵詞:教學

田維蓮 羊巍 六盤水師范學院

一、引言

C語言程序設計教學中,指針的教學是重難點;此時,學生已經學了函數、數組及結構體等內容,而在指針與函數、指針與結構體及文件的教學中,都需要學生對指針有著深刻的理解與掌握,同時,在其后續課程數據結構中,對指針有很高要求,學生如果不掌握指針并靈活運用,很多算法的實現無從談起。另一方面,指針的教學比較難,指針涉及機器硬件,不好抽象,教學中,常常要圖示大量的內存圖,學生往往會陷入內存細節,而忽視程序的邏輯與指針概念本身的清晰理解;筆者在多年的教學實踐中,認為應該對指針的教學幾個要點作一些梳理,通過示例強調在教學中幾個比較關鍵的知識點,同時,引入幾個新概念或新的理解方式,幫助學生理解、掌握運用指針。

二、指針的教學要點

(一)指針變量

上述程序片段中,聲明了4個變量,在教學中應該明確有關的3個問題:

1.變量與對象的關聯方式

變量i保存對象2,而類型為int *的變量p保存值為i的內存地址的對象&i,我們可能更關心的是變量p與對象2的關聯,應該明確,變量i與對象2是直接關聯,變量p與對象2是間接關聯,變量p通過保存變量i的地址而與對象2關聯,可以通過間接尋址運算符*取得變量i的值(即對象2),但此時應注意,語句int * p = &i 中的符號“*”不是間接尋址運算符,其作用是編譯時,告訴編譯器,變量p是一個類型為int *的指針(引用)變量,變量p可以和類型為int的變量通過賦值的形式發生關聯,即p = &i。

2.C語言中量(常量與變量)的分類

可以明確,C語言中,從上述變量與對象的關聯方式來說,變量分為兩類,一類為值類型變量,其保存的是非地址值的值對象(如變量i),另一類為引用(指針)類型變量(如變量p),其保存的值是內存地址,但要注意,*p是變量i 的別名(也就是說,在變量i的作用域范圍內,凡是出現變量i的地方,均可用*p替換。),*p是左值,通過*p可以對變量i 的值進行讀寫,對*p進行賦值操作,等同于對變量i進行賦值操作。

對于C語言中的值常量而言,也可以分為兩類,一類是地址值,我們稱其為引用(指針)類型,另一類常量稱為值類型。

3.指針變量的使用

C語言中,要使用指針變量,要有一個前提,指針變量要么和一個變量發生關聯(如語句:int *p = &i;使得指針變量p和變量i發生了關聯),要么指針變量有一個非空的合法地址值(如語句:int*q = (int *)malloc(sizeof(int) * 2;使得變量q得到了一個類型為int *的,由函數malloc分配的連續內存地址的首地址值)。

指針變量t被初始化為NULL,稱t為空指針,t的值NULL(宏NULL在stdio.h和stdlib.h等頭文件中均有定義)是一個區別于任何有效指針值的特殊值,這表明t“不指向任何地方”;若指針變量t沒有初始化,則這個指針變量就成懸空指針,這表明t是一個“不知道指向哪里”的指針,若是通過空指針或懸空指針訪問內存,程序要么崩潰,要么出現難以預料的結果,為此,應該強調,一個良好的編程習慣是,將暫時不用的指針變量在聲明時立即初始化為NULL,這樣可以清出程序中的懸空指針,同時在使用指針變量應檢測其值是否為空,如上述的代碼片段中,對指針變量q的檢測(if(q))。

(二)指針與數組

上述代碼片段中,意在展示通對指針處理數組,學生習慣使用的arr[i],實際上,最后arr[i]被編譯成為*(arr+i),也就是說arr[i]等價于*(arr+i),同理*(p+i)等價于p[i];同時,在教學中,應該強調,p、*p以及*arr是左值,而arr不是,數組名arr是一個類型為int *const的指針常量,其值為數組arr中首元素(arr[0])的地址值,另一個問題是,arr[5]非法,而&arr[5]卻合法,雖然,arr[5]不存在,但是,對arr[5]取地址是可以的,實際上,&arr[5]等價于&*(arr + 5),而&*(arr + 5)就是(arr + 5),(arr + 5)是一個類型為int *的地址值。

(三)指針、函數及結構體

上述示例代碼片段中,函數total_score的作用:將結構體c的成員scores中前size-1項數組元素進行加總并返回。將類型為class*的指針作為函數的參數是一種高效的作法,這樣作避免了實參向形參傳值時,數組scores被復制,學生可能會疑問:設計一個函數原型為int total_score(class cl)的函數來做同樣的事也可以高效完成,因為,形參cl的成員scores是一個數組名,當調用發生時,復制給形參cl的成員scores的值不就是個地址嗎,實參的數組沒有被復制,實參和形參共享同一個數組?應該強調的是,在C語言中,對結構體進行復制時,結構體中的數組成員也被復制,而非兩個結構體共享同一個數組,因此,將類型為class結構體作為函數的參數的做法低效。

函數no_pass將結構體c數組成員中,值小于60的數組元素下標標記于另一個結構體nopass中,并返回nopass。此處,學生可能會有疑問:應該返回一個指向nopass的指針,而非結構體nopass,這樣可以避免調用no_pass函數,取返回值時,未發生的結構體數組成員被復制,因而高效。在這個地方,可以強調,C語言中,返回一個指向局部自動變量的指針是致命的,一旦no_pass函數執行完畢,其所占據的內存空間隨即被回收,結構體nopass不存在了,指向nopass的指針變成了指向一個不存在的對象的指針,在no_pass函數外部使用該指針,程序可能會崩潰或出現無法預知結果。因此,no_pass函數的處理方式是正確而又明智的,這種處理方式避免了“返回一個指向局部自動變量的指針”的錯誤。

(四)指針與字符串

上述的示例代碼中,學生可能會有疑問:程序為什么報錯?筆者認為,要從幾個方面說起,一方面,”Hello”到底是什么?如果回答,”Hello”是字符串。那么這個回答是含混不清的。首先,”Hello”是字符串字面量(一些教材又稱為字符串常量,并解譯:常量就是不能被改變的量,于是修改字符串常量程序會報錯,這樣的解譯實際上沒有把問題說清楚。),字符串字面量就是字符串的在源程序中的字面表達;其次,”Hello”被保存于一片連續的內存空間中,字符’o’的后面被追加代表字符串結束的字符’

主站蜘蛛池模板: 亚洲综合天堂网| 四虎永久在线精品影院| 91精品专区国产盗摄| 99久久精彩视频| 久久香蕉国产线看观看精品蕉| 日韩精品无码免费专网站| 在线观看91精品国产剧情免费| 青青久久91| 国产情精品嫩草影院88av| 亚洲国产精品无码AV| 欧美成人午夜视频免看| 无码av免费不卡在线观看| 国产精品思思热在线| 亚洲男人天堂2018| 欧美一级在线播放| 91在线播放国产| 91美女视频在线| 野花国产精品入口| 免费在线a视频| 国产在线观看高清不卡| 欧美激情福利| 高清不卡毛片| 成人午夜视频网站| 在线精品亚洲一区二区古装| 一区二区三区毛片无码| 亚洲人成网站18禁动漫无码| 无码一区18禁| 九色视频最新网址| 亚洲欧美日韩色图| 狠狠综合久久| 亚洲AⅤ永久无码精品毛片| 九九九精品成人免费视频7| av无码久久精品| 99久久精品久久久久久婷婷| 日韩精品一区二区三区大桥未久| 亚洲无码高清一区| 久久免费精品琪琪| 久久综合成人| 色欲色欲久久综合网| 国产成人亚洲无吗淙合青草| 尤物特级无码毛片免费| 日韩 欧美 国产 精品 综合| a在线观看免费| 成人av手机在线观看| 国产毛片高清一级国语| 国产91小视频在线观看| 国产成人免费视频精品一区二区| 制服丝袜一区二区三区在线| 99re热精品视频中文字幕不卡| 啊嗯不日本网站| 国产哺乳奶水91在线播放| 欧美精品一二三区| 亚洲欧美成人在线视频| 久久一色本道亚洲| 免费国产一级 片内射老| 久久精品人人做人人爽| 久青草免费在线视频| 全部无卡免费的毛片在线看| 狂欢视频在线观看不卡| 久久精品中文字幕少妇| 91福利免费| 国产成年无码AⅤ片在线 | 成人福利在线视频| 国产精品人成在线播放| 国内精品自在欧美一区| 九九视频免费看| 国产免费久久精品44| 91蝌蚪视频在线观看| 欧美日一级片| 亚洲一级毛片在线播放| 久久青青草原亚洲av无码| 国产成人h在线观看网站站| 91福利免费视频| 日韩av资源在线| 亚洲欧美在线综合图区| 欧美午夜在线视频| 秋霞国产在线| 2024av在线无码中文最新| 精品无码一区二区三区电影| 国产精欧美一区二区三区| 亚洲人网站| 国产鲁鲁视频在线观看|