问题描述
- 使多个数移位输出,应用指针时出错,求解
-
要达到的目的是输入n = 5, a = {1,2,3,4,5},m = 3时能输出 4 5 1 2 3
可在对指针所指的值赋值时出错,是语法问题吗?代码见下:/*移位m个整数*/ #include <stdio.h> #include <stdlib.h> int* a = 0, *a1 = 0; int* move(int* a,int n,int m); int main() { int n; printf("Please input the size: "); scanf("%d",&n); //为数组动态分配大小 if (!(a = (int* )calloc(n,sizeof(int)))) { printf("Fail to allocate memory!!!n"); exit(1); } printf("Please input %d numbers: ",n); for (int i = 0; i < n; i++) scanf("%d",a + i); int m; printf("Please input m: "); scanf("%d",&m); a1 = move(a,n,m); //输出新排列 for (int j = 0; j < n; j++) printf("%6d",a1 + j); system("pause"); return 0; } int* move(int* a, int n,int m) { for (int i = m; i < n; i++) { *(a1 + i -m) = *(a + i); // 编译时这里内存报错,但不知为什么错,怎么改 } for (int j = 0; j < m; j++) { *(a1 + n + j) = *(a + j); } return a1; }
解决方案
其实写一个倒序数组的函数,递归三次就可以,1、2、3、4、5,输入是3,输出结果为4、5、1、2、3。第一次倒序1、2、3,第二次倒序4、5,这两次倒序的结果是3、2、1、5、4,然后再倒序一次就可以得到4、5、1、2、3,所以真正需要写的函数就只有一个倒序数组的函数,百度一个,很easy
解决方案二:
*(a1 + i -m) = *(a + i); // 编译时这里内存报错,但不知为什么错,怎么改
错误原因:a1指向的空间是非法的,你应该在main函数中和a一样也申请n个元素空间,存放变化后的数组。
解决方案三:
a1 没开辟数组空间,它仅是一个指针!会出问题!
解决方案四:
你的程序还有其他错误:
printf("%6d",a1 + j);//应该:printf("%6d",*(a1 + j));
申请的空间没有释放
你的这个编程算法也比较麻烦,如果仅仅是实现输出,只要控制下标就可以了。例如:
//输出新排列
for (int j = m; j < n; j++)
printf("%6d",a[j]);
for (int j = 0; j < m; j++)
printf("%6d",a[j]);
解决方案五:
//参数:数组a,倒序开始的位置begin,结束的位置end
void swap(int *a,int begin,int end)
{
//p指向倒序的开始位置
int *p = a+begin;
//q指向倒序的结束位置
int *q = a+end;
int temp;
//只要p在q的左侧,就一直交换p和q所指向的数组元素,交换一次后,p向右移动一位,q向左移动一位
for(;p<q;p++,q--)
{
temp = *p;
*p = *q;
*q = temp;
}
}
所以你在main函数中调用的时候分别调用三次
sawp(a,0,n);//交换1,2,3
swap(a,m,n-1);交换4,5
swap(a,0,n-1);交换3,2,1,5,4
解决方案六:
a1是什么东西?写错了吧?
时间: 2024-09-13 21:51:21