指针常量的理解

指针常量的理解

今天在写项目代码的时候,遇到了一个给void* 类型的指针传参数问题,void* 类型指针可以指向任意类型,但是我在传参的时候不想再新创建一个变量,就想直接给void* 赋常数值,发现行不通,然后我又想到了之前学习过指针常量,可以把一个常量转换成为一个指针,这回应该可以吧,哈哈,可以!!运行,崩了,我擦嘞!!所以就开始仔细研究了一下指针常量这个东东,然后做个记录,如果以后忘了回来再看看哈哈

首先,指针常量,它的基础是常量,换句话说指针常量就是把一个常量(或者说数字)强制类型转换成为一个指针,例如把常量100,转换成为一个int类型的指针,它的写法是(int *)100,但是问题来了,转换完成以后,有什么意义,我要怎么用它,这里我们就需要知道指针是什么了,因为我们把一个常量转换成了指针嘛。

但是。。。。。。。

这里我们首先要知道内存和地址的概念,才能理解这个指针是什么,在《C和指针》这本书中,第六章的开头有详细的解释,书中这样说道:我们可以把计算机的内存看作是一条长街上的一排排房屋,每座房子都可以容纳数据,并通过一个房号来表识。

好了,那么也就是说,内存中的一块区域我们用地址来标识它(一般只标识头部的位置),在这块内存中,我们可以存放数据,但是如果你想要的使用这些数据,你需要通过地址(例如0x1442432)来找到他们,就像你想来我家,你得先知道我家在哪儿不是?。在内存中的每个位置由一个独一无二的地址标识,内存中的每个位置都包含一个值(书中说的,嘿嘿),但是如果你想使用一些内存中的数据,记住地址好像不太现实,也不太好记,所以我们日常使用的是变量名字,也就是给这个地址起个名字,例如一个在内存中的地址是0x32141234,这不好记啊,但是我起个名字,叫a,完美,这就好记了,你使用a,也就是从0x32141234这个地址开始访问数据,这就是为什么你在使用&(取地址符)时会得到a这个变量的地址,因为人家的庐山真面目就是一个地址

然后下来是关于数据的使用,内存中的数据的使用是通过类型来使用的,也就是说数据是一定的,它的结果取决于你如何使用它,换句话说就是你说它是什么,它就是什么(这个只是说类型,不是值),具体的转换是由编译器操作的,例如假设在一个字节的内存中有这么一串数据1111 1111,如果你使用它的时候是按unsigned char 类型使用的,那么他的值(十进制)是255,但是如果按照signed char类型使用,结果是-127,怎么样,是不是它是什么值由你说了算

好了,这回到指针了,指针名字也是一个地址的标记,其本质都是一样的,是地址,那么前面说的我把一个常量强制类型转换成了指针,也就是我把这个常量强制类型转换成了内存中的一个地址,这里该上代码了

#include <stdio.h>

int main(void)
{
	printf("%p\n",(int*)100);
	return 0;
}

这里,我把100强制类型转换为int类型的指针,那么此时它应该是一个地址,所以我用%p打印,结果如下:
在这里插入图片描述
可以看到结果为0x64,来人上计算机图
在这里插入图片描述
所以说,指针常量是将一个常量数字强制类型转换成了地址,这个时候访问这个指针常量就是在内存中“绝对”访问,老子就要看0x64内存开头,int类型长度的数据,按照int类型得出来的值,就这么刚,然而大部分操作系统或者程序是不允许这样访问的,这也解释了为什么可以编译,运行就崩。。。但是这种绝对访问在很多硬件访问中却很常见。

总结:
指针常量就是把一个常量强制类型转换为一个内存中的地址,访问的时候从此地址开始,按照所强制转换的类型使用数据,长度为类型的长度,是对内存的“绝对访问”,比较危险!!!

好了,就写到这儿吧,睡觉 zZ

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值