import java.util.Scanner;
public class Work36 {
public static void main(String[] args) {
int n;
Scanner scanner = new Scanner(System.in);
System.out.println("您要输入几个数");
n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
System.out.println("请输入一个数");
a[i] = scanner.nextInt();
}
// 这里把输入的数组打印一下
System.out.println("你输入的数组为");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
System.out.println();
System.out.println("输入移动的位数");
int m = scanner.nextInt();
scanner.close();
/* int[] c = move(a, m);*/
a=move(a, m);
System.out.println("a的"+a.hashCode());
// 这里把输入的数组打印一下
System.out.println("你的输出的数组为");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
}
public static int[] move(int[] a, int m) {
// 这里,使用在看数据结构的时候,实现循环队列的里面的一点关于绝对值的思想,这里绝对值是数组的长度
int length = a.length;
int[] b = new int[length];// 使用数组b来保存修改过后的数组
System.out.println("局部量"+b.hashCode());
for (int i = 0; i < length; i++) {
b[i] = a[((i - m-1) + length )% length];
}
return b;
}
}
在C++中,所有的对象存储是在堆上(不管是不是在调用方法里面定义的),但是,int []b,b 存储在栈上开辟栈的空间,名称为b,里面存的是b对应的数组在堆上的地址,栈里面存的是数组在堆上具体的空间地址。方法外面呢,定义int []a的时候,具体操作也是这样。而,当**a=move(a,m)**之后,a里面存的就是b这个数组在堆上的地址啦,因为move()函数的调用返回的是一个地址,而这个地址,就是b这个数组在堆上的地址,现在,重新将它赋跟a。
下面说下:
int []a=new int[10]。
new int[10]在堆上开辟10个空间,假设这个10个空间的在内存中的地址为x.
int []a,在栈上开辟一块空间,名字是a,里面呢,存的就是x。