我想要一个名为sortPointers()的函数,它设置一个整数指针数组,以按升序指向另一个数组的元素。
到目前为止,我所做的是
void sortP(int src[], int *ptrs[], int n)
{
int temp;
for(int i = 0; i< n ; i++)
{
ptrs[i] = & src[i]; // assign the address of each number in the src[] to the array of pointers
}
while (1)
{
int flag = 0;
for(int i = 0; i< n;i++)
{
if ( *(ptrs[i]) > *(ptrs[i+1])) //bubble sort
{
temp = *(ptrs[i]);
*(ptrs[i]) = *(ptrs[i+1]);
*(ptrs[i+1]) = temp;
flag = 1;
}
}
if(flag == 0);
break;
}
for(int i = 0; i< n;i++)
{
printf("%i\n",ptrs[i]);
}
}
在main函数中,我调用此函数
main()
{
int a[5] = {5,4,3,2,1};
int *ptrs[5]= {&a[0],&a[1],&a[2],&a[3],&a[4]};
sortP(a, *ptrs, 5);
}
我的结果是地址,如果我想打印出指针指向的实际值(1,2,3,4,5),我应该在printf()中更改什么?
感谢
P.S。我之前试过* ptrs [i]但是我得到了奇怪的数字,而不是src []中的那些..
答案 0 :(得分:1)
我的结果是地址
从技术上讲,您的结果是未定义的行为,因为%i
需要int
,而不是int*
。
解决这个问题很简单:在ptrs[i]
前添加一个解除引用运算符,如下所示:
for(int i = 0; i< n;i++) {
printf("%i\n", *ptrs[i]);
}
我的数字很奇怪,而不是
中的数字src[]
您的代码的真正问题在于您正在错误地交换指针。实际上,您只需查看temp
就可以说它不正确:它必须是int*
,而不是int
,并且交换的解除引用需要消失。
答案 1 :(得分:1)
参见注释:
void sortP(int src[], int *ptrs[], int n)
{
int temp;
for(int i = 0; i< n ; i++)
{
ptrs[i] = & src[i]; // assign the address of each number in the src[] to the array of pointers
}
while (1)
{
int flag = 0;
// check if i < n-1, not n
for(int i = 0; i< n-1;i++)
{
if ( *(ptrs[i]) > *(ptrs[i+1])) //bubble sort
{
temp = *(ptrs[i]);
*(ptrs[i]) = *(ptrs[i+1]);
*(ptrs[i+1]) = temp;
flag = 1;
}
}
if(flag == 0)
break;
}
for(int i = 0; i< n;i++)
{
//*ptrs[i] instead of ptrs[i]
printf("%i ",*ptrs[i]);
}
}
int main(void)
{
int a[5] = {5,4,3,2,1};
int *ptrs[5];//= {&a[0],&a[1],&a[2],&a[3],&a[4]};
sortP(a, ptrs, 5);
}