C 語言參數傳遞為**值傳遞**。若需在函數內修改實參值,必須傳遞實參地址(指針),在函數內解引用修改。
void swap(int *a, int *b) {
int tmp = *a; *a = *b; *b = tmp;
}
void swap1(int *a, int *b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
// 或異或交換: *a ^= *b; *b ^= *a; *a ^= *b;
}
注意:算術法可能溢出,異或法通用且無溢出風險。
void bubbleSort(int *array, int len) {
for (int i = 0; i < len; i++) {
for (int j = 1; j < len - i; j++) {
if (array[j] < array[j-1]) {
swap1(&array[j], &array[j-1]);
}
}
}
}
void displayIntArray(int *a, int len) {
for (int i = 0; i < len; i++) printf("%d ", a[i]);
printf("\n");
}
int main() {
int a = 0xffffffff, b = 0xfffffffe;
printf("before: a=%d, b=%d\n", a, b);
swap1(&a, &b);
printf("after : a=%d, b=%d\n", a, b);
int arr[10] = {9,1,2,5,6,3,4,8,7,10};
printf("原數組: "); displayIntArray(arr, 10);
bubbleSort(arr, 10);
printf("排序後: "); displayIntArray(arr, 10);
return 0;
}
before: a=-1, b=-2
after : a=-2, b=-1
原數組: 9 1 2 5 6 3 4 8 7 10
排序後: 1 2 3 4 5 6 7 8 9 10
int *a)。&a、&array[j])。*a 訪問/修改實際值。int *array 等價 int array[]。