晋城做网站公司营销网站建设都是专业技术人员
题目:
数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。
关键点
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] 访问数组元素。 代码更直观.