任何的數據類型咱們均可以把它當成個模子,而後可成各類類型的數據;ide
任何模子都又其特定的大小。測試
int *p;指針
用sizeof測試下,sizeof(p) 或者sizeof(int)是4byte,因而能夠這樣定義:內存
一個int類型的模子在內存上刻出大小爲4字節的空間,而後把4個字節大小空間命名爲p。同時限定這4字節連續空間只能存儲某個內存地址,即便你存入別的任何數據,都將被當作地址處理,並且這個內存地址開始的連續4字節上只能存儲某個int數據。編譯器
咱們把p稱爲指針變量,p裏存儲的內存地址處的內存稱爲p指向的內存。it
int *p = NULL and *p = NULL編譯
第一個是初始化。初始的是什麼呢,就是將p自己的地址初始爲0.class
*p = NULL是將p指向的內容初始爲0.變量
double *p = NULL;
printf("%d\n",sizeof(p)); //始終是4byte,指針變量自己的空間
int *pt = NULL;
printf("%ox\n",pt); //經過編譯器查看pt的值爲ox
int i = 10;
int *pp = &i;
printf("%d\n",i);
*pp = NULL;
printf("%d",i); //最後i的值變爲0數據類型
再看:
int *p;
*p = NULL;
定義了一個指針變量p,可是p自己的地址鮮爲人知,也許就是非法的,做用後續的也可能會報錯。
改進:
int i = 20;
int *p = &i;
*p = NULL;
將數值存儲到指定的內存地址:
假設將數值0x100存儲到地址爲0x12ff7c上,那麼這個地址能夠這樣得來,:我能夠隨意定義個變量,好比int i;而後取地址,那麼這個地址確定是能夠訪問的。
int *p = (int *)0x12ff7c;
*p = 0x100;
也能夠這樣:*((int *)0x12ff7c) = 0x100;