指针解除引用的数组

时间:2015-10-10 12:32:43

标签: c arrays pointers

我想要一个名为sortPointers()的函数,它设置一个整数指针数组,以按升序指向另一个数组的元素。

enter image description here

到目前为止,我所做的是

      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 []中的那些..

2 个答案:

答案 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);
}