我讓這個文件弄清楚了一些有關指針和指針數組的問題。我瞭解直到註釋掉的代碼,並且能夠在不更改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