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

/* Demo 04：指针 */

void swap(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main()
{
    // 1. 指针基础
    int a = 10;
    int *p = &a;
    printf("a 的地址：%p，a 的值：%d\n", p, *p);
    *p = 20;
    printf("通过指针修改后 a = %d\n", a);

    // 2. 指针与数组
    int arr[5] = {10, 20, 30, 40, 50};
    int *q = arr;
    printf("*(q+1)=%d, q[2]=%d, arr[3]=%d\n", *(q + 1), q[2], arr[3]);

    // 3. 指针作参数
    int x = 1, y = 2;
    swap(&x, &y);
    printf("swap 后：%d %d\n", x, y);   // 2 1

    // 4. 动态内存
    int *dyn = (int *)malloc(5 * sizeof(int));
    if (dyn == NULL)
        return -1;
    for (int i = 0; i < 5; i++)
        dyn[i] = i * 10;
    printf("malloc 数组：");
    for (int i = 0; i < 5; i++)
        printf("%d ", dyn[i]);
    printf("\n");
    free(dyn);
    dyn = NULL;

    // 5. 函数指针
    int (*op)(int, int) = add;
    printf("op(3,2)=%d\n", op(3, 2));
    int (*ops[])(int, int) = {add, sub};
    printf("ops[0](10,5)=%d, ops[1](10,5)=%d\n", ops[0](10, 5), ops[1](10, 5));

    return 0;
}
