題目:輸入 10 個等長字符串,用指針數組實現排序。關鍵在於「指針數組存儲字符串首地址,排序時僅交換指針,不移動字符串內容」。
#include <stdio.h>
#include <string.h>
void print(char *arr[], int n);
void sort(char *arr[], int n);
int main() {
char *arr[10], str[10][20];
// 讓指針數組指向二維數組每行
for (int i = 0; i < 10; i++) arr[i] = str[i];
printf("please input 10 strings:\n");
for (int i = 0; i < 10; i++) scanf("%s", arr[i]);
printf("source:\n"); print(arr, 10);
sort(arr, 10);
printf("sorted:\n"); print(arr, 10);
return 0;
}
void print(char *arr[], int n) {
for (int i = 0; i < n; i++) printf("%s\n", arr[i]);
}
void sort(char *arr[], int n) {
char *temp;
for (int i = 0; i < n - 1; i++) {
int k = i;
for (int j = i + 1; j < n; j++)
if (strcmp(arr[k], arr[j]) > 0) k = j;
if (k != i) {
temp = arr[i]; arr[i] = arr[k]; arr[k] = temp;
}
}
}
char *arr[10] 是指針數組,每個元素是 char*arr[i] = str[i] 將二維數組每行首地址賦給指針scanf("%s", arr[i]) 直接寫入二維數組內存,指針無需變動arr[i] 指針值,str 內容不動,效率極高此模式廣泛用於大數據排序(如 qsort 回調)。