Module 17: Con trỏ nâng cao

Con trỏ nâng cao

Function Pointer (Con trỏ hàm)

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

int main() {
    int (*op)(int, int); // khai bao con tro ham
    op = add;
    printf("%d", op(5, 3)); // 8
    op = sub;
    printf("%d", op(5, 3)); // 2
}

Callback

void sort(int arr[], int n, int (*cmp)(int, int)) {
    for (int i = 0; i < n-1; i++)
        for (int j = 0; j < n-i-1; j++)
            if (cmp(arr[j], arr[j+1]) > 0) {
                int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t;
            }
}

Void pointer

void *ptr; // con tro toan cuc, khong co kieu
int x = 10; ptr = &x;
printf("%d", *(int*)ptr); // ep kieu khi dung

Con trỏ cấp 2 (Double pointer)

int x = 10, *p = &x, **pp = &p;
printf("%d", **pp); // 10

Mảng con trỏ hàm

int (*ops[])(int,int) = {add, sub, mul};
printf("%d", ops[0](5,3)); // goi add

Ứng dụng: qsort với callback

int cmp(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}
qsort(arr, n, sizeof(int), cmp);