c语言指针概述,C语言指针概述.doc
首先,我們來看一看指針有什么用?
講道理的話,如果你到目前沒有發現指針有什么用,那就不用,挺好的。
你看C++程序員做個軟件也基本不會把C++的語言特性都用上是吧。你有數組,有結構體,有函數,什么事情做不成呢?
是吧。直到有一天,你遇見了這樣一個問題:試編寫一個函數swap(x, y)使得其能夠交換x和y兩個變量的值這個……
很簡單嘛。我開始寫:
void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
然后你調用一下,發現……咦,怎么沒用。
啊啊啊啊啊!好難過好難過,怎么回事?
你上網求助,發現大神們告訴你要用指針寫,像這樣:
void swap(int * x, int * y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
然后調用的時候swap(&a, &b);就行了。
哇啊啊啊好神奇!
于是,指針的第一個用處出來了:它能使得函數有能力交換兩個變量的值。
怎么做到的呢?我們來看看。
我相信你已經知道了,每一個變量都有屬于自己的一塊空間,那這塊空間在哪里呢?
答案是:內存,哦不!準確一點說是虛擬內存 (Virtual Memory) 里。
那計算機怎么知道我要找的是變量b的空間而不是a的空間呢?
是因為每一個變量所屬的空間都有一個惟一的地址,計算機只要通過這個“地址”,就可以找到里面的值了。
這種根據一個地址就能直接訪問到一塊內存空間的方式,我們叫做隨機讀取。
具體它是如何做到的,可以去看看Charles Petzold的《編碼》一書,里面甚至從最基本的電路一步一步講起,構造一臺最基本的計算設備。
還有一個問題是,如果我的變量占有多個空間(字節),但是一個地址只能對應一個空間,那我們又有兩個問題:如果我們要用一個地址代表整個變量所占的內存空間(假設4個字節),我這四個空間是從前向后排還是從后向前排?比方說我變量的值是AE 01 08 82,那我在內存里從前向后的排序到底是82 08 01 AE還是AE 01 08 82?我怎么知道我叫這個名字的變量占幾個空間?第一個問題顯然又是信仰之爭。所謂從前向后的,我們叫做大端序 (big-endian);另一種,我們叫做小端序 (little-endian),大端序與小端序的轉換在網絡傳輸的時候會用到,Intel的CPU大多采用的都是小端序。
而第二個問題,由于C里每個變量都有自己的類型,所以編譯器會根據不同類型的各自尺寸生成相應的代碼。說這么多干什么呢?
只是為了讓你更好地明白,你在程序里定義的變量乃至函數代碼,全都是存儲在隨機存儲器(內存)里的。
每個變量都有自己的起始地址,即屬于自己的一塊位置。那指針是什么呢?指針當然也是變量咯,指針也跟其他類型的變量一樣,有自己的一塊空間,空間里的二進制位構成了一個值。
這個值可以是任意的,你甚至可以把它當作整數來用。(沒記錯的話,指針的本質類型應該是unsigned long。即無符號的長整形數據)
而指針跟其它變量類型的根本性不同在于,它有一個取值的運算符,即*符號。
因為它可以取值,所以指針類型的變量就不僅可以有自己的值,也可以“操縱”其它變量的值了。
無論是多么復雜的指針,本質上它們的存在都跟這個*操作有關。回到我們開始說的那個swap函數。
為什么第一種寫法無法達成交換兩個變量值的效果?
原因跟指針無關,跟函數參數的傳遞方式相關。原因可以用一句話來解釋:你的swap函數里出現的x和y,跟你傳參數進去時候的a和b,根本沒有指向同樣的內存地址。
當函數調用的時候,a和b被復制了一份給了x和y變量。
你在swap函數里對x和y進行的所有操作,都是對這兩塊新的內存地址里的值進行操作,影響不到a和b的內容。你不是沒有交換東西,只是被交換了的x和y在swap函數調用結束之后空間就被回收了而已。(回收的概念如果不懂得會可以理解為銷毀)
這種“把傳進去的參數復制一份”的方式叫做值傳遞。
而在其他一些語言比如C++或者Visual Basic里面,還存在一種傳參數的方式叫引用傳遞,即函數里面的參數和傳進去的參數,指向同樣的內存地址。(引用的傳遞是在C++;里面有的,純C語言沒有)
在純C里面,我們不存在引用傳遞,因此要模擬引用傳遞的效果,只能用指針來實現。
第二個函數調用的方法有點不太一樣,是swap(&a, &b),比起上一個版本多了&符號。這個符號的意思是“取地址”,函數的形式參數是兩個指針,在調用的時候本質上也是值傳遞,只不過這次復制的不是a和b的值,而是a和b的地址。
在函數內部,我的x和y兩個指針也是兩塊獨立的空間,有各自的內存地址。
只是它們的值對應了a和b兩個變量的地址,所以我用*操作,就可以完成“操控
總結
以上是生活随笔為你收集整理的c语言指针概述,C语言指针概述.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印度语中的lata是什么?
- 下一篇: 从74年当兵认识到现在相聚在一起叫什么?