จนถึงตอนนี้ความเข้าใจของฉันในตัวชี้โมฆะมีดังนี้
เมื่อตัวแปรตัวชี้ถูกประกาศโดยใช้คำสำคัญโมฆะ - มันจะกลายเป็นตัวแปรตัวชี้วัตถุประสงค์ทั่วไป ที่อยู่ของตัวแปรใด ๆ ของชนิดข้อมูลใด ๆ (ถ่าน, int, ลอย ฯลฯ ) สามารถกำหนดให้กับตัวแปรโมฆะตัวชี้
main()
{
int *p;
void *vp;
vp=p;
}
เนื่องจากตัวชี้ชนิดข้อมูลอื่นสามารถกำหนดให้เป็นโมฆะตัวชี้ดังนั้นฉันใช้มันในฟังก์ชั่น absolut_value (รหัสที่แสดงด้านล่าง) เพื่อให้เป็นฟังก์ชั่นทั่วไป
ฉันพยายามเขียนรหัส C แบบง่ายซึ่งใช้จำนวนเต็มหรือลอยเป็นอาร์กิวเมนต์และพยายามทำให้มันเป็น + ถ้าลบ ฉันเขียนรหัสต่อไปนี้
#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;
}
แต่ฉันได้รับข้อผิดพลาดดังนั้นฉันจึงได้รู้ว่าความเข้าใจของฉันเกี่ยวกับตัวชี้โมฆะนั้นไม่ถูกต้อง :( ดังนั้นตอนนี้ฉันจะย้ายไปยังการรวบรวมคะแนนว่าทำไมถึงเป็นเช่นนั้น
สิ่งที่ฉันต้องเข้าใจเพิ่มเติมเกี่ยวกับตัวชี้โมฆะคือ
เราจำเป็นต้องพิมพ์ตัวแปรตัวชี้โมฆะเพื่อยกเลิกการพิจารณา นี่เป็นเพราะตัวชี้โมฆะไม่มีชนิดข้อมูลที่เกี่ยวข้อง ไม่มีทางที่คอมไพเลอร์สามารถรู้ (หรือเดา?) ข้อมูลประเภทใดที่ชี้ไปที่ตัวชี้โมฆะ ดังนั้นในการนำข้อมูลที่ชี้ไปโดยตัวชี้โมฆะเราพิมพ์มันด้วยชนิดของข้อมูลที่ถูกเก็บไว้ภายในตำแหน่งตัวชี้โมฆะ
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) );
}
ตัวชี้โมฆะอาจมีประโยชน์จริง ๆ ถ้าโปรแกรมเมอร์ไม่แน่ใจเกี่ยวกับชนิดข้อมูลของข้อมูลที่ป้อนโดยผู้ใช้ ในกรณีเช่นนี้โปรแกรมเมอร์สามารถใช้ตัวชี้เป็นโมฆะเพื่อชี้ไปยังตำแหน่งของชนิดข้อมูลที่ไม่รู้จัก โปรแกรมสามารถตั้งค่าในลักษณะที่จะขอให้ผู้ใช้แจ้งประเภทของข้อมูลและประเภทการหล่อสามารถดำเนินการตามข้อมูลที่ป้อนโดยผู้ใช้ ข้อมูลโค้ดระบุไว้ด้านล่าง
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
}
อีกจุดสำคัญที่คุณควรทราบเกี่ยวกับตัวชี้โมฆะคือ - ตัวชี้คณิตศาสตร์ไม่สามารถทำได้ในตัวชี้โมฆะ
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
ดังนั้นตอนนี้ฉันเข้าใจสิ่งที่ผิดพลาดของฉัน ฉันกำลังแก้ไขเดียวกัน
การอ้างอิง:
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c
รหัสใหม่ดังแสดงด้านล่าง
#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;
}
ขอบคุณ,