在C语言中,按照指针所指向的值对指针进行排序。

4
我想在C语言中对指向数组的指针进行排序,但是不移动索引位置。下面是我尝试做的事情的图片: enter image description here enter image description here 这是我的代码,但它不起作用,我不知道问题出在哪里。
       #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
当你调试程序时,你发现了什么? - Martin Nyolt
4
您的代码似乎没有指针数组,与您的图片所描述的不同。也许可以先让您的代码反映出图片所要表达的意思。 - WhozCraig
1
你不需要指向指针的指针,正如WhozCraig所评论的那样,一旦你创建了一个指针数组,只需使用array_of_pointers[i],其中i是指向已排序指针数组的索引。 - rcgldr
3
画箭头和方框真是太赞了!每个试图用C语言解决问题的人都应该这样做。 - Frerich Raabe
是的,但我没有时间了,我必须今天交这个作业,我知道qsort,但从未尝试过... - honeyPot
显示剩余2条评论
2个回答

3
您展示的图片是不正确的。在初始化后:
int *nizptr = niz;
int **niz2ptr = &nizptr;

状态如下:

enter image description here

niz2ptr指针不是指向数组,而是指向指针。因此,在此处进行的索引:

temp = *(niz2ptr + i);

这与以下内容完全相同:

temp = niz2ptr[i];

当i大于1时,代码将越界读取。这是因为它尝试在地址&nizptr+i而不是niz+i处读取。

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

由于nizptr指向一个数组,您可以对其进行索引:

temp = nizptr[i];

要使用niz2ptr实现相同的功能,首先需要解引用它以获取nizptr的值,然后对其进行索引操作:

temp = (*niz2ptr)[i];

每次使用niz2ptr时都应进行此操作。

1
那张图片解决了我的问题,我在看完之后明白了。 - honeyPot
这里仍然只有一个指针,你需要一个指针数组才能对指针数组进行排序,正如WhozCraig所回答的那样。 - rcgldr

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

现在我明白了你在我的帖子上的评论! - honeyPot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接