描述
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。
输入
输入数据的个数n, n个整数, 移动的位置m
输出
移动后的n个数
输入样例 1
10 1 2 3 4 5 6 7 8 9 10 2
输出样例 1
9 10 1 2 3 4 5 6 7 8
输入样例 2
5 2 4 6 8 1 3
输出样例 2
6 8 1 2 4
提示
输出结果的最后一个数后没有空格
#include <iostream>
using namespace std;
int yidong(int a[],int,int);
int a[100], b[100];
int main()
{
int n,m;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
cin >> m;
*b=yidong(a,n,m);
for (int i = 1; i <= n; i++)
{
cout << b[i]<<" ";
}
}
int yidong(int a[], int n ,int m)
{
int i,k ;
for (i = n; i > 0; i--)
{
k = (i + m) % n;
if (k == 0)k = n;
b[k] = a[i];
}
return *b; //返回数组头指针
}
问题点:
①:在C和C++中,数组名代表数组中第一个元素的地址,而不是代表整个数组。p=&a[0];与p=a;等价。
②:数组名后面的方括号实际上是变址运算符。对a[i]的求解过程是:先按a+i*d计算数组元素的地址,然后找出此地址所指向的单元中的值。
③:自定义函数的形参写成数组形式的如 int arry[ ],但在编译时是将形参数组名arry按指针变量处理,相当于int *arry。这两种写法完全等价。实际上在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。
④:实参数组名a代表一个固定的地址,或者说是指针型常量,因此不可能改变a的值。
如 a++; //语法错误,a是常量,不能改变
但形参数组名是指针变量,并不是一个固定的地址值,它的值是可以改变的。在函数调用开始时,它接收了实参数组首元素的地址,但在函数执行期间,它可以再被赋值。
如:f(arry[ ],int n)
{cout<<arry; //输出arry[0]的值
arry=arry+3; //指针变量arry的值改变了,指向arry[3]
cout<<*arry<<endl;} //输出arry[3]的值
⑤:在用变量作函数参数时,只能将实参变量的值传给形参变量,在调用函数过程中如果改变了形参的值,对实参没有影响,即实参的值不因形参的值改变而改变。
而用数组名作函数实参时,如果改变了形参数组元素的值将同时改变实参数组元素的值。
如图所示,假设实参数组a的起始地址为1000,则形参数组b的起始地址也是1000,由于实参数组和形参数组类型相同,因此,a[0]与b[0]为同一单元,以此类推。因此,形参数组中各元素的值如发生变化就意味着实参数组元素的值发生变化。