지금까지 void 포인터에 대한 내 주장은 다음과 같습니다.
키워드 void를 사용하여 포인터 변수를 선언하면 범용 포인터 변수가됩니다. 모든 데이터 유형의 변수 (char, int, float 등)의 주소는 void 포인터 변수에 할당 될 수 있습니다.
main()
{
int *p;
void *vp;
vp=p;
}
다른 데이터 유형 포인터는 void 포인터에 할당 될 수 있으므로 absolut_value (아래 표시된 코드) 함수에서 사용했습니다. 일반적인 기능을 수행합니다.
정수 또는 부동 소수점을 인수로 사용하고 음수이면 + ve로 만드는 간단한 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 포인터에 대한 나의 이해가 올바르지 않다는 것을 알게되었습니다. (. 이제는 왜 그런지에 대한 포인트를 수집하려고합니다.
void 포인터에 대해 더 많이 이해해야하는 것은 그 것입니다.
void 포인터 변수를 역 참조하려면 형변환해야합니다. void 포인터에는 연관된 데이터 유형이 없기 때문입니다. 컴파일러가 void 포인터가 가리키는 데이터 유형을 알거나 추측 할 수있는 방법은 없습니다. 따라서 void 포인터가 가리키는 데이터를 가져 오기 위해 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) );
}
프로그래머가 최종 사용자가 입력 한 데이터 유형에 대해 확신하지 못하는 경우 void 포인터가 실제로 유용 할 수 있습니다. 이러한 경우 프로그래머는 빈 포인터를 사용하여 알 수없는 데이터 유형의 위치를 가리킬 수 있습니다. 프로그램은 사용자에게 데이터의 유형을 알려주도록하는 방식으로 설정 될 수 있으며, 유형 캐스팅은 사용자가 입력 한 정보에 따라 수행 될 수있다. 코드 스 니펫은 다음과 같습니다.
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 포인터에 대해 명심해야 할 또 다른 중요한 점은 – 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.
그래서 나는 나의 실수가 무엇인지 이해했다. 나는 똑같이 고치고있다.
참고 문헌 :
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;
}
감사합니다,