【问题标题】:c void pointer array printingc void 指针数组打印
【发布时间】:2014-12-22 11:23:56
【问题描述】:

如何将空指针数组的值传递给其他函数?

函数参数的含义是

  1. 指向元素数组的空指针
  2. 数组元素大小,例如。 G。 sizeof(int)
  3. 数组元素个数大小

我怎样才能printf void 指针数组?

void sorting(void* p, int sz, int n, int (*pf)(void*, void*))
{
    int i, j;

    for (i = 0; i < n - 1; ++i) 
        for (j = i + 1; j < n; ++j)                 
            if (pf(/*?*/, /*?*/) > 0)
                /*swap function*/
}

int cmp_int(void* p1, void* p2)
{
    if (*(int*)p1 < *(int*)p2) return -1;
    if (*(int*)p1 > *(int*)p2) return +1;
    return 0;
}

int cmp_dbl(void* p1, void* p2)
{
    if (*(double*)p1 < *(double*)p2) return -1;
    if (*(double*)p1 > *(double*)p2) return +1;
    return 0;
}

int main(void)
{
    int a[] = { 4, 3, 2, 6, 5, 1, 7, 8 };
    int an = sizeof(a) / sizeof(*a);

    double b[] = { 4.4, 6.6, 2.2, 3.3, 8.8, 1.0, 0.0 };
    int bn = sizeof(b) / sizeof(*b);

    int i;

    sorting(b, sizeof(double), bn, cmp_double);
    sorting(b, sizeof(int), an, cmp_int);
}

如何将数组值传递给sorting()中的pf()函数?

简单的方法是(int *)p[j],但我想使用两个值类型(doubleint

【问题讨论】:

  • @iharob 嗯...我认为像这样的 *(void *)(p + sz *i) 可以使 2 个函数成为唯一的方法?
  • @barakmanos 发生错误
  • @BLUEPIXY 谢谢它很好用

标签: c arrays pointers void


【解决方案1】:

在您的函数中,您知道每个元素的大小 - 以字节为单位,即。 e.就char 而言 - 现在想适当地传递它。

为了能够使用void * 进行指针运算,您必须将其转换为char *

这样做(或类似的)方式:

void sorting(void* p, int sz, int n, int (*pf)(void*, void*))
{
    char * pp = p; // to be used with pointer arithmetics
    int i, j;

    for (i = 0; i < n - 1; ++i) 
        for (j = i + 1; j < n; ++j)                 
            if (pf(pp + sz * i, pp + sz * j) > 0)
                /*swap function*/
}

除了pp + sz * i,您也可以写成&amp;pp[sz * i],因为它们是等价的。

【讨论】:

  • "...能够进行指针运算..." ...您可能想用pp替换所有p,但@987654329 @ 的定义及其第一次出现。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2016-08-15
  • 2021-01-12
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多