地址是內存中每一個字節的編號。
假設現有一個 4G
容量的內存,換算成字節爲:函數
4G = 4 * 1024 * 1024 * 1024 = 4294967296 Byte
因爲地址是從 0 開始算的,因此其可以表示的範圍(十進制)爲 0 - 4294967295
。.net
在計算機領域內不會使用10進制,而是使用二進制,範圍爲:指針
0000 0000 0000 0000 0000 0000 0000 0000 <-> 1111 1111 1111 1111 1111 1111 1111 1111
爲何用如上的方式表示呢??而不是用 0 - 1111 1111 1111 1111 1111 1111 1111 1111
來表示呢??實際這麼作也是能夠的!不過最好推薦是使用如上的方式表示,爲何這麼推薦呢??例如如今有一個 1000 人蔘賽的賽場,須要對參賽的 1000 人分配編號,你會怎麼分配??是使用 0 - 999
進行分配仍是使用 000 - 999
進行分配??確定是使用 000 - 999
進行分配吧,同理可得。code
但顯然使用二進制的方式表示足足有 32bit
的長度!!太長了,因此人們實際上使用的是16進制來表示地址!範圍是:blog
0x00000000 <-> 0xFFFFFFFF
指針是保存地址的變量
地址能夠保存在指針中;指針僅保存地址。內存
地址是字節編號,是一串 16進制 數字;指針是保存地址的變量。get
int a[3] = {1 , 2 , 3}; // 因爲 a 變量存在 main 函數內 // 因此是存儲在 棧區 的局部變量 // 在函數調用完畢後會被釋放(取消內存佔用, // 該片內存區域可被任意修改) // 程序結束時被 os 回收 // 下次調用時,棧會被重建,因此變量 // 對應的內存地址也會發生變化 // 因此,這邊僅展現某一次運行時的結果 // 如下結果是某次運行時的結果. printf("&a[0] = %p\n" , &a[0]); // 000000218F4FF768 printf("&a[1] = %p\n" , &a[1]); // 000000218F4FF76C printf("&a[2] = %p\n" , &a[2]); // 000000218F4FF770
從這邊能夠發現數組相鄰元素地址相差 4
,經過上述對地址的認知後,能夠理解:it
地址表示的是內存字節的編號。&a[0]
表示的是 數組a
第一個元素第一個字節的編號 000000218F4FF768
,&a[1]
是數組a
第二個元素第一個字節的編號 000000218F4FF76C
,他們相差 4
。變量
爲何是相差 4
呢??這個是 4
有什麼含義嗎??
咱們都知道不管是 32bit/64bit
系統中,int
佔 4 Byte
,而地址表示的字節編號,因此有:
a[0] 第一個字節編號 000000218F4FF768 a[0] 第二個字節編號 000000218F4FF769 a[0] 第三個字節編號 000000218F4FF76A a[0] 第四個字節編號 000000218F4FF76B a[1] 第一個字節編號 000000218F4FF76C a[1] 第二個字節編號 000000218F4FF76D a[1] 第三個字節編號 000000218F4FF76E a[1] 第四個字節編號 000000218F4FF76F
由上可知他們必然會相差 4
,這個相差 4 沒有什麼特別的含義,就是在編號上相差 4 的意思。
int a[3] = {1 , 2 , 3}; int *p_a = a; printf("p_a + 0 = %p\n" , p_a); // 000000218F4FF768 printf("p_a + 1 = %p\n" , p_a); // 000000218F4FF76C printf("p_a + 2 = %p\n" , p_a); // 000000218F4FF770
這邊要理解下指針運算,p_a + 0
,在地址體現上是 p_a + 0 * sizeof(int)
。
其餘同地址範例。