如何理解指標

2022-05-25 01:51:11 字數 2425 閱讀 3001

指標可以說是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,或者...