---
# System prepended metadata

title: HackMD

---

# HackMD

學習日期：5/2

## Pointer

- Addr, Type, and Value
- First test program
```c=
int main(){
    int x = 100;
    printf("x = %d at addr = %p\n", x, &x);
    return 0;
}
```
- The result:
![](https://i.imgur.com/bJmk9LE.png)

## 全域變數&區域變數
1.全域變數的儲存位置與區域變數不同
2.全域變數可用的記憶體比區域變數大

- The test program
```c=
int z = 10000;
int main(){
    int x = 100, t[10]={1,2}, y=1000;
    printf("x = %08x at addr = %p\n", x, &x);
    printf("t[0] = %08x at addr = %p\n", t[0], &t[0]);
    printf("t[1] = %08x at addr = %p\n", t[1], &t[1]);
    printf("t[2] = %08x at addr = %p\n", t[2], &t[2]);
    printf("y = %08x at addr = %p\n", y, &y);
    printf("z = %08x at addr = %p\n", z, &z);
    return 0;
}
```
- The result
![](https://i.imgur.com/BG2wLon.png)

## 從記憶體位置提取數值
- 在變數位置前加上* 可提取原本的數值
- The test program
```c=
int main(){
    int x = 100;
    printf("x = %08x at addr = %p\n", x, &x);
    printf("Value = %d at addr = %p\n", *(&x), &x);
    return 0;
}
```
- The result
![](https://i.imgur.com/C16x1LW.png)
- Note
1.& can be put in front of a variable => get the address of that address
2.* can be put in front of an address => get the value of that address
3.%p is used as the address specifier for printf

## 整數的指標
- 有點像門牌的概念
- The test program 1
```c=
int main(){
    int x = 100;
    int *xp = &x;
    printf("x = %d at addr = %p\n", x, xp);
    printf("Value = %d at addr = %p\n", *xp, xp);
    printf("xp also has address = %p\n", &xp);
    return 0;
}
```
- The result 1
![](https://i.imgur.com/Qyc54R0.png)
- The test program 2
```c=
int main(){
    int x = 100;
    int *xp = &x;
    *xp = 200;
    printf("x = %d at addr = %p\n", x, &x);
    printf("x = %d at addr = %p\n", *xp, xp);
    return 0;
}
```
- The result 2
![](https://hackmd.io/_uploads/SJqbFmBNh.png)
- The test program 3
```c=
int main(){
    int x = 100;
    int *xp = &x;
    int *zp = xp;
    *zp = 200;
    printf("x = %d at addr = %p\n", x, &x);
    printf("x = %d at addr = %p\n", *zp, zp);
    return 0;
}
```
- The result 3
![](https://hackmd.io/_uploads/H1htsSrV3.png)

## 作業 
- Practice 1
```c=
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void getAB(int guess, int answer, int *x, int *y)
{
    int i, j;
    int guess_digits[4], answer_digits[4];
    for (i = 3; i >= 0; i--) {
        guess_digits[i] = guess % 10;
        guess /= 10;
        answer_digits[i] = answer % 10;
        answer /= 10;
    }
    *x = *y = 0;
    for (i = 0; i < 4; i++) {
        if (guess_digits[i] == answer_digits[i]) {
            (*x)++;
        } else {
            for (j = 0; j < 4; j++) {
                if (guess_digits[i] == answer_digits[j]) {
                    (*y)++;
                    break;
                }
            }
        }
    }
}

int main()
{
    int answer[4];
    int guess;
    int a, b;
    int i, j;
    srand(time(NULL));
    for (i = 0; i < 4; i++) {
        answer[i] = rand() % 10;
        for (j = 0; j < i; j++) {
            if (answer[i] == answer[j]) {
                i--;
                break;
            }
        }
    }
    int answer_int = 0;
    for (i = 0; i < 4; i++) {
        answer_int = answer_int * 10 + answer[i];
    }
    printf("請開始猜測！\n");
    while (1) {
        printf("請猜測一個四位數字（不重複）：");
        scanf("%d", &guess);
        if (guess == answer_int) {
            printf("恭喜你猜中了，答案是%d！\n", guess);
            break;
        }
        getAB(guess, answer_int, &a, &b);
        printf("%dA%dB\n", a, b);
    }

    return 0;
}
```
- 結果
![](https://hackmd.io/_uploads/SJakMNr42.png)
- Practice 2
![](https://hackmd.io/_uploads/ByYRHHBE2.png)
![](https://hackmd.io/_uploads/r1peIHHN3.png)
- Practice 3
![](https://hackmd.io/_uploads/SyONIrrVh.png)
![](https://hackmd.io/_uploads/r1amtrHEh.png)
- Practice 4
![](https://hackmd.io/_uploads/SyJkiHBVh.png)
![](https://hackmd.io/_uploads/S1i25rHVn.png)













