如何在指针数组中传递完整数组

时间:2017-03-31 20:27:42

标签: c arrays pointers

我写了一个程序来排序数组的值。它有5个数组,

    int arr1[] = { 3, 9, 6, 7 };
    int arr2[] = { 2, 5, 5 };
    int arr3[] = { 0 };
    int arr4[] = { 1, 6 };
    int arr5[] = { 4, 5, 6, 2, 1 };

和一个包含这5个数组的指针数组

int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 };

我想对每个数组的值进行排序,但是当我将数组传递给排序函数时

sortArrValues(&pArr[i]);

它将每个数组的第一个索引(arr1arr2 ...)视为该数组的元素(pArr[i]),因此pArr[i]是(3 ,2,0,1,4)。
但是我希望pArr[i]成为它应该是的完整数组,所以在第一次迭代中pArr[i]将是(3,9,6,7)。

注释 :每个数组的第一个索引表示该数组的长度(不包括该索引)。
排序将跳过第一个索引 还有两个附加功能,它们没有被使用(你可以跳过它们)。

这是完整的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN 5

void sortArrValues(int** arr);
void sortArrAdress(int* pArr);
void printArr(int * pArr);

int main()
{
    int arr1[] = { 3, 9, 6, 7 };
    int arr2[] = { 2, 5, 5 };
    int arr3[] = { 0 };
    int arr4[] = { 1, 6 };
    int arr5[] = { 4, 5, 6, 2, 1 };

    int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 };

    int  i = 0;

    for (i = 0; i < LEN; i++)
    {
        sortArrValues(&pArr[i]);
    }

    //sortArrAdress(pArr);
    //printArr(pArr);

    return 0;
}
/*
this function will sort the given arrays' values.
in: array
out: none
*/
void sortArrValues(int** arr)
{
    int tmp = 0;
    int i = 0;

    for (i = 1; i < *arr; i++)
    {
        if (*arr[i] > *arr[i+1])
        {
            tmp = *arr[i];
            *arr[i] = *arr[i + 1];
            *arr[i + 1] = tmp;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码中存在一些错误。

首先,您不需要发送&pArr[i]pArr[i]足以订购您的数组。然后,您的void sortArrValues(int** arr)变为void sortArrValues(int* arr),更清晰易读。

其次,在你的sortValues中,当你改变一个值时,你应该重新启动(我知道它不是非常优化但是如果你想要更快地制作一些东西,你应该使用快速排序。代码,{ 4, 5, 6, 2, 1 }将变为{ 4 5 2 1 6 }

这样你的代码就有了修复:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN 5

void sortArrValues(int* arr);
void sortArrAdress(int* pArr);
void printArr(int * pArr);

int main()
{
    int arr1[] = { 3, 9, 6, 7 };
    int arr2[] = { 2, 5, 5 };
    int arr3[] = { 0 };
    int arr4[] = { 1, 6 };
    int arr5[] = { 4, 5, 6, 2, 1 };

    int* pArr[LEN] = { arr1, arr2, arr3, arr4, arr5 };

    int  i = 0;

    for (i = 0; i < LEN; i++)
    {
        sortArrValues(pArr[i]);
    }

    //sortArrAdress(pArr);
    //printArr(pArr);

    for (int i = 0 ; i < LEN ; i++) {
        for (int j = 0 ; j < pArr[i][0] + 1 ; j++)
            printf("%d ", pArr[i][j]);
        printf("\n");
    }

    return 0;
}
/*
this function will sort the given arrays' values.
in: array
out: none
*/
void sortArrValues(int* arr)
{
    int tmp = 0;
    int i = 0;

    for (i = 1; i < *arr; i++)
    {
        if (arr[i] > arr[i+1])
        {
            tmp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = tmp;
            i = 0;

        }
    }
}

答案 1 :(得分:0)

我尝试修改您的程序以解决问题。其他人已经强调了其中一些问题。有些人没有。这是工作片段。如果您需要对任何修改进行更多解释,请与我们联系。请注意,我只修改了您的sort功能。这个想法不是给你最快的排序算法,而是一个有效的算法。

int main()
{
    int arr1[] = { 3, 9, 6, 7 };
    int arr2[] = { 2, 5, 5 };
    int arr3[] = { 0 };
    int arr4[] = { 1, 6 };
    int arr5[] = { 4, 5, 6, 2, 1 };

    int* pArr[] = { arr1, arr2, arr3, arr4, arr5 };

    int  i = 0;

    for (i = 0; i < LEN; i++)
    {
        sortArrValues(&pArr[i]);
    }
}


void sortArrValues(int** arr)
{
    int tmp = 0;
    int i = 0, j = 0;

    for (i = 0; i < (**arr) - 1; i++)
    {
        for(j=i+1; j < (**arr) - 1; j++) {
           if ((*arr)[i+1] > (*arr)[j+1])
           {
               tmp = (*arr)[i+1];
               (*arr)[i+1] = (*arr)[j + 1];
               (*arr)[j+1] = tmp;
           }
        }
        printf("%d ", (*arr)[i+1]);
    }
    printf("%d\n", (*arr)[i+1]);
}