【C语言笔记初级篇】第六章:指针入门
目錄
(1)指針是什么
(2)指針和指針類型
A:指針類型
B:指針類型的意義
(3)野指針
A:什么是野指針
B:野指針的起因
C:如何避免野指針
(4)指針運算
A:指針+-整數
B:指針-指針
C:指針的關系運算
(5)指針與數組
(6)二級指針
(1)指針是什么
第一:官方定義
在計算機科學中,指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向 (points to)存在電腦存儲器中另一個地方的值。由于通過地址能找到所需的變量單元,可以說,地址指向該變量單元。因此,將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。
第二:基本用法
第三:總結
總的來說:指針就是變量,而它是用來專門存放內存地址的變量。指針的大小在32位平臺是4個字節,在64位平臺是8個字節。
(2)指針和指針類型
A:指針類型
要保存相應類型變量的地址就要定義相應類型的指針
B:指針類型的意義
第一:看似無意義?
如下,對于一個整形變量,使用int* 指針和char*指針都能正確保存其內容,那么區分這么多類型是否就沒有意義呢
第二:實例說明
于是我們可以得知,指針類型決定了指針進行解引用操作時,能夠訪問的空間大小。比如char* 只能訪問1個字節,于是他只修改int的一部分。
同時,指針的類型決定了指針向前向后走一步能有多大距離(這個距離就是字節)
第三:指針與數組的關系的再說明
前面說過,數組名其實就是數組首元素的地址。所以數組名就直接可以賦值給指針。下面的數組中有10個元素,為int型數組,每一個元素4個字節,數組長40個字節。用指針可以將他們的元素全部變為1。為了驗證上面的說法,先定義int*的指針去操作
接著我們定義char*指針去操作int數組,看下是否和前面說的char*指針解引用時只能移動一個字節,同時這次我們用內存窗口觀察
(3)野指針
A:什么是野指針
野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)
B:野指針的起因
第一:指針沒有初始化
局部變量沒有初始化,會被設為默認值,但是指針沒有初始化會是一個隨機值
第二:指針越界訪問
上面數組和指針實例中,指針不能一直加到數組范圍之外,否則就成了一個野指針了
第三:指針指向的空間釋放
這一點在動態內存中會講到,下面的代碼運行結果正確,但是本質是錯誤的
C:如何避免野指針
1:指針初始化
指針在創建時,盡量初始化,讓其指向某一片地址。如果實在不知道指向什么,可以設置為空指針
?
2:小心指針越界
3:釋放指針指向的空間時,及時將指針置為NULL
4:使用指針之前堅持其有效性
(4)指針運算
A:指針+-整數
可以用來訪問數組
B:指針-指針
指針變量p1減p2的意義為:?
如果是正值?,?則表示在內存中p1比p2靠后
如果是負值?,?則表示?在內存中?p1比p2靠前
結果的數字表示?,?兩個地址在內存中間隔多少個指針類型的字節倍數?。
C:指針的關系運算
上述寫法是標準寫法,當然從運行角度上講也可以寫成下面這樣
?
從可讀性上講很好,但是這樣會導致最終比較時比較到數組前面去了,而C語言規定:允許指向數組元素的指針與指向數組最后一個元素后面的那個內存位置的指針比較,但是不允許與指向第一個元素之前的那個內存位置的指針進行比較
?
(5)指針與數組
指針與數組的基本關系前面已經敘述的很多了。這里主要說幾個案例
(6)二級指針
如下,p指針保存a變量的地址,pp指針保存p指針的地址。pp指針解引用的內容就是a的地址。
當然所涉及的操作依然是相似的
總結
以上是生活随笔為你收集整理的【C语言笔记初级篇】第六章:指针入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDoS攻防战(三):ip黑白名单防火墙
- 下一篇: Android大图片裁剪终极解决方案