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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어로 2차원 문자열 배열을 함수에서 반환하는 방법c 언어를 사용하고 2차원 문자열 배열을 함수에서 main 함수로 반환하는 방법에 대한 메모를 남겨 둡니다. ※포인터 초보자이므로, 설명이 잘못되어 있으면 지적 부탁합니다. paiza.io에서 실행해 보면 아래와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.