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