1. 程式人生 > >指針知識梳理8- 指針的指針

指針知識梳理8- 指針的指針

本質 tracking mar popu pri sizeof 理解 技術分享 b2c

指針的指針:
我們假定環境都是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- 指針的指針