C:多个函数之间的引用传递?

时间:2014-10-14 16:01:14

标签: c pointers pass-by-reference

我试图在多个函数之间通过引用(或者更确切地说,通过指针)传递。我理解通过引用传递的基础知识,并成功地管理了各个函数。我似乎无法理解如何通过引用传递一个变量沿多个函数。

int main(int argc, char const *argv[])
{
    int* quicksort(int*, int, int, long long int*);
    int *sortedList = malloc(MAX_LENGTH * sizeof(int));
    long long int compCount=0; 
    sortedList = quicksort(LIST, 0, MAX_LENGTH-1, &compCount); 
    printf("%lld", compCount);
    return 0;
}

int* quicksort(int* A, int l, int r, long long int* compCount) { 
    int partition(int*, int, int, long long int*);
    int p;
    if (!(l < r)) { 
        return A;
    }
    else { 
        p = partition(A, l, r, compCount); 
        quicksort(A, l, p-1, compCount);
        quicksort(A, p+1, r, compCount); 
    }
    return A;
}

int partition(int *A, int l, int r, long long int* compCount) {
    int i, j, p, tmp; 
    i = l + 1;
    p = l; 

    for (j = l + 1; j <= r; j++) {
        if (A[j] < A[p]) {
            tmp = A[i];
            A[i] = A[j];
            A[j] = tmp;
            i = i+1; 
        }
    }
    compCount += r-l; 
    tmp = A[l];
    A[l] = A[i-1];
    A[i-1] = A[l];
    return i-1; 
}

我在此结束时获得了compCount = 0的值。我知道我可以通过使用全局变量来解决这个问题,但我宁愿不使用全局变量。

我如何误用我的指针?

3 个答案:

答案 0 :(得分:1)

您正在函数之间正确传递指针。问题是你正在更新指针而不是它指向的指针。

compCount += r-l; 

应该是:

*compCount += r-l; 

与此问题无关,排序是就地完成的,因此sortedList将被指定与原始列表相同的指针,并且您的malloc将被删除并将被泄露。

答案 1 :(得分:1)

请注意,quicksortint *)的结果无效。签名令人困惑:可以相信quicksort接受数组A并返回A的排序副本(A未被修改)。显然A就地修改了。那么回归A的兴趣是什么?让我们注意,对quicksort的2次递归调用只是忽略了返回的值。此返回值无用。 BTW主要是什么LIST(未声明)?不应该是SortedList吗?

你的功能的签名应该是:

 void quicksort(int* A, int l, int r, long long int* compCount);

您现在可以使用返回值来返回比较次数(顺便说一下long就足够了):

long quicksort(int* A, int l, int r) { 
    int partition(int*, int, int, long*);
    int p;
    if (!(l < r)) { 
        return 0;
    } else {
        long compCount = 0;
        p = partition(A, l, r, &compCount); 
        compCount += quicksort(A, l, p-1);
        compCount += quicksort(A, p+1, r); 
    }

    return compCount;
}

补充说明:partition可以简化,因为它现在总是收到compCount = 0因此:

*compCount += r-l; 

变为

*compCount = r-l; 

因此,不再需要在compCount中初始化quicksort

long quicksort(int* A, int l, int r) { 
    int partition(int*, int, int, long*);
    int p;
    long compCount;

    if (!(l < r)) { 
        return 0;
    }

    p = partition(A, l, r, &compCount); 
    return compCount + quicksort(A, l, p-1) + quicksort(A, p+1, r); 
}

答案 2 :(得分:0)

你所谓的引用,你实际上是按值传递指针。传递指针时,可以通过解除引用来更改指针的内容,因此您应该执行以下操作:

*compCount += r-l;