int num = *(int *)number;这是做啥的?
Posted
技术标签:
【中文标题】int num = *(int *)number;这是做啥的?【英文标题】:int num = *(int *)number; What does this do?int num = *(int *)number;这是做什么的? 【发布时间】:2010-11-13 00:45:12 【问题描述】:我在看一些 c++ 代码,我看到了这个:
int num = *(int *)number;
我以前从未见过这个? 它在一个这样标记的函数中:
void *customer(void *number)
那还能做什么?有什么不同的方式来展示这个吗?
谢谢,这不是作业顺便说一句,我只是对它的作用感到困惑?
【问题讨论】:
【参考方案1】:(int *) 部分将变量 number 转换为指向 int 的指针,然后前面的 * 将其取消引用为 int。
【讨论】:
+1 @Charles 是的,基本上 num 现在将保存该数字指向的值的副本。 值得补充的是:在转换 FROM void 指针时,我们需要使用转换运算符。这就是使用 (int *) 将 'number' 转换为 void 指针的原因到一个 int。并且 * 进一步将此指针指向一个 int 以返回一个 int。【参考方案2】:该函数采用void*
,但不知何故,它知道(可能在某些文档中需要它)它给出的指针实际上指向int
。
所以,(int*)number
是“原始指针,转换为 int*
,以便我可以从中读取 int
”,*(int*)number
是它指向的 int 值。
【讨论】:
【参考方案3】:正确答案已经在这里了,但我能告诉你一个在我不得不大量使用 C 时通常对我有帮助的技巧吗?
这就是你在脑海中发音“*”的方式 - 有两个部分。
常见的部分是当它是类型的一部分时——每个人读到它时可能都会说“指针”,这很好。所以 (int *) 是一个 int 指针——或者我什至会在脑海中反转它来阅读“指向 int 的指针”,这似乎有点帮助。
对我有很大帮助的是,每当您在代码中看到 * 时——将其读作“所指向的内容”。
如果你遵循这个模式,那么:
int num = *(int *)number;
是一个整数变量“num”被赋值:int 指针所指向的数字,数字。它只是自己翻译。
有时你不得不稍微弄乱一下措辞,但自从我养成了这个习惯后,我在阅读指针代码时就再也没有遇到过大问题了。
我相信我也将 & 读作 C 中的“地址”,但如果我没记错的话,我认为它在 C++ 中被重载了。
【讨论】:
【参考方案4】:我假设customer
是这样使用的:
int lookup = 123;
customer_key *key = customer(&lookup);
// do something with key here
在这种情况下,customer 中的代码将void *
类型转换为int *
,然后取消引用它(获取它的值)。它必须首先进行类型转换,因为void *
基本上意味着“指向某物的指针”,它允许您传入任何您想要的类型。如果没有类型转换,编译器不知道您是要读取char
(通常为1 字节)、short
(通常为2 字节)还是int
(通常为4 字节)。类型转换消除了歧义。
注意使用void *
作为参数可能不是最好的,因为你可以这样做:
double lookup = 69.0f;
customer_key *key = customer(&lookup);
这将编译,但不会查找客户 69(double
不是 int
!)。
void *
的使用可能是有意的,代码可能能够(希望安全地)确定指针和参数之间的关系,例如:(void *)3
- 这将是一种特殊情况。
【讨论】:
【参考方案5】:该函数接受一个 void 指针(因此是 void *)。为了将其取消引用到某种类型的变量(例如 int)——这是第一个“*”所做的——你需要将它转换为指向实际类型的指针——在这种情况下通过 (int *) 演员表
【讨论】:
【参考方案6】:int num = *(int *)number;
通常,这里的“数字”应该是某种类型的指针,通常是void*
指针。
(int *)number
,表示将原始类型转换为int*
,*(int *)number
,表示获得int指针的值。
【讨论】:
以上是关于int num = *(int *)number;这是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章