指針 & 地址的聯繫和區別

參考文章

C語言(完全理解指針和地址,完全!)數組

地址

地址是內存中每一個字節的編號。

假設現有一個 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 系統中,int4 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)

其餘同地址範例。

相關文章
相關標籤/搜索