将指针存储在void *

时间:2015-05-20 13:20:04

标签: c pointers function-pointers

我明白为什么你不能这样做:

void(*fp)(void) = &function;
function_taking_void_pointer((void*)fp);

因为类型的长度可能不同。

但添加另一层间接是否有任何问题:

void(*fp)(void) = &function;
void(**fpp)(void) = &fp;
function_taking_void_pointer((void*)fpp)

我的想法背后:指向函数指针的指针应指向数据存储器,因此应该与void *类型具有相同的长度。

那我有多难?

2 个答案:

答案 0 :(得分:4)

你是对的,所有指针类型都是对象类型

N1570 6.3.5类型,第20段,第五个清单项目:

  
      
  • 指针类型可以从函数类型或对象类型派生,称为   引用类型。指针类型描述其值提供引用的对象   到引用类型的实体。从引用的类型T派生的指针类型   有时被称为“指向T”的指针。从一个指针类型的构造   引用类型称为“指针类型派生”。 指针类型是完整的   对象类型。
  •   

但指向对象类型的指针不一定与void*(6.2.5 p28)具有相同的大小。

  
      
  1. 指向void的指针应具有与a相同的表示和对齐要求   指向字符类型的指针。 48)同样,指向合格或非限定版本的指针   兼容类型应具有相同的表示和对齐要求。所有   指向结构类型的指针应具有相同的表示和对齐要求   彼此相同。所有指向联合类型的指针都应具有相同的表示形式   对齐要求彼此。 指向其他类型的指针不必相同   表示或对齐要求。
  2.   

但是,它们都可以转换void*(6.3.2.3 p1):

  
      
  1. 指向void的指针可以转换为指向任何对象类型的指针。指向的指针   任何对象类型都可以转换为指向void的指针,然后再返回;结果应该   比较等于原始指针。
  2.   

答案 1 :(得分:-5)

此代码段错误。


    void(*fp)(void) = &function;
    function_taking_void_pointer((void*)fp);

在C / C ++中,function name将重新定位到linking stage中的特定地址,因此您无法在&之前使用function name。另外function name不是C / C ++中的变量,因此您也无法尝试获取其地址。