日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言指针概述,C语言指针概述.doc

發布時間:2025/4/5 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。