學生時代所學的一些 C 語言知識點回顧(3)——再議指針的聲明與使用
- 2019 年 10 月 4 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/solaraceboy/article/details/100735453
學生時代所學的一些 C 語言知識點回顧(3)——再議指針的聲明與使用
但凡學習過 C 語言的小夥伴們應該都了解指針在 C 語言中的地位。指針的諸多優勢就不再贅述了。即便如此,對於很多人來說, C 語言的指針的學習和使用依然令人頭疼。筆者在工作多年後,在工作中偶爾使用到 C 語言,結合實際情況,根據自己的理解,通過三段簡短的程式碼,對曾經所學的 C 語言指針部分知識進行了回顧,希望對自己及閱讀本文的朋友有所啟發。時間倉促,疏漏在所難免,還望諸看官輕拍。
讓我們來看一下以下程式碼:
# include<stdio.h> int main(int argc,char *argv[]){ int *p; *p = 203030; printf("%dn",*p); }
相信很多初學者都會犯類似的錯誤。這段程式碼能正常通過編譯,但是不能正常執行。原因在於:指針變數 p 沒有明確的指向。在實際編程中,類似的錯誤應該避免。
# include<stdio.h> int main(int argc,char *argv[]){ int *p, i = 2018; int example(int *); printf("%dn",example(&i)); } int example(int *p){ *p = 2019; return *p; } // 2019
上面的程式碼能夠順利通過編譯,且能正常執行,且在調用函數 example() 時, & 運算符不能省略。看完這段程式碼後,我猜肯定會有人問,函數定義時為何能直接使用「*p = 2019」這樣的語句進行賦值呢?
如果有這樣的疑問,那就對了,請繼續往下看:
# include<stdio.h> int main(int argc,char *argv[]){ int *p, i = 2019; p = &i; *p = 2016; printf("p = %d, i = %dn",*p,i); } // p = 2016, i = 2016
這段程式碼就比第一段程式碼多了一行,也就是將指針指向了具體的對象。就這樣,程式碼能通過編譯且能正常執行了。
通過對這三段程式碼的對比,我們會發現: 指針必須指向具體的對象。在函數定義時,指針類型的形參里的 * 聲明了這個形式參數是一個指針,在函數調用時,形參被具體化。調用函數時使用的 & 運算符指明了該指針具體指向的對象,並非未定義而直接使用。一個具有明確指向的指針通過間接定址的方式可以改變所指向對象的值(第三段程式碼中,i的值)。