0

con trỏ void*

Con trỏ void* là gì

Con trỏ void * thường được gọi là con trỏ đa năng hoặc con trỏ chung. Đây là một quy ước trong ngôn ngữ C liên quan đến địa chỉ thuần túy. Khi một con trỏ là con trỏ void *, đối tượng mà nó trỏ đến không thuộc bất kỳ kiểu dữ liệu nào. Vì con trỏ void * không thuộc bất kỳ kiểu dữ liệu nào, các phép toán số học không thể được thực hiện trên chúng, chẳng hạn như tăng giá trị con trỏ; compiler không biết phải tăng bao nhiêu. Ví dụ, con trỏ char * tăng 1, trong khi con trỏ short * tăng 2.

Trong C/C++, bạn có thể sử dụng các loại con trỏ khác nhau để thay thế con trỏ void *, hoặc sử dụng con trỏ void * để thay thế các loại con trỏ khác bất cứ lúc nào. Những đặc điểm này có thể dẫn đến nhiều kỹ thuật hữu ích. Bản chất của con trỏ là giá trị của nó là một địa chỉ.

Khi một biến con trỏ được khai báo bằng từ khóa void, nó sẽ trở thành một biến con trỏ đa năng. Địa chỉ của bất kỳ biến nào thuộc bất kỳ kiểu dữ liệu nào (char, int, float, v.v.) đều có thể được gán cho một biến con trỏ void *.

Để hủy tham chiếu một biến con trỏ, hãy sử dụng toán tử gián tiếp *. Tuy nhiên, khi sử dụng con trỏ void *, bạn cần ép kiểu biến con trỏ để hủy tham chiếu. Điều này là do con trỏ void * không có kiểu dữ liệu liên quan. Compiler không thể biết kiểu dữ liệu mà con trỏ void trỏ đến. Do đó, để lấy dữ liệu được trỏ đến bởi con trỏ void *, bạn cần thực hiện ép kiểu bằng cách sử dụng kiểu dữ liệu được lưu trữ tại vị trí con trỏ void *.

#include <stdio.h>

void printValue(void *ptr, char type) {
    // Ép kiểu dựa vào "type" mà người dùng cung cấp
    switch(type) {
        case 'i': // int
            printf("Int: %d\n", *(int*)ptr);
            break;
        case 'f': // float
            printf("Float: %.2f\n", *(float*)ptr);
            break;
        case 'c': // char
            printf("Char: %c\n", *(char*)ptr);
            break;
        default:
            printf("Unknown type\n");
    }
}

int main() {
    int   a = 42;
    float b = 3.14f;
    char  c = 'X';

    void *p; // con trỏ void có thể trỏ tới bất kỳ loại nào

    p = &a;  // trỏ tới int
    printValue(p, 'i');

    p = &b;  // trỏ tới float
    printValue(p, 'f');

    p = &c;  // trỏ tới char
    printValue(p, 'c');

    return 0;
}

Output

Input for the program ( Optional )
STDIN
Output:

Int: 42
Float: 3.14
Char: X

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí