Code:
/*
a pointer array p[0, 1, 2, 3, 4, 5]
the values entered into the array m = m[6, 3, 1, 5, 2, 4]
p[0] should point to m[2]
p[1] should point to m[4]
p[2] should point to m[1]
p[3] should point to m[5]
p[4] should point to m[3]
p[5] should point to m[0]
*/
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
const int *const *x = a;
const int *const *y = b;
if ( **x > **y ) return 1;
if ( **x < **y ) return -1;
return 0;
}
void show(const int *m, const int *const p[], size_t size)
{
size_t i;
for ( i = 0; i < size; ++i )
{
printf("m[%lu] = %d, p[%lu] = %p, *p[%lu] = %d\n", (long unsigned)i,
m[i], (long unsigned)i, (void*)p[i], (long unsigned)i, *p[i]);
}
}
int main (void)
{
const int m[] = {6,3,1,5,2,4}, *p[sizeof m / sizeof *m];
size_t i;
for ( i = 0; i < sizeof m / sizeof *m; ++i )
{
p[i] = &m[i];
}
puts("Before:");
show(m, p, sizeof m / sizeof *m);
qsort(p, sizeof p / sizeof *p, sizeof *p, cmp);
puts("After:");
show(m, p, sizeof m / sizeof *m);
return 0;
}
/* my output
Before:
m[0] = 6, p[0] = 0012FF74, *p[0] = 6
m[1] = 3, p[1] = 0012FF78, *p[1] = 3
m[2] = 1, p[2] = 0012FF7C, *p[2] = 1
m[3] = 5, p[3] = 0012FF80, *p[3] = 5
m[4] = 2, p[4] = 0012FF84, *p[4] = 2
m[5] = 4, p[5] = 0012FF88, *p[5] = 4
After:
m[0] = 6, p[0] = 0012FF7C, *p[0] = 1
m[1] = 3, p[1] = 0012FF84, *p[1] = 2
m[2] = 1, p[2] = 0012FF78, *p[2] = 3
m[3] = 5, p[3] = 0012FF88, *p[3] = 4
m[4] = 2, p[4] = 0012FF80, *p[4] = 5
m[5] = 4, p[5] = 0012FF74, *p[5] = 6
*/