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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针

發(fā)布時(shí)間:2024/1/23 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫在最前

作為在貴乎的第一篇文章吧... 允許我加點(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。