iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

練習程式系列 第 26

c、c++ 指標 、 java call by value 和 call by reference

  • 分享至 

  • xImage
  •  

看網路上大大們的文章和影片,做些紀錄。
以下內容來自網路上大大們的文章。
紀錄程式來源。 稍微修改,print 觀察

教學來源:
語言技術:C 語言
Why Pointers?
[計算機概論] 第十二講、Programming Languages (1)

練習1 (swap):

#include <stdio.h>
#include <stdlib.h>

int main() {
  int a, b;
  a = 10;
  b = 20;
  printf("a是%d \n", a); //10
  printf("b是%d \n", b); //20
  printf("&a是%d \n", &a); //6356744
  printf("&b是%d \n", &b); //6356740
  Swap( & a, & b);
  printf("交換後的a是%d,b是%d\n", a, b); //交換後的a是20,b是10
  printf("交換後的&a是%d,&b是%d\n", &a, &b); //交換後的&a是6356744,&b是6356740 //代表交換後,記憶體位置沒交換,只有數字交換
  return 0;
}
Swap(int* x, int* y) {
  //int* 就算是 整數記憶體位址 的資料型態?
  //所以用int* x, int* y 後,
  // x,y就代表  參數 的值(記憶體位置),
  *x,*y代表 參數 的 數字,
  //&x,&y代表 本身 的記憶體位置?
  printf("*x是%d  *y是%d  \n", *x, *y); //*x是10  *y是20
  printf("x是%d y是%d  \n", x, y); //x是6356744 y是6356740
  printf("&x是%d &y是%d  \n", &x, &y); //&x是6356720 &y是6356724
  int t = *x;
  *x = *y;
  *y = t;
}
int* x, int* y 算是資料型態
*x &y 算是運算子 

練習2(array):

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int A[5]={1,2,3,4,5};
    int *p = A;
    printf("%d \n",A); //6356728
    printf("%d \n",&A); //6356728
    printf("%d \n",A[2]); //3
    printf("%d \n",2[A]); //3
    printf("%d \n",A+2); //6356728+4*2=6356736
    printf("%d \n",*(A+2)); //3

    printf("%d \n",p); //6356728
    printf("%d \n",&p); //6356732(p的記憶體位址)
    printf("%d \n",p[2]); //3
    printf("%d \n",2[p]); //3
    printf("%d \n",p+2); //6356728+4*2=6356736
    printf("%d \n",*(p+2)); //3
    return 0;
}

練習3(二維陣列c++)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
    int **p;
    p = new int*[2];
    printf("%d \n",*p); //p[0]的值(還沒new int[3])
    printf("%d \n",*(p+1)); //p[1]的值(還沒new int[3])
    p[0] = new int[3];
    p[1] = new int[3];
    for(int i = 0; i < 3; i++) {
        p[0][i] = i; //0 1 2
    }
    for(int i = 0; i < 3; i++) {
        p[1][i] = i+2; //3 4 5
    }
    printf("%d \n",p); //p指向的記憶體位址 (p[0]的記憶體位址)
    printf("%d \n",p+1); //p指向的記憶體位址 (p[1]的記憶體位址)

    printf("%d \n",*p); //p[0]的值
    printf("%d \n",*(p+1)); //p[1]的值

    printf("%d \n",&p); //7012100 p本身的記憶體位址

    printf("%d \n",**p); //0
    printf("%d \n",*(*p+1)); //1 *(*p+1)等於**p+1
    printf("%d \n",**p+2); //2
    printf("%d \n",**p+3); //3
    printf("%d \n",**p+4); //4
    printf("%d \n",**p+5); //5

    // p[0] = new int[3];三個元素的記憶體位址
    printf("%d \n",*(p+0)+0);
    printf("%d \n",(*(p+0))+1 );
    printf("%d \n",(*(p+0))+2 );

    // p[1] = new int[3];三個元素的記憶體位址
    printf("%d \n",*(p+1)+0);
    printf("%d \n",(*(p+1))+1 );
    printf("%d \n",(*(p+1))+2 );
    return 0;
}

C語言教學,主要都看這位大大的文章:
C 語言程式的記憶體配置概念教學
C 語言動態記憶體配置教學:malloc、free 等函數
C 語言緩衝區溢位攻擊範例程式碼
C 語言 fork 使用教學與範例,多行程 Multi-Process 平行化程式設計
C 語言 pthread 多執行緒平行化程式設計入門教學與範例
ig-Endian 與 Little-Endian 的差異與判斷程式碼
C 語言 #pragma pack 預處理指令的意義、用法教學與範例程式碼
C++ 智慧型指標(Smart Pointer):自動管理與回收記憶體
C 語言 setjmp 與 longjmp 函數用法教學

在搭配作業系統和計算機組織:
[系列文目錄] 作業系統 Operating System Concepts
【小黑馬作業系統教室統整】自編超齊全的「作業系統」科目學習整理

java call by value 和 call by reference

參考[Java] 淺談 call by value 和 call by reference

call-by-value 把變數的值複製一份傳進函數,像是 a = 5 經過函數變成a = 8 ,但是在函數外面的a還是5,因為只有在函數裡面複製a並把a+3,並沒有真的改到a。
call-by-reference 則意味著把 變數的記憶體位址 傳進函數當中 ? 所以實際修改的時候,直接改到記憶體位址 , 所以a會真的變成8

class Main {

 public static void increment(int[] array, int amount) {
  array[0] = array[0] + amount;
 }

 public static void increment(int one_number, int amount) {
  one_number = one_number + amount;
 }

 public static void main(String[] args) {
  int[] myInt = {1};
  increment(myInt, 5);
  System.out.println("Array contents : " + myInt[0]);


  int one_number = 1;
  increment(one_number, 5);
  System.out.println("one_number:" + one_number);

 }

}
Array contents : 6
one_number:1

上一篇
Android,Barcode scanner、ML Kit
下一篇
機器學習 與 Python整理
系列文
練習程式37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言