前言:
好像做过这种题目,再做一遍
内容:
题目:逆序存放并输出的题
两种方式,通过值修改,通过指针变量修改
第一种,通过方式值修改,如果我没记错的话,数组实际就是地址,然后就是可以直接修改,
所以就算是在函数里,他也是直接通过地址,然后去寻找值去修改
但是,我想到了,这个方式和指针的方式不都是一样的吗,或者说这个不就是指针吗?
但是ai给我答案,我下面这种写法是不可取的,
🌰 错误案例演示
假设数组为 [1,2,3,4,5,6](zs=6):
你的代码:
i=0: 交换 0↔5 → [6,2,3,4,5,1]
i=1: 交换 1↔4 → [6,5,3,4,2,1]
i=2: 比较 &arr[2] < &arr[3] → 成立,交换后数组变为 [6,5,4,3,2,1]
i=3: 比较 &arr[3] < &arr[2] → 不成立,循环终止。
结果正确但过程存在越界风险!
修正代码:
明确交换 zs/2 = 3 次,安全可靠。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//函数实现的功能是,逆序存放,并输出
void reverse(int arr[], int zs)
{
//直接利用值,进行交换
int i = 0;
// for(i=0;i<zs/2;i++)
while(&arr[i] < &arr[zs-1-i])
{
int tmp = arr[i];
arr[i] = arr[zs-1-i];
arr[zs-1-i] = tmp;
i++;
}
}
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int zs = sizeof(arr) / sizeof(arr[0]);
reverse(arr,zs);
for (i = 0; i < zs; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
正确的写法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//函数实现的功能是,逆序存放,并输出
void reverse(int arr[], int zs)
{
//直接利用值,进行交换
int i = 0;
for(i=0;i<zs/2;i++)
{
int tmp = arr[i];
arr[i] = arr[zs-1-i];
arr[zs-1-i] = tmp;
}
第二种写法,利用指针的形式,
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//函数实现的功能是,逆序存放,并输出
void reverse(int arr[], int zs)
{
//利用指针的方式进行交换,头指针和尾指针交换
//int* start = arr; //指向第一个元素
//int* end = &arr[zs - 1]; //指向最后一个元素
//while (end > start)
//{
// int tmp = *start; //利用临时变量存值,不能用地址存,执行下一步会改变的
// *start = *end;
// *end = tmp;
// end--; //地址前移
// start++; //地址后移
//}
}
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int zs = sizeof(arr) / sizeof(arr[0]);
reverse(arr,zs);
for (i = 0; i < zs; i++)
{
printf("%d ", arr[i]);
}
return 0;
}