指针知识梳理8- 指针的指针

指针的指针:
我们假定环境都是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;
}













  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值