指標可以說是c語言的一大難點,很多人都比較討厭指標。我個人學習c語言也有一段時間了,今天就指標做一點總結。
在c語言中定義乙個簡單變數,例如int a = 4,這個時候,就會在記憶體空間中開闢乙個4個位元組大小的空間,並且給這個變數賦值為4。這裡的int可以換成float、double、long都可以,只不過型別不同,會占用不同大小的記憶體空間。
指標也是變數,大家一定要注意這一點,很多教科書上關於指標的說法都是不準確的。那麼既然指標也是變數,那麼指標與一般的變數有什麼區別呢?
其實很簡單,指標變數裡存放的是位址。指標變數用來存放位址這句話其實可以換一種說法,換成指標變數指向某乙個位址,這是一種比較形象的說法,這個更符合指標這一詞的含義。
既然指標也是變數,那麼它同樣也佔據一定大小的記憶體空間。指標佔據的大小與平台有關。對於32位的平台而言,指標變數一般占用4個位元組。對於64位的平台而言,指標變數一般占用8個位元組。
定義乙個指標:int *p;
int表明表明這個指標變數所指向的位址裡存放的是int型資料,也可以是char 、double、struct等。
*用來區別於簡單變數,表明這是乙個指標變數。
p表示這個指標變數名為p。
指標初始化,一般習慣於將指標初始化為空: p = null;
指標的賦值分為兩種情況:
直接複製:
int a = 4;
int *p = &a;
(這裡補充一下字串常量可以直接給char型指標賦值: char *t = "dasdadasd")
這樣指標p就指向了變數a的位址,這裡面&為取位址符,顧名思義就是獲得變數位址的。
指標之間的相符賦值:
int *t = p;
通過這種賦值指標變數p就指向了變數a的位址,與指標p的指向是相同的。
也就是我們常說的指標的指標。二級指標也不難理解。同樣它也是乙個指標,它與普通指標的區別在於,它所指向的位址中所存放的是指標而已,不再是其他型別的變數了。
定義乙個二級指標:char **p ;
這個就不多說了,很簡單通過*號就可以實現了,這裡就不多說了。
我們可以設想以下:如何我們讓乙個指標指向乙個陣列的首位址,那麼這樣是不是就能夠操作這整個陣列了呢?
這樣假設是可以理解的,因為我們都知道陣列在記憶體中是連續的,只要知道了首位址的位置就可以確定每乙個元素的位置了。
實際上,指標與陣列名在寫法上是完全等價的,但是這兩者在概念上還是有所區別。
例如:定義了乙個陣列 int a[100]; 這個時候陣列名a可以給乙個int型指標賦值,但是反過來就不行,因為這個陣列是經過完整定義過的,它在記憶體空間裡開闢100的連續的儲存單元,陣列的首位址a已經確定了,是不能再修改的。
但是還有一種情況,通過陣列名進行傳參,例如int a [ ]這種形式,這種寫法嚴格來說沒有定義陣列,它只是進行乙個宣告,陣列名a是可以接受指標賦值的。
由以上概念所引出來的概念:
陣列指標:就是指陣列名。
指標陣列:是乙個陣列,只不過每乙個陣列元素中存放的是乙個指標,陣列名是乙個二級指標。
可能會有人會問指標到底有什麼用?
指標可以直接操作記憶體,使得記憶體管理更加靈活。
指標可以解決傳遞引數的問題。
注:以上所提及到的記憶體空間均是指邏輯上的位址空間,計算機使用者一般不直接接觸真實的物理記憶體。
在對指標進行操作的時候,我們需要考慮清楚是改變指標的指向還是改變指標指向的內容。
如何理解c this指標
建立於成員函式開始執行前,執行完後清除,而且它只能在靜態成員函式中有用,其它函式呼叫不了this指標。指向物件的首位址 include include using namespace std class student void printstudent private char name 20 c...
如何理解指向指標的指標?
我在一篇教程中看到下面這段,它描述指向指標的指標是如何運作的。引用文章相關段落如下 int i 5,j 6,k 7 int ip1 i,ip2 j 現在我們可以這麼寫 int ipp ip1 那麼現在指標 ipp 指向了 ip1,ip1 指向了 i。ipp 就是 ip1,ipp 就是 i,或者說是 ...
如何理解指向指標的指標?
原文 我在一篇教程中看到下面這段,它描述指向指標的指標是如何運作的。引用文章相關段落如下 int i 5,j 6,k 7 int ip1 i,ip2 j 現在我們可以這麼寫 int ipp ip1 那麼現在指標 ipp 指向了 ip1,ip1 指向了 i。ipp 就是 ip1,ipp 就是 i,或者...