2015-01-09 8 views
2

나는 기능이, void *Client(void *threaData){}무효 * 입력 함수 매개 변수

당신은 void *threadData 매개 변수에 대해 나에게 몇 가지를 알 수 있습니다. void * 매개 변수를 사용할 때 그 이유는 무엇입니까? 당신이 할 수있는,

답변

8

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 
} 
+0

빠르고 쉬운 대답, 어쩌면 당신은 C 프로그래밍에서 사용되는 예제를 추가 할 수 있습니다. – Rizier123

+0

예, 아주 좋은 대답입니다. 나는 예를 기다릴 것이다 : D. – Rapidistul

+4

'void *'는 어떤 포인터 유형을 가리킬 수 없지만 사실 어떤 객체 유형이든 가리킬 수 있습니다. 그러나 함수는 어떤 유형의 포인터도 가질 수 없으며, 포인터와 객체 유형에 대한 포인터 만 무효화합니다 (함수 포인터는 제외). –

4

당신이 void *Client(void *threadData){} 기능의 정수를 전달하려는 가정, 그래서 당신은

int integer; 

integer = SOME_VALUE; 

Client(&integer); 

및 기능

void *Client(void *threadData) 
{ 
    int value; 

    value = *(int *)threadData; 
} 

void * 이후에

는 포인터 형식으로 변환 할 수 있습니다 것 필요한 데이터를 Client() 함수로 전달하십시오.

+3

그리고 데이터의 유형에 대해 사용자 입력을 제공 데이터를 포함한 구조 –

+0

좋은 질문 ('void *을 통해 데이터를 전달하면 엄격한 별칭 규칙을 위반하게됩니까?'). 나는 대답하기 전에 생각해야했다. 나는 그 대답이 "아니오"라고 믿는다. 쓰레드 함수가'void * thread_func (void * pdata) {...}'라고 가정하자. 함수에'struct SomeThing'에 대한 포인터를'void *'로 넘겨 준다고 가정하십시오. 쓰레드 함수 안에서 가장 먼저 할 일은'SomeThing * args = pdata;'(또는'SomeThing arg = * (SomeThing *) pdata;')이다. 그래서 올바른 타입의 포인터를 통해서만 데이터에 접근 할 수있다. aliassed 형식을 통해가 아니라 엄격한 별칭 문제가 없습니다. –

+0

@JonathanLeffler 좋아, 이제는 걱정하지 않을 것이다. 죄송합니다. 답글을 남겨 두어 죄송합니다. 답장을 보내지 않을 것이라고 생각했습니다. –