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