我想对指向C中的数组的指针进行排序,但不移动索引位置。这是我想要做的事情的图片:
这是代码,但它没有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;
}
答案 0 :(得分:3)
您显示的图片不正确。初始化后:
int *nizptr = niz;
int **niz2ptr = &nizptr;
州的情况如下:
指针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