將 x→y, y→z, z→x。
void rotate_right(int *a, int *b, int *c) {
int t = *c;
*c = *b;
*b = *a;
*a = t;
}
int main() {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
printf("原值: %d %d %d\n", x, y, z);
rotate_right(&x, &y, &z);
printf("新值: %d %d %d\n", x, y, z);
return 0;
}
// 返回下標,未找到返回 -1
int search(const int list[], int n, int x) {
for (int i = 0; i < n; ++i)
if (list[i] == x) return i;
return -1;
}
int main() {
int a[10], x;
for (int i = 0; i < 10; ++i) scanf("%d", &a[i]);
scanf("%d", &x);
int pos = search(a, 10, x);
printf("%d\n", pos);
return 0;
}
#include <stdlib.h>
#include <string.h>
int cmp_str(const void *a, const void *b) {
return strcmp(*(const char**)a, *(const char**)b);
}
int main() {
char *names[] = {"Changhua", "Liping", "Chenmei", "Gaofeng"};
int n = 4;
qsort(names, n, sizeof(char*), cmp_str);
for (int i = 0; i < n; ++i) puts(names[i]);
return 0;
}
輸出:Changhua, Chenmei, Gaofeng, Liping。
// 返回最大值元素地址,通過 k 返回下標
int *findmax(int *s, int t, int *k) {
int max_idx = 0;
for (int i = 1; i < t; ++i)
if (s[i] > s[max_idx]) max_idx = i;
*k = max_idx;
return &s[max_idx];
}
int main() {
int a[10] = {12,23,34,45,56,67,78,89,11,22};
int k; int *addr = findmax(a, 10, &k);
printf("最大值:%d 下標:%d 地址:%p\n", a[k], k, (void*)addr);
return 0;
}
| 題目 | 核心知識點 | 易錯點 |
|---|---|---|
| 指針交換 | 指針作函數參數修改實參、臨時變量交換 | 傳值而非傳址、交換邏輯錯誤 |
| 數組查找 | 線性查找、const 正確性、返回 -1 慣例 | 越界、未處理未找到情況 |
| 字符串排序 | 指針數組、qsort 比較函數、strcmp 返回值語義 | 比較函數強轉錯誤、修改字符串常量 |
| 最大值定位 | 遍歷記錄下標、返回地址、%p 格式輸出指針 | 地址格式錯誤、未更新下標輸出參數 |