奇奇怪怪的指针用法总结

简单背景知识

左值:在赋值符号左边,代表内存中某个特定的存储位置

右值:在赋值符号右边,指定一个值

变量:定义一个名称代表某个存储位置,比如说把地址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。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值