C语言 -指针 与解引用*

符号 * 的三种概念:
	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;
        32位 32bit位 一个字节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个字节 

 

假设这里了有一块内存,存放如下地址
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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值