简单背景知识
左值:在赋值符号左边,代表内存中某个特定的存储位置
右值:在赋值符号右边,指定一个值
变量:定义一个名称代表某个存储位置,比如说把地址100,取个名字叫a。
类型:将变量的值(数据)描述成某种类型。如 int a,表示一个内存空间,这个空间用来存放一个整数(int),占据四个字节(看系统定义);
NULL指针:一个特殊的指针变量,表示不指向任何东西。通常设置为( 就你济南济南济南济南济南济南济南济南就 oid *)0,指向零地址的位置。
间接访问=解引用
int a = 112;
int c;
int *p= &a;
*p = 1; //间接访问a,并将a的值修改成1
c = *p;
指针常量,就是一个内存地址。
指针变量,表示一个内存空间,这个空间用来存放一个指针(地址),这个指针指向一个存放指定类型的空间。
(类型 *),如(int *)0,将0地址看成int型的一段空间,加上类型说明以什么类型去访问这个地址而已。
指针变量的内容是指向的地址。
int a = 1
int *p=NULL;
p=&a;//正确,将a变量所在的地址赋给指针变量p
p=a;//非法,相当于将a的内容赋值给指针变量,p指向了地址为112的空间,非法访问;
(void *)0; //指针常量
奇奇怪怪的指针解释
假设a的存储地址是100,
int a; //a的地址是100
a=25; (1)
*(100)=25; (2)
*(int*)100= 25; (3)
*&a = 25; (4)
(void *)0 (5)
(int *)a; (6)
(int *)&a; (7)
*(int *)a; (8)
(int)&a; (9)
(1)将a赋值为25
(2)非法操作,看起来是将a赋值为25。*作用的类型是指针类型,但100是整形,故非法,如int *p = &a; *p=1; p为一个指针变量。
(3)将100强制转换成(int *)类型的指针 ,这时候可以把100看成int型的指针常量(100所代表的空间,取值解释成整形,所以要带类型)对这个指针常量进行解引用,赋值为25(往指定地址写入内容)。由此看出,我们想访问特定地址可以这么做,
int *p=NULL;
p=(int *)100;
(4)&a,取出a的地址,这是个指针常量;*(&a),对这个指针常量进行解引用,赋值为25。
(5)指针常量,将0强制转换成void型指针,其实就是代表内存中的0地址。加上类型说明以什么类型去访问这个地址而已。
(6)取a地址处的数据,并转为int型的指针。 (int *)25。
(7)取a的地址,将a的地址转换成int类型的指针变量。
(8)将a的值强转成地址,然后读取该地址所指的整数。
(9)将a的地址强制转换成int型。
指针的指针
还是一个指针变量,存储的是指向变量的地址
int a;
int *b = &a;
int **c = &b; //指针的指针
1.首先*操作符具有从右向左的结合性,可以看作*(*c)。
2.*c访问的是c指向位置的内容,也就是b的地址。
3.*(*c)相当于*(b),访问的是b指向地址的内容,也就是变量a。