【摘要】文章從C語言指針的基本概念入手,引出C語言指針、指針變量等多個知識點。并對程序中應用C語言指針中較常出現的幾個錯誤進行分析講解。
【關鍵詞】C語言? 指針? 內存
0引言
指針的英文是pointer,是C語言中一個非常重要甚至可以說是C語言的精髓,是C語言的一個重要標識,提到C語言,我們就會想到指針。指針是C語言受歡迎的一個重要原因,C語言也是目前非常流行的計算機程序語言。指針和數組、函數等之間數據的交互有著非常重要的關聯。在一些特殊情形下,只能用指針才能完成相應的運算,同時,指針提高了代碼運行的效率。
同時,指針又是C語言中最為復雜難學的知識點之一,若對指針的要點混淆不清,濫用或者誤用指針,將會減少程序的可讀性;錯誤運用的話,將會使程序編譯出錯甚至崩潰。
1指針
根據C語言教程中提高的馮諾依曼理論,C語言程序代碼編譯運行的時候是要寫入內存單元。要想完全掌握指針的話,首先要理解內存的概念,這其中包括:內存單元、地址等概念。這里面提到的內存是由很多空間大小相同的存儲單元組成。我們可以形象的將計算機的內存設定成一個街道上的一間間相鄰的門面,每間門面都有唯一的門牌號碼來標識來區分。C語言中,變量的值存儲在計算機的內存中,每個變量都對應占據一個 的位置。每個內存位置都是有地址唯一確定并引用的,就好像街道上門面房都是由它們的門牌一樣。指針實際上是地址的另一個名稱。C語言提供了一部分操作符,通過這些操作符,能夠得到變量的地址,還可以經過指針變量直接得到它所指向的值。
由int類型變量的值為整數,char類型變量的值為字符,我們能夠想到,指針從本質上看,指針是一個值為內存地址的變量,或者說指針變量的值是地址。
2指針變量
這里我們先聲明一個指向整型變量的指針的語句:“int *p;”,p是一個指針,這個好理解,p只不過是一個變量而已,與我們知道的整型變量、字符型變量等并沒有什么區別。我們使用“int *p”聲明一個指針變量,實質上是在內存中聲明一個一段寬度的內存空間,并將其命名為p。p和整型變量、字符型變量等沒有實質區別。我們還有這樣的語句:“p=&i;”, &叫做取地址符,就是返回變量i的地址編號。或者說,整句的含義就是將i的地址的編號賦值給p,即在p中寫上了i的地址編號,假設i的地址編號是6,變量i的值是30。
執行完p=&i之后,在內存中,p的值是6,這里的6就是變量i的地址編號,p就指向了變量i。因此,我們稱p為指針,我們這里要記住,指針變量的存儲的內容就是內存的地址編號。我們這里又有如下語句:“printf(”%d”,*p);”,我們這里可以這樣去讀它:p的內容所指的地址的內容,或者形象的理解成p門牌號碼上所對應的房子。P的內容是6,也可以說p指向內存編號為6 的地址。*p就是它所指地址的內容,即地址編外為6上的內容了,就是30這個內容了。所以運行程序,在屏幕上就會打印輸出30。我們可以將“printf(”%d”,*p);”理解成“printf(”%d”,i);”這樣就不難理解指針變量這個概念了。
3指針的作用
指針到底有什么作用呢?指針能夠間接訪問變量,也可以提升代碼的訪問效率,還能夠實現動態內存分配等。C語言編譯器在編譯的時候,代碼中的變量、函數等都要對其分配內存,因此,程序代碼一旦開始運行了,就會直接找到對應的內存單元和地址。C語言中的指針,實質上就是對底層內存單元的操作。
指針能夠通過間接訪問這個特性來解決這些問題。舉例子,在函數間是不可以共享數據的,但是有了指針后,就能夠間接用到函數之外的數據,即將數據的地址傳遞到函數中就可以了。
使用指針,能夠讓開發者在底層或者抽象層與內存進行打交道,更加高效直接。能夠化解很多直接訪問無法完成的操作。比如:像函數直接的數據分享、返回值不可以是相同的的一個值以上等很多問題。還有后面要學到的對文件的操作就離不開指針的應用。
使用指針能夠將邏輯關系上有聯系的數據、函數關聯起來。例如,后面要學到的 鏈表內容中,存儲不連續的數據但在邏輯上有關系的,就要用到指針的內容。
4總結
C語言的指針,使用起來非常靈活,在實際運用中變化很多。對于初學者來說,有點難度,但對于完全掌握C語言指針的人來說,就能夠將指針運用到實際的應用中,寫出優秀的程序代碼,實現很多其他計算機語言無法實現的功能。指針的學習要不斷理解和實踐,不斷的去挖掘其精髓,從而完全掌握C語言的精髓。
參考文獻:
[1]Stephen Prata, C Primer Plus(第6版)中文版[M].北京:人民郵電出版社, 2016.4.
[2]譚浩強,C 語言設計[M].北京:清華大學出版社,2000.[3]GregPerry.寫給大家看的C語言書[M].人民郵電出版社,2010.
作者簡介:宋志飛(1985-),漢族,男,安徽太湖人,講師,碩士研究生,主要從事蟻群算法及應用、計算機軟件及應用、職業教育等方面的研究。