Cho đến nay, phần gạch chân của tôi trên con trỏ void như sau.
Khi một biến con trỏ được khai báo sử dụng từ khóa void - nó sẽ trở thành biến con trỏ mục đích chung. Địa chỉ của bất kỳ biến nào của bất kỳ loại dữ liệu nào (char, int, float, v.v.) có thể được gán cho một biến con trỏ void.
main()
{
int *p;
void *vp;
vp=p;
}
Do con trỏ kiểu dữ liệu khác có thể được gán cho con trỏ void, nên tôi đã sử dụng nó trong hàm tuyệt đối_value (mã hiển thị bên dưới). Để thực hiện một chức năng chung.
Tôi đã cố gắng viết một mã C đơn giản lấy số nguyên hoặc float làm đối số và cố gắng làm cho nó + ve, nếu âm. Tôi đã viết mã sau đây,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
Nhưng tôi đã nhận được lỗi, vì vậy tôi đã biết sự hiểu biết của mình với con trỏ void là không chính xác :(. Vì vậy, bây giờ tôi sẽ chuyển sang thu thập điểm tại sao lại như vậy.
Những điều mà tôi cần hiểu thêm về con trỏ void là thế.
Chúng ta cần đánh máy biến con trỏ void để loại bỏ nó. Điều này là do một con trỏ void không có kiểu dữ liệu liên quan đến nó. Không có cách nào trình biên dịch có thể biết (hoặc đoán?) Loại dữ liệu nào được trỏ đến bởi con trỏ void. Vì vậy, để lấy dữ liệu được trỏ đến bởi một con trỏ void, chúng ta sẽ đánh máy nó với đúng loại dữ liệu được giữ bên trong vị trí con trỏ void.
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Một con trỏ void có thể thực sự hữu ích nếu lập trình viên không chắc chắn về kiểu dữ liệu được nhập bởi người dùng cuối. Trong trường hợp như vậy, lập trình viên có thể sử dụng một con trỏ void để trỏ đến vị trí của kiểu dữ liệu không xác định. Chương trình có thể được thiết lập theo cách để yêu cầu người dùng thông báo loại dữ liệu và kiểu truyền có thể được thực hiện theo thông tin được nhập bởi người dùng. Một đoạn mã được đưa ra dưới đây.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
Một điểm quan trọng khác bạn nên ghi nhớ về con trỏ void là - số học con trỏ không thể được thực hiện trong một con trỏ void.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Vì vậy, bây giờ tôi đã hiểu những gì là sai lầm của tôi. Tôi đang sửa giống nhau.
Người giới thiệu :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Mã mới như dưới đây.
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
Cảm ơn bạn,