指標實際是乙個變數,只不過這個變數是存的位址,我們通過這個變數可以找到以它為位址的記憶體單元。
1bit 就是乙個二進位制位
1byte = 8bit
實際上是**於ascii碼表,需要表示最少128個字元,所以要用8個bit位來表示。
位址存放東西的時候也要以位元組為最小單位。
32位位址中,指標需要4個位元組。64位指標為8個位元組。
指標型別是決定訪問時取幾個位元組位址空間。
我們檢視記憶體發現:
int型別儲存時,占用4個位址。
char型別儲存時,占用乙個位元組位址空間。
67305980 高位 低位
對應的二進位制序列為 00000100 00000011 00000010 00000001
這裡我們定義了乙個char型別的陣列。但是通過int型別指標訪問時,直接在記憶體中取了4個位址空間大小。char應該取1個位址空間大小。
指標訪問時取4個位址空間:
低位址 高位址
01 02 03 04
00000001 000000010 00000011 00000100
記憶體中這麼存,所以這個是小端機
低位址存低位,高位址存的高位。(小端機)
低位址存高位,高位址存的低位。(大端機)
訪問陣列就是通過訪問陣列的頭指標,實現對陣列的訪問。
arr 位址和 &arr[0]相同
一級指標:
通常我們可以通過一級指標實現資料的交換,我們在通過swap(a,b)函式交換ab 的值的時候,傳位址才能完成交換。
不傳位址情況下交換,實際上是重新開闢了一段位址,複製了a的值和b的值,然後對這個空間的a,b進行交換。執行完成後,臨時拷貝的位址空間釋放,最後返回原來位址,但是原來的位址裡面存放的a,b並沒有交換,所以我們要通過傳遞指標,來完成對當前位址進行交換。
我們來檢視一下位址,來了解這個過程。
二級指標通常用法:
我最開始學的時候也不理解,因為通過一級指標就能完成資料的更新,為什麼還要二級指標的,學到鍊錶的時候,我通過檢視記憶體發現,當對鍊錶實行資料修改時,也就是要改變當前指標的指向,我們直接傳遞指標的話,也是臨時拷貝了指標,放到乙個新的空間下面,對這個空間的指標進行修改,但是原來存放指標的位址空間的指標指向並沒有改變,所以必須通過二級指標完成對當前指標的位址的更新,才能實現對鍊錶的更新。這裡有乙個特殊點,就是尾部插入時,一級指標就可以完成交換,因為新拷貝的指標,指向的位址空間還是原來的位置,我們通過這位置訪問到當前位址的下乙個指標時,是確確實實的訪問,而不是臨時拷貝。
舉個例子,原指標相當於一把鑰匙,我們重新開闢乙個位址空間,存當前的指標,相當於配了一把鑰匙,我們對配的鑰匙進行改裝時,原來的要是還是可以開門啊。
但是某個位置插入時,相當於我們用配的鑰匙進門去拿東西,拿完我們把鑰匙銷毀,但是我們用原來的鑰匙進門後,發現東西確實動了。
這篇是我在實現鍊錶時的部落格裡面有詳細的記憶體除錯
指標的理解1
include include include using namespace std tchar test2 tchar tchar int main void 返回臨時變數位址的問題?tchar test2 tchar str1,tchar str2 warning c4172 返回區域性變數或...
c語言函式指標的理解與使用
c語言函式指標的理解與使用 1.函式指標的定義 顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。看例子 a char fun1 char p1,char p2 b char fun2 char p1,char p2 c char fun3 char p1,char p2 看看上面三個表...
c語言函式指標的理解與使用
1.函式指標的定義 顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。看例子 a char fun1 char p1,char p2 b char fun2 char p1,char p2 c char fun3 char p1,char p2 看看上面三個表示式分別是什麼意思?c 這很...