c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针
寫在最前
作為在貴乎的第一篇文章吧... 允許我加點(diǎn)廢話(求輕噴...
應(yīng)該是從19年的下半年開始,雖然頂著算法工程師的title,但做的很多事情都是開發(fā)了,然后19年12月跳槽之后,到了新的環(huán)境并開始專心做SLAM方向的事情,基本全部的時(shí)間都在做開發(fā)相關(guān)的事情,長時(shí)間使用ros和cpp,同時(shí)又入了cuda的坑,但整體來說節(jié)奏還算比較舒服的 (這難道就是傳說中的賤么 ...
就,長時(shí)間的悶頭開發(fā),但很多次發(fā)現(xiàn)一些基本基礎(chǔ)知識(shí)并不是很牢固,很多甚至都不清楚,然后還是覺得,工作歸工作,確實(shí)是需要找點(diǎn)時(shí)間精力去對(duì)一些東西做記錄、回溯,而這個(gè)過程中也能學(xué)到很多之前疏忽的東西,也很多次對(duì)之前的疑問有種豁然開朗的感覺,所以就慢慢習(xí)慣了...
這個(gè)筆記的話,其實(shí)我自己做了很久,很多東西都先放在公司內(nèi)網(wǎng)空間了,有些在OneNote(這個(gè)主要是master階段用的,各種花式上課面試刷題筆記啥的都往上放),而有些在印象筆記。
而在貴乎的話,還是會(huì)慢慢抽時(shí)間加點(diǎn)文章上去,肯定有自己總結(jié)學(xué)習(xí)不正確的地方,也希望大佬們花式留言批評(píng)... 當(dāng)然了如果能有幸?guī)偷揭恍┤?#xff0c;我也是很榮幸的
哦對(duì)了,關(guān)于標(biāo)題的話,會(huì)參照下述格式
【開發(fā)/算法/其他 筆記分類】- 【第一級(jí)范圍,比如cpp或者ros啥的】- 【第二級(jí)范圍,比如cpp中的指針或者ros中的CMakeList啥的】- 【第三級(jí)的序列號(hào)和具體內(nèi)容主題】
以上
正文ing
ok,圓規(guī)正轉(zhuǎn)。
其實(shí)要真正掌握指針(這話是不是說的有點(diǎn)大了..... 那改成學(xué)習(xí) 學(xué)習(xí)指針
腦子里需要有計(jì)算機(jī)內(nèi)存結(jié)構(gòu)的概念。在計(jì)算機(jī)語言中,任何的符號(hào)(變量、函數(shù)、指令等)都需要分配到其對(duì)應(yīng)的內(nèi)存區(qū)并按照一定格式存儲(chǔ),然后再進(jìn)行一系列的運(yùn)算等。
我們先來介紹關(guān)于指針的基本屬性,
- 指針屬于變量,和其他int/float/double等類型一樣,會(huì)占用內(nèi)存空間
- 指針變量既然被分配了空間,那其本身就會(huì)有自己的存儲(chǔ)地址
- 指針變量的值,也就是指針本身存儲(chǔ)的值,會(huì)被編譯器當(dāng)做是地址,而不是一般的數(shù)值
- 在32位的平臺(tái)里,由于指針變量的值是地址,因此指針會(huì)占據(jù)4個(gè)字節(jié)的長度
- 指針類型決定于定義的時(shí)候,比如,int *p 則表示指針p的類型是 int* (p.s. 從語法的角度看,你把指針聲明語句里的【指針名字】去掉,剩下的部分就是這個(gè)指針的類型)
- 指針指向的類型取決于其指向的那個(gè)內(nèi)存空間中的類型,比如,int *p 則表示該指針指向了int類型 (p.s. 從語法上看,把指針聲明語句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針?biāo)赶虻念愋?
- 符號(hào) * 的作用是取出指針指向其內(nèi)存地址中的內(nèi)容
當(dāng)然了,光看上述文字,一般都是看了就忘的...
下面用一個(gè)實(shí)際的例子來加深印象,也提供一個(gè)我自己在針對(duì)指針問題上常用的示意圖,
int b = 10; // 初始化整型變量 int *a; // 初始化指針 a = &b; // 將變量b所在的地址賦值給指針a然后附上一張內(nèi)存的演示圖,如下,
ok,現(xiàn)在結(jié)合這張圖來解釋上面的屬性介紹,
- int *a 定義了指針類型為 int*
- int *a 定義了該指針指向的是一個(gè)整型int
- a為指針的名稱,內(nèi)存中為a開辟了一個(gè)變量空間,如圖中a后面的方塊
- 內(nèi)存空間為整型b開辟一個(gè)空間,其地址為B,其值為10,如圖中b后面的方塊
- 指針a有其自己的地址,這里記做A,但此時(shí)地址A中的值不確定
- 根據(jù)表達(dá)式,將b的地址賦值給指針a,因此,指針a中的內(nèi)容,存放的是b的地址,即為B
- *a即可代表指向b變量,這樣的話,若*a = 12,則b的值也將會(huì)變?yōu)?2
相信結(jié)合這張圖,能夠?qū)χ羔樣幸粋€(gè)較為直觀的理解,其實(shí)基本上當(dāng)搞不清指針的問題時(shí),都可以借助上述類似的內(nèi)存圖來進(jìn)行分析,找到每個(gè)位置對(duì)應(yīng)的變量即可。
再舉個(gè)例子,引入一個(gè)稍微復(fù)雜點(diǎn)的雙指針,在上面的基礎(chǔ)上,
int **c; c = &a;大家很多都看到雙指針就有點(diǎn)懵了,但其實(shí)結(jié)合示意圖的話,會(huì)清晰不少,如下
- int **c 定義了指針類型為int **
- int **c 定義了該指針指向的類型為一個(gè)整型的指針,即int *
- &a 的操作得到指針a的地址,這里即為A
- c = &a 即實(shí)現(xiàn)將c指向a,所以c的值為a的地址A,即指向指針類型,另外c本身的地址是C
- *c == *(&a),即指向指針a,a中存儲(chǔ)整型b的地址
- **c == *(*(&a)),即指向整型b
- c ++,實(shí)現(xiàn)的是其存儲(chǔ)的值++,也就是地址A++,這個(gè)就改變了c的指向,指向a地址高處
- (*c) ++,實(shí)現(xiàn)的是a中存儲(chǔ)值++,也就是地址B++,這個(gè)就改變了a的指向了,指向了b地址的高處
- (**c) ++,實(shí)現(xiàn)的是b中的值++,也就是b == 11
p.s. 這里要說明一下,上述例子中指針和地址相關(guān)的++或者其他運(yùn)算符號(hào),和正常的運(yùn)算符操作不一樣,還要涉及到其本身的類型和其指向的類型等,這個(gè)部分在之后的章節(jié)中詳細(xì)介紹。
ok,關(guān)于這個(gè)部分,希望可以通過上述的兩個(gè)例子幫助了解什么是指針,包括指針的內(nèi)存模型,之后面對(duì)其他的指針相關(guān)問題的時(shí)候也可以借助類似的模型圖去解決。
最后ing
這個(gè)是我自己筆記中的關(guān)于指針的第一部分內(nèi)容,如果出現(xiàn)了一些錯(cuò)誤,也希望大佬們瘋狂指出,當(dāng)然也歡迎大家有興趣的可以留言討論
以上
總結(jié)
以上是生活随笔為你收集整理的c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aspen二元体系共沸组分_超详细 |
- 下一篇: 插件修复数据_APP 热修复都懂了,你会