source

void*의 의미와 사용방법

goodcode 2022. 8. 30. 22:11
반응형

void*의 의미와 사용방법

제가 다른 게 있더라고요.void *func(void* i);void*함수 이름과 변수 유형에 대해 각각 여기서의 평균?

또, 이러한 포인터는 언제, 어떻게 사용할 필요가 있습니까?

void아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아. a.void *명시적 캐스트 없이 다른 포인터 유형으로 변환할 수 있습니다.할 수 .void *또는 포인터 계산을 수행합니다. 먼저 전체 데이터 유형으로 포인터로 변환해야 합니다.

void *는, 같은 코드의 다른 포인터 타입으로 작업할 필요가 있는 장소에서 자주 사용됩니다. 함수(Library function 。qsort:

void qsort(void *base, size_t nmemb, size_t size, 
           int (*compar)(const void *, const void *));

base입니다.nmemb 내의 수, 「」입니다.size입니다.compar는 배열의 두 요소를 비교하는 함수에 대한 포인터입니다.을 사용하다

int iArr[10];
double dArr[30];
long lArr[50];
...
qsort(iArr, sizeof iArr/sizeof iArr[0], sizeof iArr[0], compareInt);
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareDouble);
qsort(lArr, sizeof lArr/sizeof lArr[0], sizeof lArr[0], compareLong);

" "iArr,dArr , , , , 입니다.lArr는 함수되며, 각은 " to "contraction"에서 "contraction to "contraction"으로 됩니다.int/double/long "to "to "to "to "to "void

비교 기능은 다음과 같습니다.

int compareInt(const void *lhs, const void *rhs)
{
  const int *x = lhs;  // convert void * to int * by assignment
  const int *y = rhs;

  if (*x > *y) return 1;
  if (*x == *y) return 0;
  return -1;
}

★★★★★★★★★★를 받아들임으로써void *,qsort는, 모든 타입의 어레이로 동작할 수 있습니다.

「 」를 void *안전장치를 창문 밖으로 던지고 마주 오는 차량으로 던져버린다.잘못된 비교 루틴을 사용하는 것으로부터 보호할 수 있는 것은 아무것도 없습니다.

qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);

compareInt는, 그 가 「인수」를 .int 단, 는 지지 with with with with with with with with with with with로 .double에 이 할 수 있는 컴파일 시에 이 문제를 검출할 수 있는 방법은 없습니다.배열이 잘못되어 버립니다.

C 는 c c c c c c c c c c c c 。라고 말할 수 voidvoid*모든 것(모든 것이 될 수 있음)입니다.

안 돼*그게 차이를 만들어내죠

르네는 그것을 지적했다. a.void *는 특정 위치에 대한 포인터입니다.해석하는 방법은 사용자에게 달려 있습니다.

C에 불투명 활자를 넣을 수 있는 유일한 방법입니다.예를 들어 glib 또는 일반 데이터 구조 라이브러리에서 매우 중요한 예를 찾을 수 있습니다.「C 인터페이스와 실장」에 자세하게 기재되어 있습니다.

챕터 전체를 읽고 "얻기"를 위한 포인터의 개념을 이해하는 것이 좋습니다.

void *를 사용하면 함수가 특정 유형일 필요가 없는 포인터를 사용할 수 있습니다.예를 들어 소켓 기능에서는 다음과 같은 기능이 있습니다.

send(void * pData, int nLength)

예를 들어, 여러 가지 방법으로 부를 수 있다는 것을 의미합니다.

char * data = "blah";
send(data, strlen(data));

POINT p;
p.x = 1;
p.y = 2;
send(&p, sizeof(POINT));
void*

는, 「어떤 타입이 보존되어 있는지를 가정하지 않고 메모리에 보존한다」입니다.예를 들어 인수를 기능에 전달하고 이 인수가 여러 유형으로 기능할 수 있는 경우 각 유형을 처리할 수 있습니다.

C11 standard (n1570)© 6.2.2.3 al1 p55 에서는 다음과 같이 기술되어 있습니다.

void포인터에서 임의의 객체 유형으로 변환할 수 있습니다.임의의 오브젝트 타입에 대한 포인터는 무효화 후 다시 되돌리기 위한 포인터로 변환할 수 있습니다.결과는 원래의 포인터와 동일하게 비교됩니다.

이 일반 포인터를 사용하여 모든 개체 유형에 대한 포인터를 저장할 수 있지만 일반적인 산술 연산을 사용할 수 없으며 참조할 수도 없습니다.

보이드 포인터는 범용 포인터라고 불립니다.readread pthread 시시 시나 시명 시명 thth thth thth thththth

스레드 함수의 프로토타입은 다음과 같습니다.

void *(*start_routine)(void*)

pthread API 설계자는 스레드 함수의 인수와 반환 값을 고려했습니다.이러한 것이 범용화 되어 있는 경우는, 인수로서 송신중에 cast to void* 라고 입력할 수 있습니다.또, 마찬가지로, 반환치는 void* 로부터 취득할 수 있습니다(단, 스레드 함수로부터 반환치를 사용한 적은 없습니다).

void *PrintHello(void *threadid)
{
   long tid;

   // ***Arg sent in main is retrieved   ***
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      //*** t will be type cast to void* and send as argument.
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);   
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }    
   /* Last thing that main() should do */
   pthread_exit(NULL);
}

포인터 http://www.cplusplus.com/doc/tutorial/pointers/ 에 관한 이 기사를 참조해, 「void pointers」의 장을 읽어 주세요.

이것은 C 언어에도 유효합니다.

포인터의 보이드 타입은 특수한 타입의 포인터입니다.C++에서 보이드는 타입의 부재를 나타내므로 보이드 포인터는 타입이 없는 값(그리고 길이와 참조 해제 속성도 결정되지 않음)을 가리키는 포인터입니다.

이를 통해 void 포인터는 정수 값 또는 부동 문자 문자열에 이르기까지 모든 데이터 유형을 가리킬 수 있습니다.단, 이 경우 데이터 참조에 의해 지적된 데이터는 직접 참조할 수 없습니다(논리적으로 참조할 유형이 없기 때문에 참조를 취소하기 전에 항상 특정 데이터 유형을 가리키는 다른 포인터 유형에 주소를 할당해야 합니다).

이 링크를 사용하여 포인터에 대한 자세한 정보를 얻을 수 있습니다.http://www.cprogramming.com/tutorial/c/lesson6.html

a void*는 포인터입니다만, 포인터가 가리키는 타입은 지정되어 있지 않습니다.보이드 포인터를 함수에 넘긴 경우 해당 함수의 나중에 올바른 유형으로 다시 캐스팅하여 사용할 수 있도록 해야 합니다.에 예를 나타냅니다.pthreads이 예에서는 스레드 함수로 사용되는 시제품과 동일한 함수를 사용합니다. 다음 '어울리다'를 .void*선택한 일반 데이터 유형에 대한 포인터로서 인수를 선택한 다음 스레드 함수 내에서 사용할 해당 유형에 다시 캐스팅합니다.void 포인터를 사용할 때는 주의해야 합니다.단, 실제 타입의 포인터로 되돌리지 않는 한 모든 종류의 문제가 발생할 수 있습니다.

함수는 임의의 타입으로 포인터를 가져와서 그 타입을 반환합니다.

언급URL : https://stackoverflow.com/questions/11626786/what-does-void-mean-and-how-to-use-it

반응형