指针
1.什么是指针
const int a;
其中,const
是起到修饰的作用,就算没有const
,a
依然是整形变量
int* p;
同理,int
也是作为一种修饰,真正将p
定义为指针的是*
int
是修饰地址储存的类型,
*
是地址运算符
,为的是将后面的变量变为地址,
p
是指针
就像int
是整形,a
是变量一个道理
p
只是一种特殊的变量,叫指针,他只能存地址
比如服装大楼,int
代表服装,表示我这个大楼是卖服装的,p
是大楼
2.* 地址 使用过程详情
1. 地址
0X 0012ff60
其中,0X
代表16进制,16进制的[两个位](【】 【】 )等于2进制的[8个位](【】 【】 【】 【】 【】 【】 【】 【】),2进制的8个位等于1个字节
2.运算过程
int *p;
p=&a;
(1). P=0x 0012FF60
(a的地址)
(2). 指针p储存的数据为 [60] [ff] [12] [00]
(3). 地址为
地址 | 内存 |
---|---|
0x0014f367 | [60] |
0x0014f368 | [ ff ] |
0x0014f369 | [12] |
0x0014f36A | [00] |
3. int* 与 int**
void*
0x0012FF60
没有储类型的时候
int*
0x0012FF60
地址储存int类型时候
int**
0x0014f367
说明这个地址的内存存储的是一个地址(0x0012FF60
)
3. 解引用运算
*0x0014f367
解引用就是使用内存
运算过程
1.去星解引用
*0x0014f367
(char *) 解引用,在这个类型的基础上,去掉一个星
0x0014f367
(char) 要访问的内存 的访问规则为char
2.赋值给变量
int a=10;
0x0012ff60
int * [0A] [00] [00] [00]
p = &a;
c = * p;
所以,c = * 0x0012ff60
(int *) 解引用,访问规则是int,所以4个字节
所以,c = [0A] [00] [00] [00]
3.常量强转为地址
0x008ff8f0
的10进制数字为9435376
* (int *)9435376=100;
其中,(int *)是将后面的变量强转
为地址
第一个 * 是将地址解引用
9435376
指针不参与任何解引用
4.常见错误
如果不将a初始化
,而直接使用地址指针
访问a的内存,并赋值
,程序依然会报错
因为不正规,用地址访问到a的内存只是一个意外,但是查看a的内存,会发现数据已经被赋值。