三、指針,指針
1.內存地址就是一個編號,這些編號都是連續的,稱作地址。編號對應的內存以字節為單位劃分。
2.內存地址的大小與數據總線的位數有關
3.內存訪問分為:直接訪問和間接訪問
①直接訪問:直接訪問內存單元中的內容
示例:
int a = 20 ;
對於直接訪問,a代表存放數據的內存單元,通過對a賦值或者取值,實現對內存的訪問
②間接訪問:通過內存單元編號(地址)以及數據所占字節數訪問內存中的數據
間接訪問在程序中隨處可見,通過指針實現內存的間接訪問
4.指針:就是地址。內存地址,我們習慣上把內存地址叫做指針。
5.地址:內存編號。內存地址可以簡稱為地址。“&”查看一個變量的內存地址。“%p”打印地址
6.關鍵符號:“&”取地址符
7.指針變量:存儲內存地址的變量
8.定義指針變量:需要在前面加*
此時 * 僅僅起到表示作用,告訴編譯器 p 一個存放 地址 的變量,p是一個指針變量
示例:
int a = 20;
int *p = &a;//(int *)p = &a;
9.取值符號 *
使用 * 號訪問內存編號裡面對應的內容
示例:
int a = 5;//定義一個整型
int *p = NULL;//定義一個指針變量,地址為空
p = &a;//獲取a的地址
printf(“%d”,*p);//*p獲取a中的內容
10.給指針變量賦值,意味著指針的重指向
11.指針的類型:
①因為內存地址只跟操作系統有關,所以指針變量所占的內存大小取決於操作位數(32位系統指針占4個字節,64位系統指針占8個字節)
示例:
int *p = NULL;
double *p1 = NULL;
float *p2 = NULL;
long *p3 = NULL;
char *p4 = NULL;
printf(“%lu\n”,sizeof(p));//8個字節
printf(“%lu\n”,sizeof(p1));//8個字節
printf(“%lu\n”,sizeof(p2));//8個字節
printf(“%lu\n”,sizeof(p3));//8個字節
printf(“%lu\n”,sizeof(p4));//8個字節
因為只要是地址,都是8個字節。地址字節數與數據類型無關,數據類型管控從哪開始取,取多少字節。
②int *p 整型指針 double *p 雙精度指針 char *p 字符指針
③不同類型的指針,訪問的內存大小不一樣
12.內存怎麼來的
①手動申請(malloc函數)
②系統分配(定義變量的內存空間都是系統分配的)
13.指針變量加減一個常數,指針本身不移動
14.指針變量自增自減,指針移動,地址發生變化。
15.指針類型一定要和指向內存中的數據類型一致。
16.補碼:①符號位不變②其他位取反③最後一位加1
17.數組名是一個符號地址常量,不是變量,所以不能自增、自減