【问题标题】:How to get an item from a void pointer to array when I know each element's size?当我知道每个元素的大小时,如何从指向数组的 void 指针中获取项目?
【发布时间】:2013-01-02 09:37:12
【问题描述】:

当我想为教育目的编写自己的快速排序时,它就出现了。这是我得到的:

qsort(void* array, int count, int size, int(*compare)(const void*, const void*));

我有数组中每个元素的大小,以及指向数组中第一个元素的指针。如何获取该数组中的每个单独元素?

【问题讨论】:

  • 你只知道大小,还是你也知道类型?
  • @JoachimPileborg 和内置的 qsort 一样,我只知道每个元素的大小,而不知道类型。

标签: c void-pointers


【解决方案1】:

如果 size 是使用 sizeof 运算符生成的,则它是 sizeof(char) 的倍数(根据定义为 1)。因此,将void* 转换为char*,并一次移动size“字符”。

(((char*)array) + i*size)

【讨论】:

  • 问题是,多个数据类型可以具有相同的大小。
  • @ShaneHsu 这由比较功能来解决。
  • 实际上sizeof(char)定义为1,所以这个要求没有实际意义。
  • @rodrigo,你不是说这个要求是微不足道的吗? :)
  • @StoryTeller 我给了你最好的答案,因为它是最能解释的。
【解决方案2】:

您通常会使用char * 指针进行地址运算,例如访问array 的元素i

char * array_ptr = (char *)array + i * size;

【讨论】:

    【解决方案3】:

    很简单,将其转换为char* 并进行指针运算:

    char *carray = (char*)array;
    char *pointer_to_n = carray + n * size;
    

    顺便说一句,GCC 等一些编译器有一个扩展,允许对 void 指针进行指针运算,就好像它们是指向 char 的指针一样,但这是不可移植的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多