【问题标题】:Confusion regarding a function definition in C关于 C 中的函数定义的困惑
【发布时间】:2012-08-26 19:35:10
【问题描述】:

我找到了这个函数定义

void *func(void *param) {

}

实际上,我对这个函数定义有些困惑。 void * 在函数的返回类型和参数中是什么意思。我是C的初学者。所以请不要介意。谢谢

void *func(void *param) {
  int s = (int)param;
  ....
}

看看我发现的上述程序。我觉得应该是

int *s = (int *)param;

不是吗?我很困惑

【问题讨论】:

    标签: c function


    【解决方案1】:

    void * 表示它是一个没有特定类型的指针,将其视为通用指针,不像 int * 一个 int 指针。

    如果需要,您可以将其转换为不同的类型(例如,如果您要使用指针进行指针运算)。

    您可能会发现这个 SO 使用问题:Concept of void pointer in C programming

    【讨论】:

    • 您甚至不必将其转换为其他类型,它会自行转换为任何其他对象指针。
    【解决方案2】:

    返回任何类型的指针。它可以是任何数据类型。

    【讨论】:

      【解决方案3】:
      void *func(void *param) {
      
      }
      

      param 是一个空指针意味着它是一个任何引用类型的指针。因为 void 指针没有对象类型,所以除非是大小写,否则不能取消引用。

      so void *param;
         int *s=(int*)param;
      

      在这里,因为 param 是一个指针变量,所以你必须将它转换为指针变量。而不是像你在那里所做的那样转换为 int 类型。

      例如

      int x;
       float r;
       void *p=&x;
       int main()
       {
         *(int *)p=2;
           p=&r;
         *(float*)p=1.1;
       }
      

      在这个例子中 p 是一个空指针。现在在 main 方法中,我将 p 转换为 int 指针,然后转换为 float 指针,以便它可以先引用一个整数,然后再引用一个浮点数。

      【讨论】:

        【解决方案4】:

        你可以把它想象成一个原始指针,只不过是一个地址,想想看,指针只不过是地址正确,所以它们应该都是相同的大小,在大多数现代系统中是 32 位或 64 位,但是如果是这样,为什么我们要说int *char * 等等,如果它们的大小都相同,那是因为我们需要一种方法来解释我们指向的类型,int * 意味着当我们取消引用转到该地址并将 4 个字节解释为 intchar * 意味着当我们取消引用时转到该地址并获取一个字节,那么当您取消引用 void * 时会发生什么,你得到 warning: dereferencing ‘void *’ pointer 基本上我们真的不能,如果你这样做,它的影响取决于编译器,当我们对其进行算术运算时也是如此。

        那么为什么还要使用它们呢?好吧,我个人不喜欢,有些团体也不特别喜欢它们,从根本上说,它们允许您创建相当通用的子例程,一个很好的例子是memset,它将一块内存设置为某个字节值,它的第一个参数是@ 987654329@ 因此它不会抱怨是否给出char *int * 应注意它以每个字节为基础工作,并且您需要正确计算数组的总大小。

        【讨论】:

          【解决方案5】:

          这只是意味着函数func 接受一个参数,它是一个指针(指向任何东西)并返回一个指针(指向任何东西)。当您使用void * 时,您是在告诉编译器“这是一个指针,但此时它指向什么并不重要”。

          当您想实际使用它所指向的数据时,您需要将其转换为指向其他类型的指针。例如,如果它指向一个int,您可以创建一个int * 变量并取消引用它:

          int *int_ptr = (int *)param;
          // now (*int_ptr) is the value param is pointing to
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-04-26
            • 2015-04-08
            • 2013-09-09
            • 1970-01-01
            • 1970-01-01
            • 2020-08-06
            • 1970-01-01
            相关资源
            最近更新 更多