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