2

我在我正在分析的一些代码中发现了这行代码:

Mintau = (double*) malloc(FadeAll.num_paths*sizeof(double));

我还在这里找到了一个问题(它与出现的其他问题重复),它解释了指针的不同语法,包括:

int *ptr;  
int * ptr;  
int* ptr; 

我应该解释一下,我完全理解以上三个人都在说同样的事情。最后一个是最接近我的代码行的那个。我想知道为什么在这种情况下必须用括号括起来?如果这是一个重复的问题,我深表歉意,但我找不到任何关于此的问题。

4

5 回答 5

5

这三个声明之间没有区别:

int *ptr;  
int * ptr;  
int* ptr; 

(double*)必须在括号中,因为它是演员表。

在此链接中阅读有关铸造的一些信息

希望能帮助到你。

于 2012-06-18T14:26:05.933 回答
4

这意味着一个演员。该函数malloc返回一个void*. 将该(double*)值强制转换为 type double*

在 C 中,这种强制转换是不必要的,因为任何指针类型都与void*. 但如果这是 C++,那么就需要演员表。

两者之间没有区别:

int *ptr;  
int * ptr;  
int* ptr; 
于 2012-06-18T14:25:44.517 回答
2

这意味着它是从malloc()的返回类型 ( void *) 到的强制转换float *。什么是演员表?http://en.wikipedia.org/wiki/Type_conversion#Explicit_type_conversion

顺便说一句,强制转换的返回值是一种非常糟糕的做法malloc()。看看为什么:我要转换 malloc 的结果吗?

于 2012-06-18T14:29:23.413 回答
2

(double*)演员表;每当您看到形式为(type-name ) expression的表达式时,它的意思是“将表达式的结果解释为type-name 类型的值”。在这种情况下,它的意思是“将结果解释malloc为指向double”的指针。

通常,一种类型(例如char *)的指针值不能直接分配给不同类型(例如double *)的指针变量,因此您必须使用强制转换表达式将源值显式转换为目标类型。在 1989 年标准之前malloccalloc, 和realloc所有返回char *值,因此您必须使用强制转换将结果分配给不同的指针类型。

void *类型在 1989 年标准中作为通用指针类型引入,无需强制转换即可*alloc分配给不同的指针类型,并且函数已更改为返回该类型的值。显式转换结果malloc现在被认为是不好的做法。

强制转换表达式中的类型结构与声明中的类型结构非常匹配,只是没有被声明的事物的名称。这可能最好用一些例子来解释。

int *p声明p为指向int; 要将表达式的结果转换为指向 的指针int,请编写(int *). 它与声明相同,减去标识符p

这里还有几个例子:

声明类型
------------ ---- ----
int (*ap)[10] (int (*)[10]) 指向 int 的 10 元素数组的指针
int (*f)(void) (int (*)(void)) 指向返回 int 的函数的指针
char **p (char **) 指向 char 的指针

同样,强制转换表达式的结构与声明的结构相同,只是减去了被声明事物的名称。

于 2012-06-18T18:24:23.280 回答
1

它在括号中,因为它是一个cast,它基本上告诉编译器,嘿,你在那里,将这块内存视为具有这种类型,因为我这么说(顺便说一句,它是 C 中错误的主要原因,除了内存分配/释放对不匹配)。

在 C 中,转换 的结果也被认为是不好的形式malloc,因为转换 fromvoid *是自动的。它只是添加代码噪音而没有任何好处。

至于三种类型的变量声明,请记住int* a, b;int *a, *b. 我更喜欢后者,因为它显式地显示了绑定到变量名的指针,而不是类型。

于 2012-06-18T14:28:14.393 回答