A.指針變量和地址
??理解了內存和地址的關系,我們再回到C語?,在C語?中創建變量其實就是向內存申請空間,比如:
#include <stdio.h>
int main()
{int a = 10;return 0; }
? ?如,上述的代碼就是創建了整型變量a,內存中申請4個字節,?于存放整數10,其中每個字節都有地址,上圖中4個字節的地址分別是:
0x006FFD70
0x006FFD71
0x006FFD72
0x006FFD73
? 那我們如何能得到a的地址呢?這?就得學習?個操作符(&)-取地址操作符
#include <stdio.h>
int main()
{int a = 10;&a;//取出a的地址printf("%p\n", &a);return 0;}
? 按照我畫圖的例?,會打印處理:006FFD70,&a取出的是a所占4個字節中地址較?的字節的地址。

? 雖然整型變量占?4個字節,我們只要知道了第?個字節地址,順藤摸?訪問到4個字節的數據也是可?的。
B.指針變量
? 那我們通過取地址操作符(&)拿到的地址是?個數值,?如:0x006FFD70,這個數值有時候也是需要 存儲起來,?便后期再使?的,那我們把這樣的地址值存放在哪?呢?答案是:指針變量中。 ?如:
#include <stdio.h>
int main()
{int a = 10;int* pa = &a;//取出a的地址并存儲到指針變量pa中return 0;
}
? 指針變量也是?種變量,這種變量就是?來存放地址的,存放在指針變量中的值都會理解為地址。
C.如何拆解指針類型
??我們看到pa的類型是 int* ,我們該如何理解指針的類型呢?
int a = 10;
int * pa = &a;
? 這?pa左邊寫的是 int* , * 是在說明pa是指針變量,?前?的 int 是在說明pa指向的是整型(int) 類型的對象。
? 那如果有?個char類型的變量ch,ch的地址,要放在什么類型的指針變量中呢?
char ch = 'w';
pc = &ch;//pc 的類型怎么寫呢?
D.解引用操作符
? 我們將地址保存起來,未來是要使?的,那怎么使?呢?
? 在現實?活中,我們使?地址要找到?個房間,在房間?可以拿去或者存放物品。
? C語?中其實也是?樣的,我們只要拿到了地址(指針),就可以通過地址(指針)找到地址(指針)
? 指向的對象,這?必須學習?個操作符叫解引?操作符(*)。
#include <stdio.h>
int main()
{int a = 100;int* pa = &a;*pa = 0;return 0; }
? 上?代碼中第7?就使?了解引?操作符, *pa 的意思就是通過pa中存放的地址,找到指向的空間, *pa其實就是a變量了;所以*pa = 0,這個操作符是把a改成了0.
? 有同學肯定在想,這?如果?的就是把a改成0的話,寫成 a = 0; 不就完了,為啥?要使?指針呢?
? 其實這?是把a的修改交給了pa來操作,這樣對a的修改,就多了?種的途徑,寫代碼就會更加靈活,后期慢慢就能理解了。
E.指針變量的大小
? 前?的內容我們了解到,32位機器假設有32根地址總線,每根地址線出來的電信號轉換成數字信號后是1或者0,那我們把32根地址線產?的2進制序列當做?個地址,那么?個地址就是32個bit位,需要4個字節才能存儲。
? 如果指針變量是?來存放地址的,那么指針變的??就得是4個字節的空間才可以。
? 同理64位機器,假設有64根地址線,?個地址就是64個?進制位組成的?進制序列,存儲起來就需要8個字節的空間,指針變的??就是8個字節。
#include <stdio.h>
//指針變量的??取決于地址的??
//32位平臺下地址是32個bit位(即4個字節)
//64位平臺下地址是64個bit位(即8個字節)
int main()
{printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0; }
? 結論:
? 32位平臺下地址是32個bit位,指針變量??是4個字節
? 64位平臺下地址是64個bit位,指針變量??是8個字節
? 注意指針變量的??和類型是?關的,只要指針類型的變量,在相同的平臺下,??都是相同的。