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

时间:2015-07-15 13:29:14

标签: c arrays pointers dereference

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

#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;
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你不能这称呼:

void sort(int ptrarray[], int size)

有了这个:

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

由于排序期望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)语法,因为它更清晰。

你的交换函数也应改为指向两个整数:

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;
        }
    }
}