定義:正讀反讀相同的整數,如 121、12321。
算法:將數字分解為數組(低位在前),雙指針首尾比對。
#include <stdio.h>
int main(void) {
int n, digits[20], len = 0, i;
printf("輸入正整數: ");
scanf("%d", &n);
int temp = n;
while (temp > 0) { // 分解數位
digits[len++] = temp % 10;
temp /= 10;
}
int is_palindrome = 1;
for (i = 0; i < len / 2; i++) { // 只需比對一半
if (digits[i] != digits[len - 1 - i]) {
is_palindrome = 0;
break;
}
}
printf("%d %s回文數\n", n, is_palindrome ? "是" : "不是");
return 0;
}
優化點:原代碼逐位打印 ok/no,改為標誌位統一輸出,邏輯更清晰。
指針核心三句:
int *p = &a; —— 取址p = arr; —— 數組名退化為首元素地址*(p + i) == arr[i] —— 指針算術等價下標#include <stdio.h>
int main(void) {
int data[8], *p1, *p2, temp, i;
printf("輸入 8 個整數: ");
for (p1 = data; p1 < data + 8; p1++) scanf("%d", p1); // 指針遍歷輸入
// 選擇排序:外層鎖定當前位置,內層掃描剩餘區間找最大值
for (p1 = data; p1 < data + 7; p1++) {
for (p2 = p1 + 1; p2 < data + 8; p2++) {
if (*p1 < *p2) { // 降序:前小於後則交換
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
}
printf("排序結果: ");
for (i = 0, p1 = data; i < 8; i++, p1++) printf("%6d", *p1);
putchar('\n');
return 0;
}
int arr[5] = {10,20,30,40,50};
int *p = arr; // p 指向 arr[0]
arr[2] == *(arr + 2) == *(p + 2) == p[2] // 皆為 30
&arr[2] == arr + 2 == p + 2 // 皆為 arr[2] 地址
int *p; *p = 10; → 段錯誤。必須先指向合法記憶體。arr = p; 非法,數組名是常量指針。p + 1 移動 sizeof(*p) 字節,非 1 字節。回文數分解展示「整數→數組」的數據轉換思維;指針排序驗證「指針遍歷、解引用交換」的核心操作。熟練掌握 *p、p+i、p[i] 三者互換,是寫好 C 語言的分水嶺。