Void pointer là gì?

Noun C
generic pointer
Con trỏ void

Con trỏ void (void pointer) trong lập trình C là một con trỏ (pointer) không có bất kỳ kiểu dữ liệu (data type) liên quan nào. Một con trỏ void (void pointer) trong C chỉ ra rõ ràng rằng nó trống (empty) và chỉ có thể chứa các địa chỉ (addres) thuộc bất kỳ kiểu dữ liệu loại nào. Hơn nữa, những con trỏ void (void pointer) có địa chỉ này có thể được ép kiểu (typecast) thành bất kỳ kiểu nào khác một cách dễ dàng. Việc cấp phát bộ nhớ ( memory allocation) cũng trở nên dễ dàng với loại con trỏ void (void pointer) này trong C. Con trỏ void (void pointer) là một con trỏ chung (generic pointer) được sử dụng khi chúng ta không biết kiểu dữ liệu của biến mà con trỏ trỏ đến. Con trỏ này trong C rất hữu ích trong việc triển khai các hàm chung (generic function) trong C.

Trình biên dịch (compiler) cũng không thể tìm thấy kiểu dữ liệu của biến biến được trỏ bởi bất kỳ loại con trỏ void (void pointer) nào. Một điểm cần lưu ý là con trỏ void (void pointer) sẽ không hỗ trợ bất kỳ loại phép toán số học (arithmetic operation) nào. Nó sử dụng toán tử điều hướng gián tiếp (indirection operator) "*" để phục vụ toàn bộ mục đích. Nhưng để phục vụ vấn đề này, cần phải ép kiểu (typecast) biến con trỏ cũng như cho dereferencing. Việc ép kiểu là cần thiết vì không có sự hiện diện của kiểu dữ liệu được liên kết tại thời điểm khai báo con trỏ.

Cú pháp (syntax):


void *pointer_name;

Ví dụ:


void *ptra

Ví dụ này cho thấy rằng con trỏ đang mong đợi một loại con trỏ void (void pointer) và con trỏ có tên là ptra, ký hiệu '*' biểu thị rằng một con trỏ đang được khai báo (declare) và sẽ chỉ được sử dụng trong tương lai cho mục đích dereferencing.

Bên dưới là code ví dụ về con trỏ void (void pointer).


#include <iostream>
using namespace std;

int main() {
    void* ptr;
    float f = 2.3f;

    // assign float address to void
    ptr = &f;

    cout 

Output:


0xffd117ac
0xffd117ac

Ở đây, &f trong câu lệnh count dùng để lấy giá trị của con trỏ ptr. Kết quả đầu ra cho thấy rằng con trỏ void ptr lưu trữ địa chỉ của một biến thuộc kiểu dữ liệu float do hai giá trị in ra màn hình giống nhau.

Vì void là một kiểu dữ liệu trống (empty type), con trỏ void (void pointer) không thể được dereference.


void* ptr;
float* fptr;
float f = 2.3;

// assign float address to void pointer
ptr = &f;
cout 

Bên dưới là code ví dụ in giá trị của địa chỉ được trỏ tới bởi của con trỏ void (void pointer).

Để in giá trị của địa chỉ được trỏ tới bởi một con trỏ void, chúng ta sử dụng toán tử static_cast. Nó chuyển đổi con trỏ từ kiểu void * sang kiểu dữ liệu tương ứng của địa chỉ mà con trỏ đang lưu trữ:


#include <iostream>
using namespace std;

int main() {
  void* ptr;
  float f = 2.3f;

  // assign float address to void pointer
  ptr = &f;

  cout (ptr));

  return 0;
}

Output:


The content of pointer is 2.3

Chương trình này in ra giá trị của địa chỉ được trỏ tới bởi con trỏ void ptr. Vì chúng ta không thể dereference một con trỏ void (void pointer) nên chúng ta không thể sử dụng *ptr. Tuy nhiên, nếu chúng ta chuyển đổi kiểu con trỏ kiểu void * thành kiểu float *, chúng ta có thể sử dụng giá trị được trỏ tới bởi con trỏ void (void pointer). Trong ví dụ này, chúng ta đã sử dụng toán tử static_cast để chuyển đổi kiểu dữ liệu của con trỏ từ void * thành float *.

Lưu ý: con trỏ void (void pointer) không thể được sử dụng để lưu trữ địa chỉ của các biến có qualifier là const hoặc volatile.


void *ptr;
const double d = 9.0;

// Error: invalid conversion from const void* to void*
ptr = &d;

Learning English Everyday