题目:
数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。
关键点
arr[i] = arr[len - 1 - i];
arr[0]=arr[len-1];
如果数组序列是偶数,则调换最中间一对为止;若为奇数,则单出一个不用反转.
思想就是长度取一半 eg:8/2, 9/2=4.5,反转一半,到5时固定,反转完毕.
若使用数组下标方法i < len / 2:只需要遍历前一半元素,否则会交换两次导致恢复原状.
分析:
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*
数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。
*/
// 使用指针操作逆序数组中的元素
void reverse_by_ptr(int *arr, int n) { //int n 表示数组的长度(元素个数)
// 定义起始指针指向数组的第一个元素
int *start_ptr = arr;
// 定义结束指针指向数组的最后一个元素
int *end_ptr = arr + n - 1;
// 当起始指针小于结束指针时,执行循环
while (start_ptr < end_ptr) {
// 交换两个指针指向的元素
int temp = *start_ptr;
*start_ptr = *end_ptr;
*end_ptr = temp;
// 将起始指针后移一个元素,将结束指针前移一个元素
start_ptr++;
end_ptr--;
}
}
// 先用纯粹的C基础代码来实现, 不用指针操作, 只用[]取下标运算
// 这个操作无需额外的临时数组, 直接原地交换就可以实现了
// 0 <-> len - 1, 1 <-> len - 2.... i <-> len - i - 1
/*
void reverse_arr(int arr[], int len) {
//int arr[]:数组(实际传递的是指针,但可以使用 [] 访问)。
//int len:数组的长度。
for (int i = 0; i < len / 2; i++) {
int tmp = arr[i];
arr[i] = arr[len - 1 - i];
arr[len - 1 - i] = tmp;
}
}*/
int main() {
int arr1[] = { 1, 2, 3, 4, 5 };
int n1 = sizeof(arr1) / sizeof(arr1[0]);
printf("原始数组为:");
for (int i = 0; i < n1; i++) printf("%d ", arr1[i]);
printf("\n");
reverse_by_ptr(arr1, n1);
printf("指针版逆序:");
for (int i = 0; i < n1; i++) printf("%d ", arr1[i]);
printf("\n");
/*
int arr2[] = { 1, 2, 3, 4, 5 };
int n2 = sizeof(arr2) / sizeof(arr2[0]);
reverse_arr(arr2, n2);
printf("下标版逆序: ");
for (int i = 0; i < n2; i++) printf("%d ", arr2[i]);
printf("\n");
*/
return 0;
}
解决方案总结:
指针版(reverse_by_ptr):
使用 *ptr 解引用和指针运算 (ptr++, ptr–)。 适用于需要高效内存操作的场景。
下标版(reverse_arr):
使用 arr[i] 访问数组元素。 代码更直观.