我正在查看一些c ++代码,我看到了这个:
int num = *(int *)number;
我以前从未见过这个? 它是在一个标记为这样的函数中:
void *customer(void *number){ }
那甚至做了什么?是否有不同的方式来表明这一点?
谢谢,这不是家庭作业btw我只是对此有何困惑?
答案 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 指针的值。