C语言 -指针pointer 与解引用*

符号 * 的三种概念:
	a = a*b;  //乘法 *两边都是变量 ->乘法概念 √ 
	int *p ;//标识符 和 变量之间 => 申明概念 √ //申明了一个指针p
	*p =100; //指向概念 √ 

=========================

指针有三个值,最关系其中两个值 p和*p
 p:	指针p,存放的是a的地址  指向目标的地址
*p:	p指向目标的内容
(不常用)
&p:存放的也是地址,是指针的地址

在这里插入图片描述

理解:
	1. p本身存的是a的地址  地址没有大小概念 只有高低概念
 
 	2. 解引用 * 就像解开盒子的秘密一样 
 	盒子里面装的是a的操作地址 当我解密这个操作地址 我就找到a啦
 	
 	3.*p的操作其实就是对a的操作
 
	4. *&p = >&a; 
 

==============================

问题:
	1. 一个变量可能占有多个字节 指针指向哪?
			 32位系统 指针开辟4字节 
			 指针:指向的是首地址
	2. 首地址是哪个呢?	
	 		 默认指向低地址
	3. 既然都只存放4字节 那为什么会有double指针 int指针呢?
		解释:指针不存放double或者int类型 主要是以下能力 
			3-1.对指针的约束能力 :指针+1能力 不同类型+1能力不同
		    3-2.对类型的解释不同:如何去哪个部分解开这块内存 *p 
	4. 为什么指针是4个字节?
		内存中有9个通用寄存器:eax ebx ecx edx
							esp ebp esi edi eip 
					eip 地址寄存器:寄存代码的地址
		在32位操作系统里面 保护模式 地址寄存器 是32位bit位 
						从0x 00000000 - 0xFFFFFFFF;
		3232bit位 一个字节8bit位 所以32位只能拿4字节编址
			所以 指针是4个字节 
	5.地址线不是36?
		36条地址线  保护模式 只用了32条 访问32位 
					实模式 用了36条 此时可以访问64G						 	
int main(){
  	int ar[10] = {12,23,34,45,56,67};
	int *p = &ar[0];
	for(int i = 0;i<6;i++){
		printf("%x => %d \n",p,*p);
		p = p+1; 
	}
因为是int类型的指针 指针+1能力:所以数组内存每次+4 十六进制 
	62fde0 => 12	
	62fde4 => 23
	62fde8 => 34
	62fdec => 45
	62fdf0 => 56
	62fdf4 => 67

在这里插入图片描述

3-1 对指针的约束能力 :指针+1能力 理解: 
	type *p = NULL; //type可能是任何类型 
	p = p+n;
=>	p = p +sizeof(type) * n;
	// 如果是double 那就是 n = 8 每次移动8个字节 

3-2.对类型的解释不同: 理解

假设这里了有一块内存,存放如下地址
0001 0000 
0110 0000
0000 1100
0110 0000
0100 0000
0010 0000
0010 0001
0001 0001
0001 0100 
char *cp; char *ip; double *dp	
都存放首地址0001 0000 
 解引用*cp内存是	 
 	0001 0000
 解引用*ip的内存是
	0001 0000 
	0110 0000
	0000 1100
	0110 0000
解引用*dp的内存是
	0001 0000 
	0110 0000
	0000 1100
	0110 0000
	0100 0000
	0010 0000
	0010 0001
	0001 0001

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值