指針知識梳理8- 指針的指針
阿新 • • 發佈:2017-06-17
本質 tracking mar popu pri sizeof 理解 技術分享 b2c
指針的指針:
我們假定環境都是32位系統。
指針變量:是變量,本質是內存。這塊內存用來存儲地址。
指針的指針:依舊是指針變量,用來存儲地址。
在32位系統中,全部的指針變量,都是用來存儲地址。在32位系統中,地址位為32個2進制位,存儲地址用4個字節。
大家能夠驗證
sizeof(char*);
sizeof(int*);
sizeof(char**);
sizeof(char********);
我們假定環境都是32位系統。
1、回想指針變量基本概念
http://blog.csdn.net/xiaoliu0518/article/details/32707111指針變量:是變量,本質是內存。這塊內存用來存儲地址。
2、指針的指針
指針變量的地址:是變量。本質是內存。內存就有地址,存儲這個內存的地址依舊要用指針變量。指針的指針:依舊是指針變量,用來存儲地址。
指針變量定義基本模型:
type *p;
type a;
p 是一個指針變量,*前面的type 決定了通過p存儲的地址怎樣訪問內存。p能夠存儲a這樣的變量的內存。
(1)假設type 為int。那麽:
int *p;
int a;
p 存儲a的地址。*p的時候。從所存儲的地址開始訪問4個字節。依照int的數據組織方式。
(2)假設type 為char,那麽:
char *p;
char a;
p 存儲a的地址。*p的時候,從所存儲的地址開始訪問1個字節,依照char的數據組織方式。
(3)假設type 為char*,那麽:
char **P; //為了更好理解 ,能夠加個括號 (char*) *p;
char *a; // (int*) a;
p 存儲a的地址。*p的時候,從p存儲的地址開始訪問4個字節,這四個字節存儲的是地址。
(4)假設type 為char**,那麽:
char** *p;
char** a;
p 存儲a的地址,*p的時候,從p存儲的地址開始訪問4個字節,這四個字節存儲的是地址。
3、指針變量所占內存大小
註意當定義變量的時候一旦有一個 *。那麽這個變量就是個指針變量,能夠用type *p,這個模型去分析。在32位系統中,全部的指針變量,都是用來存儲地址。在32位系統中,地址位為32個2進制位,存儲地址用4個字節。
大家能夠驗證
sizeof(char*);
sizeof(int*);
sizeof(char**);
sizeof(char********);
4、綜合驗證
驗證例如以下代碼,並畫內存圖:#include <stdio.h> int main() { char c = ‘1‘; char *p; char **pp; char ***ppp; p = &c; //p 存儲c的地址,通過p能找到c pp = &p; //pp存儲p的地址,通過pp能找到p,通過p能找到c ppp = &pp; //ppp存儲pp的地址。通過ppp找到pp,通過pp找到p,通過p找到c printf("%p\n",ppp); printf("%p\n",&pp); printf("%p\n",pp); printf("%p\n",&p); printf("%p\n",p); printf("%p\n",&c); /* *p = c; *pp = p; *ppp = pp **pp = *(*pp) = *p = c; **ppp = *(*ppp) = *(pp) = p; ***ppp = *(**pp) = *p = c; */ /* 註意1: **pp 運行是一層一層往下找的。先*pp找到p,然後*p 找到c; 可以運行的前提是 變量pp存儲了變量p的地址,變量p存儲了a的地址,否則就會段錯誤。 註意2:pp = &&a;這樣的寫法是錯誤的: 初學常範的錯誤是理解是p = &a,那麽&a得到的是p: 這是錯誤的,&a得到是數據,數據存儲在變量p中,也可以存儲在p1中。 僅僅能對內存取地址。反應在代碼上是對變量取地址。而不能對數據取地址。 &a 是數據。不能對數據取地址。 */ return 0; }
指針知識梳理8- 指針的指針