#define value1 *(int*)46
我在头文件中遇到了类似的声明,用于微控制器的中断(寄存器)和外设的地址定义。
我如何解释它?
我们通过对类型进行类型转换并使用*运算符从中提取值来使46成为指针类型。因此,位置46的值必须存储在value1中。
会发生什么?
printf("%d",&value1)
这将x的地址返回为46。
printf("%d",value1)
这会产生运行时错误。当我们尝试访问x的值时,也会产生运行时错误。
以下是我的问题:
*(int *)46
究竟是什么意思?
什么是value1?整数指针或整数
对于像我这样的初学者,我们非常欢迎有关此指针或任何其他使用指针的方式的更多信息和额外评论。 提前谢谢。
答案 0 :(得分:10)
使用x = *(int*)46
,您从内存中读取sizeof int
个字节,从地址46开始。
使用*(int*)46 = x
,您将sizeof int
个字节写入内存,从地址46开始。
当然,此操作之前应该正确分配该内存块。
请注意,根据您的平台(底层硬件架构+指定的编译器),不能保证实际操作确实从给定的内存地址开始。
更具体地说,如果地址未与int
对齐(不能被sizeof int
整除)并且您的平台不支持未对齐的加载/存储操作,那么此类操作的结果将不会是你期待的。例如,您可能会收到“非法内存访问”异常,或者操作可能从距离int
最近的较小地址开始。
我应该强调的是,如果在此操作之前没有在该内存地址上正确分配int
块,那么C语言标准无法>强烈的>我之前提到的条件(地址的具体价值和使用的平台类型)。
编辑:
好的,我忘记了我在这个网站上正在处理的人。
很快就会删除这个答案,以免与SO律师发生麻烦。
下次我会写UB,所以这里的每个人都会感到满意(实际的问题仍然没有答案)......
答案 1 :(得分:6)
显式地将整数转换为指针,AND status in (1,2,3,4)
部分是C标准所称的“实现定义”,即它取决于您的特定平台,这里发生了什么。如果您的平台将(int*)46
定义为有效地址,端口号或其他任何内容,使用前面的46
取消引用它应该在该地址读取或写入。
如果您的平台不允许这样做,这可能会在执行时给您一个分段错误,即如果您在PC或类似设备上。这种平台可以保护您免受随机地址的限制,保护您自己和其他人的安全。
如果你碰巧为一个更受限制的环境(如嵌入式系统)编程,那么就没有这样的保护,事情就会出错。因此,C标准要求从任何整数值到指针值进行显式转换(转换)。通过这个你告诉编译器你知道你在做什么。
答案 2 :(得分:-1)
(int *)46表示取数字46并将其类型转换为int指针类型的地址。就像(int *)foo一样。现在你把它作为指向某事的指针说int * x;并且你希望在前面访问你使用另一个*的东西,所以* x意味着访问x指向的东西所以*(int *)foo意味着make foo是一个int *指针然后访问指针指向的东西。所以*(int *)46表示我想访问地址46处的东西。就像foo = 46; *(int *)foo;意思是同样的事情。尽管编译器可以优化对该地址的实际访问,但没有易失性,因此如果这指向硬件外设控制寄存器,则可能无法按预期工作。
答案 3 :(得分:-2)
\r\n
表示假装 46是指向int值的指针,并查看(伪)指针指向的int值。几乎在所有情况下都不会做任何有用的事情。