国产探花免费观看_亚洲丰满少妇自慰呻吟_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的生命周期結束,但是已經造成改變。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雅江县| 平度市| 台中市| 华安县| 溧阳市| 桐柏县| 高淳县| 龙泉市| 嘉义市| 双峰县| 新泰市| 辉县市| 昆山市| 石林| 志丹县| 饶平县| 南和县| 桑日县| 阿尔山市| 许昌市| 张家川| 涟源市| 鲁甸县| 东山县| 健康| 安丘市| 万全县| 玛纳斯县| 寿阳县| 大足县| 兰溪市| 青阳县| 济阳县| 囊谦县| 阆中市| 依兰县| 梁河县| 同仁县| 桑日县| 沙坪坝区| 四川省|