- vừa được xem lúc

con trỏ void*

0 0 7

Người đăng: Nguyễn Đặng Triều

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Memory layout của một chương trình C/C++

1. Đặt Vấn Đề.

0 0 60

- vừa được xem lúc

Sự khác nhau giữa bộ nhớ Heap và bộ nhớ Stack trong lập trình

1. Giới thiệu. . Như chúng ta đã biết thì việc Quản lý bộ nhớ đối với một lập trình viên là rất quan trọng.

0 0 75

- vừa được xem lúc

Tích hợp thư viện C/C++ vào một dự án Flutter như thế nào?

Chào các bạn hôm nay rảnh rỗi thì mình viết một bài hướng dẫn về cách tích hợp một thư viện C/C++ vào một dự án Flutter. Thì cũng khá đơn giãn thôi vì Flutter đã cũng cấp cho chúng ta một thư viện khá

0 0 78

- vừa được xem lúc

Programming

Definition of Programming. .

0 0 53

- vừa được xem lúc

Gọi hàm của C++ trong Python bằng ctypes

Nếu đã từng dùng qua các thư viện liên quan đến toán học của Python như numpy, các bạn sẽ để ý thấy các nó có tốc độ xử lý rất nhanh. Điều này là do một phần của package này được viết bằng C/C++ và ph

0 0 55

- vừa được xem lúc

Build ứng dụng Cross Platform với Go và CGO

1. Giới thiệu.

0 0 54