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