如何取消引用作为传递给函数的数组元素的指针

How do I dereference a pointer that is an element of an array that is passed into a function

所以我正在做一项作业,要求我们获取一个整数数组并创建一个并行指针数组,然后指向原始数组中的相应元素。然后我们将指针数组按数字顺序排序,并在函数中使用冒泡排序来这样做。我的问题是,一旦将指针数组传递给函数,我如何取消引用返回元素指针指向的值,以便我可以在冒泡排序中使用比较、切换值并输出排序后的数组?我将指针数组传递给指针是否正确,或者我应该将实际数组传递给函数吗?代码如下。

#include <stdio.h>

void sort(int *[], int);
void swapvalues(int *, int *);


int main()
{
    int dataarray[] = { 0, 0, 0, 0, 123, 124, 125, 3000, 3000, 82, 876, 986, 345, 1990, 2367, 98, 2, 444, 993, 635, 283, 544, 923, 18, 543, 777, 234, 549, 864, 39, 97, 986, 986, 1, 2999, 473, 776, 9, 23, 397, 15, 822, 1927, 1438, 1937, 1956, 7, 29, -1 };
    int *ptrarray[100];
    int flag1 = 0;
    int flag2 = 0;
    int flag3 = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    const int size = sizeof(dataarray) / sizeof(int);
    for (i; i <= size; i++)
    {
        ptrarray[i] = &dataarray[i];
    }
    sort(ptrarray, size);




    return 0;
}


void sort(int ptrarray[], int size)
{
    int i = 0;
    int j;
    for (i; i < size; i++)
    {
        j = 0;
        for (j; j < (size-1); j++)
        {
            if ((*(ptrarray + j)) == (*(ptrarray + (j + 1))))
            {
                swapvalues(ptrarray, j);
            }
            else
                continue;
        }
    }
}

void swapvalues(int *ptrarray, int j)
{
    int holder;
    holder = *(ptrarray + j);
    *(ptrarray + j) = *(ptrarray + (j + 1));
    *(ptrarray + (j + 1)) = holder;
}

您应该只传入数组,而不是指向它的指针,因为 C 不会实际复制数组,它无论如何都会使用指向它的指针。然后,要取消引用您可以使用 *(ptrarray[j]) 的指针,其中 j 从 0 迭代到数组的大小。执行 **(ptrarray+j) 也是有效的,它首先取消引用数组指针以获取指向的元素,然后取消引用该元素以获取原始值。

首先,这段代码不会编译为你的函数 sort -

 void sort(int *[], int);
               ^array of pointers 


void sort(int *ptrarray, int size)
              ^pointer 

所以编译器会报错

将函数声明为 -

void sort(int **ptrarray, int size) 

并且在这个for循环中增加j-

 for (j; j < (size-1); j)
                       ^

你不能这样称呼:

void sort(int ptrarray[], int size)

有了这个:

int *ptrarray[100];
sort(ptrarray, size);

因为 sort 需要一个 int 的数组,而您向它传递的是一个 int * 的数组。 sort 应声明为:

void sort(int *ptrarray[], int size)

另外,这个:

if ((*(ptrarray + j)) == (*(ptrarray + (j + 1))))

比较的是指针本身,而不是它们指向的值,这才是你真正想要比较的,而这不是正确的比较。你反而想要这个:

if (*(ptrarray[j]) > *(ptrarray[j + 1]))

我建议坚持使用 a[i] 语法而不是 *(a + i) 语法,因为它更清晰。

你的 swap 函数也应该更改为接受两个 int 的指针:

void swapvalues(int *a, int *b)
{
    int holder;
    holder = *a;
    *a = *b;
    *b = holder;
}

然后你这样称呼它:

swapvalues(ptrarray[j], ptrarray[j+1]);

您的循环初始化也已关闭。这是完整的 sort 函数:

void sort(int *ptrarray[], int size)
{
    int i,j;
    for (i = 0; i < size - 1; i++)
    {
        for (j = i; j < (size-1); j++)
        {
            if (*(ptrarray[j]) > *(ptrarray[j + 1]))
            {
                swapvalues(ptrarray[j], ptrarray[j+1]);
            }
            else
                continue;
        }
    }
}