int num = *(int *)number;这是做什么的?

时间:2010-11-13 00:45:13

标签: c++ c pointers

我正在查看一些c ++代码,我看到了这个:

int num = *(int *)number;

我以前从未见过这个? 它是在一个标记为这样的函数中:

void *customer(void *number){ }

那甚至做了什么?是否有不同的方式来表明这一点?

谢谢,这不是家庭作业btw我只是对此有何困惑?

6 个答案:

答案 0 :(得分:13)

(int *)部分将变量数转换为指向int的指针,然后前面的*将其解引用为int。

答案 1 :(得分:10)

该函数需要一个void*,但不知何故它知道(可能在某些文档中需要它),它给出的指针实际指向int

因此,(int*)number是“原始指针,转换为int*,以便我可以从中读取int”,*(int*)number是int值它指向。

答案 2 :(得分:2)

正确的答案已经在这里了,但是当我不得不经常使用C时,我可以告诉你一个通常帮助我的技巧吗?

这就是你在脑海中发音“*”的方式 - 并且有两个部分。

常见的部分是当它是一种类型的一部分时 - 每个人在阅读时都可能会说“指针”,这很棒。所以(int *)是一个int指针 - 或者我甚至会在脑海中反转它来读取“指向int的指针”,这似乎有点帮助。

对我来说很有帮助的是每当你在代码中看到*时 - 将其读作“指向的内容”。

如果你遵循这种模式,那么:

int num = *(int *)number;

是一个整数变量“num”被赋值:int指针指向的是什么,数字。它只是翻译自己。

有时候你必须稍微处理一下这句话,但是由于我养成了这种习惯,我从来没有读过指针代码的大问题。

我相信我也读过&作为C中的“地址”,但我认为如果我没记错的话,它在C ++中已经过载了。

答案 3 :(得分:1)

该函数接受一个void指针(因此为void *)。为了将它取消引用到某个类型的变量(例如int) - 这是第一个“*”所做的 - 你需要将它转换为指向实际类型的指针 - 在本例中为int指针via(int) *)演员

答案 4 :(得分:1)

我假设customer的使用方式如下:

int lookup = 123;
customer_key *key = customer(&lookup);
// do something with key here

在这种情况下,客户中的代码将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 :(得分:-1)

int num = *(int *)number;

通常,这里的“数字”应该是某种类型的指针,通常是 void* 指针。

(int *)number 表示将原始类型强制转换为 int*,而 *(int *)number 表示获取 int 指针的值。

相关问题