*(int*)在C中是什么意思

What does *(int *) mean in C

本文关键字:是什么 意思 int      更新时间:2023-10-16
#define value1 *(int*)46

我在微控制器的中断(寄存器(和外围设备的地址定义的头文件中看到了类似的语句。

我如何解读它?

我们通过对46进行类型转换并使用*运算符从中提取值,使其成为指针类型。因此,位置46处的值必须存储在value1中。

会发生什么?

printf("%d",&value1)

这将x的地址返回为46。

printf("%d",value1)

这会产生运行时错误。当我们试图访问x.的值时,也会导致运行时错误

以下是我的问题:

  1. *(int *)46究竟是什么意思?

  2. 什么是价值1?整数指针或整数

对于像我这样的初学者来说,任何关于这个或任何其他使用指针的方式的更多信息和额外评论都是最受欢迎的。提前谢谢。

使用x = *(int*)46,从地址46开始从内存读取sizeof int字节。

使用*(int*)46 = x,您正在将sizeof int字节写入内存,从地址46开始。

当然,这个操作之前应该适当地分配该内存块。


请注意,根据您的平台(底层硬件架构+指定编译器(,不能保证实际操作确实会在给定的内存地址开始。

更具体地说,如果地址没有与int对齐(不能被sizeof int整除(,并且您的平台不支持未对齐的加载/存储操作,那么这种操作的结果将不是您所期望的。例如,您可能会遇到"非法内存访问"异常,或者操作可能从与int对齐的最近的较小地址开始。


我可能应该强调的是,如果int的块在该操作之前没有正确分配到该内存地址,那么无论我提到的先前条件(地址的特定值和使用的平台类型(如何,C语言标准都会定义该操作的结果。


编辑:

好吧,我忘了我在这个网站上和谁打交道了。

为了不惹SO律师的麻烦,我会很快删除这个答案。

我下次只会写UB,所以这里的每个人都会感到满意(实际问题仍然没有答案(。。。

显式地将整数转换为指针,即(int*)46部分,是C标准所称的"实现定义",也就是说,它取决于您的特定平台。如果您的平台将46定义为有效地址、端口号或其他什么,则用前面的*取消引用应该在该地址读取或写入。

如果您的平台不允许这样做,这可能会在执行时给您带来分段错误,即如果您在PC或类似设备上。为了你自己和其他人的安全,这种平台可以保护你不在随机地址写作。

如果你碰巧为一个更受限制的环境(如嵌入式系统(编程,就不会有这样的保护,事情可能会出错。因此,C标准要求从任何整数值到指针值的显式转换(强制转换(。这样你就告诉编译器你知道自己在做什么。

(int*(46表示取数字46并将其类型转换为int指针类型的地址。就像(int*(foo所做的那样。现在你把它作为一个指针,指向一些东西,比如int*x;如果你想访问这个东西,你在前面用另一个*,那么*x意味着访问x指向的东西,所以*(int*(foo意味着让foo成为一个int*指针,然后访问指针指向的东西。所以*(int*(46意味着我想访问地址46的东西。就像foo=46*(int*(foo;意思是一样的。如果没有volatile,编译器可以优化对该地址的实际访问,因此如果它指向硬件外围控制寄存器,它可能无法按预期工作。

#define value1 *(int*)46的意思是假设46是一个指向int值的指针,并查看(伪(指针指向的int值。在几乎所有情况下,这都没有任何用处。