国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數組值傳遞和引用傳遞

2019-11-08 03:27:31
字體:
來源:轉載
供稿:網友

參考代碼:

public class PRoblem {

   static int[] newArray = new int[]{1,2,3};

   public static void main(String[] args) {

      // TODOAuto-generated method stub

     

      System.out.println(newArray.length);

      addSpace1(newArray);

      System.out.println(newArray.length);

 

   }

  

   public static void addSpace1(int[]a){

      int[] b = new int[a.length*2];

      System.arraycopy(a, 0,b, 0, a.length);

      a = b;

   }

 

}

可以看出,所給代碼在類內,main函數外定義了一個static的數組,并進行了初始化,長度為3,并且用函數寫了一個對數組進行擴容的函數,參數為數組。

在main函數里調用擴容函數,將之前定義和初始化后的數組當作參數傳入,執行操作后發現newArray的 長度并沒有改變,也就是說調用的擴容函數并沒有對newArray造成改變,這是為什么呢?

這是因為,把數組當作參數傳遞后,只是將數組的首地址的副本傳入,在函數里盡管對此副本改變了長度,也改變了首地址,但從根本上來說,并沒有對newArray的首地址造成改變,可以看到在函數里并沒有涉及到newArray的操作。

歸根結底,函數里的a只是局部變量,當函數結束以后,a就立刻失去了作用,肯定不會對newArray造成更改。

那么如果想要真切地改變newArray需要怎么寫呢?有兩種方法,

(1)      將函數設置為有返回值,將改變后的副本返回

int[] b = new int[a.length*2];

      System.arraycopy(a, 0,b, 0, a.length);

      a = b;

      return a;

(2)      將 a = b 這一代碼改為 newArray = b;在這將擴容后的a,也就是b的首地址直接給newArray,使newArray可以訪問到擴容后的地址。

 

下面再來看第二種狀況:

參考代碼:

public class Text{

        

   

         publicstatic void main(String[] args){

                  

                   Scannerscan = new Scanner(System.in);

                  

                   System.out.print("請輸入數組的長度:");

                  

                   intn = scan.nextInt();

                  

                   int[]a = new int[n];

                  

                   for(inti = 0;i < n;i++){

                            System.out.print("請輸入第"+(i+1)+"個數值:");

                            a[i]= scan.nextInt();

                   }

                   //打印初始數組

                   print(a);

                   //更改數組的順序

                   change(a);

                   System.out.println();

                   //打印改變以后的數組

                   print(a);

         }

public static void print(int[] a){

                   for(inti = 0;i < a.length;i++){

                            System.out.print(a[i]+"");

                   }

         }

 

public static void change(int[] a){

                   inttemp = 0;

                   intn = a.length - 1;

                   for(inti = 0 ; i <= n/2 ; i ++){

                            //交換前面和后面數組的值的位置

                            temp = a[i];

                            a[i]= a[n - i];

                            a[n - i] = temp;

                   }

         }

}

在該類里邊,新建和賦值了一個數組,且打印數組和使數組元素交換位置的方法已經寫好,運行可以發現,把數組作為參數傳入change函數進行元素位置交換,打印交換前和交換后的數組,發現元素順序的確改變了,這又跟第一個例子有不同之處。

具體原因在于:

在傳參的時候,是將數組的首地址傳給函數,在此,參數a也指向了原數組的空間,并且具備了操作空間的權利,所以在這個時候面對空間里的值進行改變的話,數組里的值也會相應改變,也就是main函數里的a和函數里的a都指向了那個空間,雖然在函數結束后局部變量a的生命周期結束,但是已經造成改變。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陕西省| 油尖旺区| 那曲县| 金溪县| 伊宁市| 中卫市| 玛多县| 孝昌县| 乌兰浩特市| 陆河县| 沙洋县| 张掖市| 本溪| 敖汉旗| 抚远县| 耿马| 南木林县| 获嘉县| 连南| 克什克腾旗| 凌云县| 富阳市| 琼海市| 土默特右旗| 柳江县| 额济纳旗| 湘阴县| 塔河县| 上栗县| 邹城市| 徐水县| 岢岚县| 中超| 府谷县| 兴安县| 丰原市| 铜鼓县| 宾阳县| 内黄县| 昭觉县| 凤山市|