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

标签 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]);

它将每个数组的第一个索引 (arr1,arr2...) 视为该数组的元素 (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;
        }
    }
}

最佳答案

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

首先,您不需要发送 &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;

        }
    }
}

关于c - 如何在指针数组中传递完整数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149156/

相关文章:

mysql - 如何使用 Select 将数组分配给 MySql 变量

java - 您好,尝试根据数组值打印一定数量的字符。 java

c# - 将字符串转换为字符串[],然后将字符串[]转换为字节[]

c - 使用 getline 时出现段错误(核心已转储)

c - 如何在二维数组中移动位

c++ - 返回值存储在哪里?

c - 如何查看存储的字符串

C++ 类似于汇编的指针访问

c - 在 C 中通过引用传递删除列表中的节点

c - C中是否有从其指针查找结构类型的规定