package com.tarena.day05;
import java.util.Arrays;
public class Point {
/**
*java 指針演示
*/
static final int arr4[] = { 8, 3, 5, 1, 4, 2, 7 };
public static void main(String[] args) {
//1, 靜態(tài)初始化與動態(tài)初始化的原理是一樣的
int[] arr = { 8, 3, 5, 1, 4, 2, 7 };// 靜態(tài)初始化
int[] arr2 = new int[] { 8, 3, 5, 1, 4, 2, 7 };// 動態(tài)初始化
// 因為創(chuàng)建數(shù)組的原理是一樣的,都是在堆空間里申請內(nèi)存并賦值,所以使用也沒有去別
arr[0] = 0;//arr = [0, 3, 5, 1, 4, 2, 7]
arr2[0] = 0;//arr2 = [0, 3, 5, 1, 4, 2, 7]
//2,java數(shù)組名就是指針
//論據(jù)1 使用指針修改原來數(shù)組的值
int[] arr3 = arr;// arr3 就是java的指針了 相當(dāng)于 C語言的 int *arr3 = arr;指針arr3指向arr的地址
arr3[1] = 0;//使用arr3指針修改arr的1號地址的值,
System.out.println(Arrays.toString(arr));// 這時arr = [0, 0, 5, 1, 4, 2, 7]
//論據(jù)2 使用指針指向新數(shù)組的值
arr = a();// arr = [2, 1] arr的地址指向了方法a中的變量a在堆空間申請的地址。arr3仍然指向arr的原地址
System.out.println(Arrays.toString(arr));// [2, 1]
System.out.println(Arrays.toString(arr3));// [0, 3, 0, 1, 4, 2, 7]
//論據(jù)3 引用傳址
swap(arr,0,1);
System.out.println(Arrays.toString(arr));// [1, 2]
/*
* 因此java數(shù)組做參數(shù)是引用傳址而不是值拷貝,所以說java的數(shù)組是指針
*/
//論據(jù)4 java數(shù)組不是數(shù)組
/*
* c中的數(shù)組指向的地址是不能改變的,而c中的指針是可以改變的,然而java的數(shù)組恰恰可以改變指向的地址
* 所以可以說明java數(shù)組就是c指針。
* 某位老師說過c數(shù)組就是指針其實這樣說并不嚴(yán)謹(jǐn),嚴(yán)格說c數(shù)組是常指針,因為c數(shù)組的地址是不能改變的。
*/
//論據(jù)5 java數(shù)組可以有常指針但沒有常量
/*
* 雖然arr4是常指針,但是arr4據(jù)有指針的性質(zhì),所以arr4里的值是可以改變的。
*/
arr4[0] = 0;//編譯通過 數(shù)組的值不是常量
// arr4 = arr;//此處編譯不通過 指針arr4是常指針不可以指向新地址。
/*
* 以上說明java的數(shù)組就是指針,所以數(shù)組按照指針用是完全可以的。包括,引用傳址,修改堆空間的值,指向新地址等。
*/
}
public static void swap(int a[],int i,int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
public static int[] a() {
int[] a = { 2, 1 };
return a;
}
}