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