按指针在C中指向的值对指针进行排序

时间:2016-09-09 08:30:49

标签: c sorting

我想对指向C中的数组的指针进行排序,但不移动索引位置。这是我想要做的事情的图片: enter image description here

enter image description here

这是代码,但它没有t work, and I don知道问题是什么。

       #include <stdio.h>
    #include <stdlib.h>

    int main()
    {

      int niz[7] = { 4, 2, 5, 7, 6, 1, 3};


    int j,i;
    int *temp;

    int *nizptr = niz;
    int **niz2ptr = &nizptr;

    for(i = 0; i < 7; i++)
    {
        for(j = 0; j < 7; j++)
        {
            if( niz[i] < niz[j] )
            {
                temp = *(niz2ptr + i);
                *(niz2ptr+i) = *(niz2ptr + j);
                *(niz2ptr+j) = temp;
            }
        }
    }


    for(i = 0; i < 7; i++)
    {
        printf("%d",*(*(niz2ptr + i)));
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您显示的图片不正确。初始化后:

int *nizptr = niz;
int **niz2ptr = &nizptr;
州的情况如下:

enter image description here

指针niz2ptr不指向数组,而是指向指针。因此,您在此处编制索引:

temp = *(niz2ptr + i);

与:

相同
temp = niz2ptr[i];
当p大于1时,

将读出超出界限。发生这种情况是因为它尝试在地址&nizptr+i而不是niz+i上阅读。

要修复代码,必须将变量temp的类型更改为int,而不是指向int的指针。

由于nizptr指向一个数组,你可以将其编入索引:

temp = nizptr[i];

要实现与niz2ptr相同的功能,首先取消引用它以获取nizptr的值,并将其索引:

temp = (*niz2ptr)[i];

每当使用niz2ptr时都应该这样做。

答案 1 :(得分:1)

出于某种原因,你倾向于使用指向此任务的指针。没有必要。你的图片显示了一个值数组和一个指针数组,其中目标只是指针数组被更改;值数组保持不变。就这样做:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int niz[7] = { 4, 2, 5, 7, 6, 1, 3};
    int *nizp[7];
    int i;

    // load pointers, show original order with addresses
    for (i=0; i<7; ++i)
    {
        nizp[i] = niz+i;
        printf("%p: %d\n", (const void*)(nizp[i]), *(nizp[i]));
    }
    fputc('\n', stdout);

    // sort the pointer array; not the value array
    int swapped = 1;
    int n = 7;
    while (swapped && n-- > 0)
    {
        swapped = 0;
        for (i=0; i<n; ++i)
        {
            if (*(nizp[i+1]) < *(nizp[i]))
            {
                void *tmp = nizp[i+1];
                nizp[i+1] = nizp[i];
                nizp[i] = tmp;
                swapped = 1;
            }
        }
    }

    // show the sorted pointer array, dereferenced
    for(i = 0; i < 7; i++)
        printf("%p: %d\n", (const void*)(nizp[i]), *(nizp[i]));
    fputc('\n', stdout);

    // prove the original sequence is still unsorted
    for(i = 0; i < 7; i++)
        printf("%p: %d\n", (const void*)(niz+i), niz[i]);
    fputc('\n', stdout);

    return 0;
}

输出(地址取决于系统)

0x7fff5fbff980: 4
0x7fff5fbff984: 2
0x7fff5fbff988: 5
0x7fff5fbff98c: 7
0x7fff5fbff990: 6
0x7fff5fbff994: 1
0x7fff5fbff998: 3

0x7fff5fbff994: 1
0x7fff5fbff984: 2
0x7fff5fbff998: 3
0x7fff5fbff980: 4
0x7fff5fbff988: 5
0x7fff5fbff990: 6
0x7fff5fbff98c: 7

0x7fff5fbff980: 4
0x7fff5fbff984: 2
0x7fff5fbff988: 5
0x7fff5fbff98c: 7
0x7fff5fbff990: 6
0x7fff5fbff994: 1
0x7fff5fbff998: 3