摘 要:C語言指針教學(xué)過程中碰到的舉棋不定的疑惑和學(xué)生不易理解的問題,本文通過對(duì)問題的反思,采用有針對(duì)性的案例分析了指針學(xué)習(xí)的必要性,為學(xué)生樹立了指針必須學(xué)而且要深入學(xué)的信念。
關(guān)鍵詞:C語言;指針;必要性
1 緒論
C語言是1972年誕生,至今仍然活躍的編程語言,在編程語言發(fā)展歷程中具有舉足輕重的地位。實(shí)際應(yīng)用中,C語言兼顧了高級(jí)語言和匯編語言的優(yōu)點(diǎn),以其豐富的語法結(jié)構(gòu)、可移植性、允許直接訪問物理地址、直接操作硬件、執(zhí)行效率高等優(yōu)勢(shì),廣泛應(yīng)用于計(jì)算機(jī)系統(tǒng)開發(fā)和應(yīng)用程序底層開發(fā)。
正因?yàn)槿绱?,各大高校將C語言設(shè)置為計(jì)算機(jī)專業(yè)核心專業(yè)基礎(chǔ)課,掌握好C語言是評(píng)價(jià)學(xué)生計(jì)算機(jī)應(yīng)用能力的重要標(biāo)準(zhǔn),學(xué)生熟練掌握了C語言相關(guān)知識(shí),不僅能深入理解計(jì)算機(jī)工作原理,而且為今后學(xué)習(xí)其他編程語言打下堅(jiān)實(shí)的基礎(chǔ)。
C語言作為計(jì)算機(jī)專業(yè)學(xué)生學(xué)習(xí)的第一門編程語言課程,課程目標(biāo)之一就是激發(fā)學(xué)生的學(xué)習(xí)興趣,讓學(xué)生愛上編程。在實(shí)際教學(xué)中,學(xué)生起初對(duì)C語言學(xué)習(xí)興趣度很高,但隨著學(xué)習(xí)的深入,難度不斷加大,特別到了指針部分的學(xué)習(xí),如果前期基礎(chǔ)知識(shí)不牢固,更容易讓學(xué)生喪失學(xué)習(xí)興趣,學(xué)生會(huì)認(rèn)為指針是難以逾越的大山,導(dǎo)致后期的教學(xué)工作無法順利開展,教學(xué)目標(biāo)難以達(dá)成。指針作為C語言的特色和精華,學(xué)習(xí)了C語言,而沒有學(xué)習(xí)指針,那可以說沒有學(xué)習(xí)C語言。
當(dāng)前很多主流計(jì)算機(jī)編程語言,隱藏了指針的概念,但功能卻很強(qiáng)大,那么為什么要學(xué)習(xí)C語言的指針呢?實(shí)際教學(xué)過程中,發(fā)現(xiàn)很多例題和習(xí)題可以不用指針實(shí)現(xiàn);教材中指針部分也基本上是將之前的例題用指針實(shí)現(xiàn),那為什么一定要用指針實(shí)現(xiàn)呢?如果不能很好的回答這些問題,就沒有深刻理解和學(xué)習(xí)指針。下面,通過案例來體會(huì)為什么必須學(xué)習(xí)指針。
2 必要性分析
2.1 指針可以提高程序的執(zhí)行效率
馮·諾依曼計(jì)算機(jī)工作原理是將程序預(yù)先存放在主存儲(chǔ)器中,使計(jì)算機(jī)在工作時(shí)能夠自動(dòng)高速地從存儲(chǔ)器中取出指令,并執(zhí)行。根據(jù)該原理,程序執(zhí)行之前都要裝入內(nèi)存單元中,當(dāng)程序運(yùn)行時(shí),從內(nèi)存中取指令代碼和數(shù)據(jù)到CPU中,分析指令、執(zhí)行指令。仔細(xì)分析這個(gè)過程,發(fā)現(xiàn)分析指令和執(zhí)行指令的速度是和計(jì)算機(jī)的CPU配置密切相關(guān)的,但從內(nèi)存取指令和數(shù)據(jù),這個(gè)過程是可以通過技術(shù)縮短時(shí)間的,這個(gè)技術(shù)就是指針。下面通過例子進(jìn)行闡述。
int? num = 9;
printf(“%d\n”,num);
上述第1條語句定義了一個(gè)int類型的變量num,并賦值為9,也就是在內(nèi)存中開辟了一塊空間,名字命名為num,如圖1所示:
程序執(zhí)行到第2行的時(shí)候,通過變量的名字num來訪問該變量的值,這就相當(dāng)于你的朋友從遠(yuǎn)方給你郵寄了一份快遞,快遞單上只寫了你的名字和電話,那么快遞員首先要通過你的電話,問清楚你的住址,然后再去送快遞給你。
那么如果使用指針呢?
int? num = 9;
int *p = #
printf(“%d\n”,*p);
仔細(xì)分析上面的代碼段,其中第2行表示定義一個(gè)指向int類型的指針變量p,并用來保存變量num的地址,也就是指針p指向變量num,如圖2所示:
采用指針可以實(shí)現(xiàn)快速取數(shù)據(jù),比如遠(yuǎn)方的朋友郵寄了一份禮物,快遞單上記錄了你的住址,那么快遞員根據(jù)住址送貨到家。和第1種方法相比,使用指針可以快速的取指令和數(shù)據(jù),節(jié)省了時(shí)間,提高了程序執(zhí)行效率。
2.2 使用指針創(chuàng)建動(dòng)態(tài)數(shù)組
我們編寫的程序在執(zhí)行前不能確定要開辟多大的存儲(chǔ)空間,在運(yùn)行過程中通過鍵盤動(dòng)態(tài)輸入,比如下面的程序代碼:
#include
void main()
{
int n;
scanf(“%d”,&n);
int a[n];
a[1] = 2;
printf(“%d\n,a[1]);
上面代碼編譯報(bào)錯(cuò),最關(guān)鍵的錯(cuò)誤就是數(shù)組不能動(dòng)態(tài)開辟大小,也就是程序不能在運(yùn)行的時(shí)候才申請(qǐng)數(shù)組空間,也就是在申明或者定義數(shù)組的時(shí)候,數(shù)組的大小必須是常量。之前我們解決這個(gè)問題,數(shù)組長度通常給定一個(gè)比較大的值,但這樣會(huì)造成內(nèi)存空間的浪費(fèi)。解決這個(gè)問題,必須使用指針動(dòng)態(tài)申請(qǐng)空間。具體實(shí)現(xiàn)代碼如下:
#include
void main()
{
int n;
int *p;
scanf(“%d”,&n);
p = (int*)malloc(sizeof(int) * n);
*(p+1) = 2;
printf(“%d\n”,*(p+1));
free(p);
}
上述代碼運(yùn)行成功,使用指針可以完美的解決在運(yùn)行過程中動(dòng)態(tài)確定存儲(chǔ)空間的大小,使得代碼更加靈活和通用。
2.3 使用指針作為函數(shù)參數(shù)可以改變變量本身的值
在學(xué)習(xí)指針時(shí)有個(gè)經(jīng)典的案例:交換兩個(gè)變量的值。這里我們自定義函數(shù)swap()實(shí)現(xiàn)交換功能。如果不使用指針,代碼如下:
#include
void swap(int x,int y)
{
int temp;
temp = ?x;
x = y;
y = temp;
}
void main()
{
int a = 3,b = 4;
printf(“交換前a=%d,b=%d\n”,a,b);
swap(a,b);
printf(“交換后a=%d,b=%d\n”,a,b);
}
上述代碼運(yùn)行后發(fā)現(xiàn)交換前和交換后a和b的值沒有變,當(dāng)普通變量作函數(shù)參數(shù)的時(shí)候,如果不用return返回值,main函數(shù)中的變量的值是不會(huì)變化的。為了真正實(shí)現(xiàn)變量a和b的值交換,使用指針重構(gòu)上述代碼:
#include
void swap(int x,int y)
{
int temp;
temp = ?x;
x = y;
y = temp;
}
void main()
{
int a = 3,b = 4;
printf(“交換前a=%d,b=%d\n”,a,b);
swap(a,b);
printf(“交換后a=%d,b=%d\n”,a,b);
}
該程序運(yùn)行結(jié)果是:交換后a=4,b=3,實(shí)現(xiàn)了a和b真正的交換,由此可見使用指針作為函數(shù)參數(shù)可以得到多個(gè)改變的值。
3 結(jié)語
通過指針學(xué)習(xí)必要性分析,發(fā)現(xiàn)指針的確有很多不可替代的優(yōu)勢(shì),比如可以提高程序執(zhí)行效率、程序運(yùn)行過程中動(dòng)態(tài)開辟內(nèi)存空間等,因此指針在C語言課程體系中有這不可替代的地位。作為專業(yè)教師,不能因?yàn)閷W(xué)生學(xué)習(xí)指針困難比較大而輕易選擇不講或者減少學(xué)習(xí)內(nèi)容,必須結(jié)合班情、學(xué)情,精心設(shè)計(jì)教學(xué)過程,幫助學(xué)生更好地學(xué)習(xí)指針。
參考文獻(xiàn):
[1]譚浩強(qiáng).C程序設(shè)計(jì)[M].清華大學(xué)出版社.
[2]李霞.C語言指針的應(yīng)用[J].科技創(chuàng)新導(dǎo)報(bào),2009(4):21-23.
[3]劉變蓮.C語言指針再議[J].電腦知識(shí)與技術(shù),2019(18):265-267.
作者簡介:曹雁(1982-),女,甘肅天水人,碩士研究生,主要研究軟件工程、視頻編碼。