看網路上大大們的文章和影片,做些紀錄。
以下內容來自網路上大大們的文章。
紀錄程式來源。 稍微修改,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
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