指標的初級理解

2021-10-25 03:56:42 字數 2289 閱讀 6465

本文純屬個人筆記類,大佬可自行跳過

1.1想要了解指標,首先應該知道資料再記憶體中是怎麼儲存的。

記憶體分4類

第一類是**區,存放**。

第二類是全域性區,存放全域性變數,字串常量。

第三類是棧區,存放函式裡的變數,棧區很小,一般只有5m到10m。

第四類是堆區,記憶體最多,需要自己決定開闢多少記憶體,開闢什麼型別的記憶體,什麼時候開闢記憶體和什麼時候釋放記憶體。

**區全域性區

棧區堆區

說的簡單點,記憶體就像是乙個個小房間,資料進入小房間就是儲存,而這些房間分很多類,就像分別是旅店,汽車酒店,青年旅舍…而指標就是個標誌,比如說我住在旅店的1534號,那麼指標就是(旅店1534)//相對應的計算機語言就是int型別的指向位址為1534的指標。

繼續深入,學指標要先弄清,什麼是指標變數,什麼是位址。

指標變數就是告訴你這是乙個「門牌號」

而位址就是告訴你「門牌號上的內容」

char

*p;p=

&a;

char是基型別,相當於告訴你這是什麼酒店,是旅店還是汽車酒店。「 * 」就是告訴你這是乙個門牌,不是乙個其他東西哦。

總結一:在定義指標變數時必須指定基型別

1.2必須熟練掌握的兩個運算子:『&『和 』 * 『

&:取位址符,&a表示變數a的位址

*:指標運算子,*p表示指標變數p指向的物件。(要區分定義指標的 『 * 』和指標運算子的『 * 』)

所以引出乙個關鍵點

&

*p 與&a相同,是位址

*&p與a相同,是變數

還有乙個重要的觀念不要混淆

int *p是指定義了乙個指向整數資料的指標

1.3弄清楚上面兩點了之後,對於swap函式的原理也應該弄清楚了

swap函式**如下兩種:

第一種:

#include

#include

void

swap

(int

*a,int

*b)int

main()

第二種:

#include

#include

void

swap

(int

*a,int

*b)int

main()

一試便知,第一種是一種錯誤的方法。

造成這種錯誤的原因是,在c語言中實參變數和形參變數之間的資料傳遞是單向的「值傳遞」方式。用指標變數作引數時同樣要遵守這一原則。

什麼意思呢,就是你沒搞清在自定義函式裡的變化過程。

分析一波第一種的過程:

a和b分別表示儲存主函式中a和b的位址。

將他們轉換以後並不能影響實際中a和b的位址。

再進一步的分析第一種變化的過程:

a1 是指int型別指向某位址的指標,相當於旅店1234。b1 是值int型別指向某位址的指標,相當於旅店1587

那麼當它們傳到swap子函式的時候。a和b都是乙個指標,他們所指向的位址和a1,b1相同,那麼請問,a1和a 是同乙個東西嗎?你改變a可以等價於改變a1嗎?答案是否定的。所以你在swap交換的a和b所指向的位址,並不能改變a1和b1他們指向的位址。

而第二種是直接將其轉化的

仔細品,既然a和b是乙個與a1,b1數值相同的指標,那麼a 和 b所指向的內容和a1,b1所指向的內容是相同的吧!所以我就可以通過子函式中 a 和 b 來直接改變主函式中a和b的值。

什麼意思呢,相當於將a和b轉化為了全域性變數,眾所周知,全域性變數可以在自定義函式內自由變化操作。

更好的理解,位址就是乙個隱藏的全域性變數空間,只有用特定的鑰匙開啟這個隱藏的大門,才能為我所用,而這個鑰匙就是』 * 『符號。

所以但我們沒有定義乙個變數為全域性變數時,可以通過指標的方式讓它發揮出全域性變數的作用。

看到這裡,指標的最基礎的用法就已經掌握了,之後還有什麼陣列,函式,返回值,就先略過了,以後有需要再進行學習。

指標變數 初級

1.通過位址能找到所需的變數單元,位址指向該單元變數。2.乙個變數的位址稱為該變數的 指標 3.乙個變數專門存放另乙個變數位址 即指標 稱為 指標變數 4.定義指標變數一般形式 int pointer 1,pointer 2 int為基型別 指標變數可指向的變數型別。5.指標變數前面的 表示為該變數...

C初級 指標

2.2.指標定義和使用方式 3.拓展知識 4.例項 遞迴就是一層層的進行計算 例如 求 123 n 的值 int fun int n 2.1.記憶體位址和指標 2.1.2 指標說明 2.2.指標定義和使用方式 2.2.1 指標定義格式 int p 表示定義了乙個名為p的短整型指標變數2.2.2 針涉...

git初級理解

看了一天,大概了解git了,把思路大概寫一下。1.我使用的遠端是github。2.本地倉庫 先安裝git git init 把需要做的專案git add a elgg 然後git commit m 本次提交所做的改動描述 此時,elgg這個專案就加入了git 可以使用git ls files命令檢視...