void 포인터 사용법

4830 단어 포인터
먼저 테스트 코드를 살펴보겠습니다.
 1 #include <stdio.h>

 2 

 3 int void_test(void* data)

 4 {

 5     int num = 0;

 6     

 7     num = *(int*)data;

 8     printf("num = %d
", num); 9 10 } 11 12 int main() 13 { 14 int val; 15 16 val = 123; 17 void_test(&val); 18 return 0; 19 }

위 코드를 컴파일하여 실행하고 출력 결과는 다음과 같습니다.
num = 123
 
다음은void 유형 지침의 사용 방법에 대한 총결을 발췌한다.
1. void *는 모든 유형의 데이터를 가리킬 수 있습니다.
2.void가 진정으로 발휘하는 역할은 다음과 같다.
(1) 함수 반환에 대한 한정;
(2) 함수 매개 변수에 대한 한정.
3. 예:
  float *p1;
  int *p2;
  p1 = p2;
여기서 p1 = p2 문장을 컴파일하는 중 오류가 발생하여 "'=': cannot convert from 'int *' to'float * '를 표시합니다. 다음과 같이 변경해야 합니다.
  p1 = (float *)p2;
void *는 다른 유형의 포인터에 강제 유형 변환 없이 직접 값을 부여할 수 있습니다.
  void *p1;
  int *p2;
  p1 = p2;
4. 그러나 이것은void*도 강제 유형 변환 없이 다른 유형의 지침에 부여할 수 있다는 것을 의미하지 않는다.'무유형'은'유유형'을 포용할 수 있고,'유유형'은'무유형'을 포용할 수 없기 때문이다.이치는 매우 간단하다. 우리는'남자와 여자는 모두 사람이다'고 말할 수 있지만,'사람은 남자다'또는'사람은 여자다'라고 말할 수는 없다.다음 문을 컴파일하는 중 오류가 발생했습니다.
  void *p1;
  int *p2;
  p2 = p1;
알림 "'=': cannot convert from'void *'to'int *'.
15.void 사용:
규칙 1
함수에 반환 값이 없으면,void 형식으로 성명해야 합니다
규칙 2
만약 함수에 파라미터가 없다면, 그 파라미터가void라고 성명해야 한다.
규칙 3
void 포인터 형식 조심해서 사용하기
ANSI(American National Standards Institute) 표준에 따라 void 포인터에 대해 알고리즘 조작을 할 수 없습니다. 즉, 다음 조작은 모두 비합법적입니다.
  void * pvoid;
  pvoid++;//ANSI: 오류
  pvoid += 1;//ANSI: 오류
//ANSI 표준이 이렇게 인정된 이유는 알고리즘 조작을 하는 바늘은 반드시 그 지향 데이터 유형의 크기를 확실히 알아야 하기 때문이다.
//예:
  int *pint;
  pint++;//ANSI: 정답
pint++의 결과는sizeof (int) 를 증가시키는 것입니다.(VC6.0에서 sizeof(int)의 배수로 테스트)
그러나 명성이 자자한 GNU(GNU's Not Unix의 줄임말)는 void*의 알고리즘 조작이char*와 일치하도록 지정하지 않는다.
따라서 GNU 컴파일러에서 다음 문이 모두 정확합니다.
  pvoid++;//GNU: 정확
  pvoid += 1;//GNU: 정확
pvoid++의 실행 결과는 1이 증가했습니다.(VC6.0에서 sizeof(int)의 배수로 테스트)
실제 프로그램 설계에서 ANSI 표준을 준수하고 프로그램의 이식성을 높이기 위해 우리는 이렇게 같은 기능을 실현하는 코드를 작성할 수 있다.
  void * pvoid;
  (char *)pvoid++;//ANSI: 정확합니다.GNU: 정확
  (char *)pvoid += 1;//ANSI: 오류,GNU: 정확
GNU와 ANSI는 또 다른 차이점이 있는데 전체적으로 GNU는 ANSI보다'개방적'이며 더 많은 문법에 대한 지원을 제공한다.그러나 우리는 실제 디자인을 할 때 가능한 한 ANSI 표준에 영합해야 한다.
5. 규칙 4
만약 함수의 매개 변수가 임의의 형식 포인터일 수 있다면, 그 매개 변수는void*라고 성명해야 한다
  
메모리 작업 함수인 memcpy와 memset과 같은 일반적인 함수 원형은 다음과 같습니다.
  void * memcpy(void *dest, const void *src, size_t len);
  void * memset ( void * buffer, int c, size_t num );
이렇게 하면 모든 종류의 바늘이memcpy와memset에 전송될 수 있다. 이것은 메모리 조작 함수의 의미를 진실하게 나타낸다. 왜냐하면 이 조작의 대상은 단지 하나의 메모리일 뿐이고 이 메모리가 어떤 유형이든 상관없기 때문이다.만약memcpy와memset의 매개 변수 유형이void*가 아니라char*라면 정말 이상하다!이런memcpy와memset은 분명히'순수하고 저급한 취미에서 벗어난'함수가 아니다!
6. 규칙 5
void는 진실한 변수를 대표할 수 없습니다
다음 코드는 모두void가 진실한 변수를 대표하도록 하기 때문에 모두 잘못된 코드입니다.
  void a;//잘못
  function(void a);//잘못
void는 추상적인 것을 구현했다. 이 세상의 변수는 모두'유형이 있다'는 것이다. 예를 들어 한 사람이 남자가 아니면 여자이다(그리고 요괴?).
 
참조 링크:http://jingyan.baidu.com/article/6c67b1d68f93bb2786bb1e46.html

좋은 웹페이지 즐겨찾기