我让这个文件弄清楚了一些有关指针和指针数组的问题。我了解直到注释掉的代码,并且能够在不更改p_to_nums的情况下更改p_to_pointers中值的顺序。但是我很难将它翻译成qsort。如何在不改变原始数组排序的情况下对指针数组进行排序?
这里是我的输出:
0 p_to_nums: 7 p_to_pointers: 7
1 p_to_nums: 4 p_to_pointers: 4
2 p_to_nums: 4 p_to_pointers: 4
3 p_to_nums: 2 p_to_pointers: 2
4 p_to_nums: 1 p_to_pointers: 1
这是所需的输出:
0 p_to_nums: 4 p_to_pointers: 7
1 p_to_nums: 2 p_to_pointers: 4
2 p_to_nums: 7 p_to_pointers: 4
3 p_to_nums: 4 p_to_pointers: 2
4 p_to_nums: 1 p_to_pointers: 1
而且我的代码:
int compare_values (const void *a, const void *b) {
const int *int_a = (const int *) a;
const int *int_b = (const int *) b;
return (*int_b > *int_a) - (*int_b < *int_a);
}
main() {
int i;
int nums[5];
int *p_to_nums;
int *p_to_pointers[5];
nums[0] = 4;
nums[1] = 2;
nums[2] = 7;
nums[3] = 4;
nums[4] = 1;
p_to_nums = &nums[0];
for (i=0; i< 5; i++) {
p_to_pointers[i] = &p_to_nums[i];
}
//p_to_pointers[0] = &p_to_nums[2];
//p_to_pointers[2] = &p_to_nums[0];
qsort(*p_to_pointers, 5, sizeof(int), compare_values);
for (i=0; i< 5; i++) {
printf("%d p_to_nums: %d p_to_pointers: %u\n", i, (p_to_nums[i]), *p_to_pointers[i]);
}
return 0;
}
你的'p_to_pointers'值不指向指针。实际上你有1个单独的指针:'p_to_nums',它用于连续指向'nums'数组的不同元素。每个'p_to_pointer'的类型是'int *'(指向int的指针);而不是'int **'(指向指针的指针) – pmg
@pmg:Bzzzt。错误的答案。 'p_to_pointer'是一个指向int的指针数组,换句话说就是'int **'。 –
@Seth,我的意思是**每个**'p_to_pointer',也就是说'p_to_pointer [0]'等等......除此之外,正如你所说,整个数组的类型为'int **'。我只是觉得这个名字具有误导性(因为它是!) – pmg