2014-09-22 5 views
4

필자는 C Primer Plus 책을 거의 완성했으며 Structures and Unions, 등등을 치려고합니다. 그러나 키워드 무효가 정확히 무엇인지 완전히 이해하지 못했습니다. 무효는 무엇입니까? 어떻게 작동합니까? 언제 사용해야합니까?정확히 어떤 유형의 무효이며 어떻게 작동합니까?

은 내가

void function(void) 

은 기본적으로 더 리턴 값이 없음을 말한다 것을 이해합니다. 인수가 없습니다. 난 당신이 다른 시나리오를 사용할 수 있다는 것을 알고 ,

int function(void); //has a return of type int -- voids args 
void function(int); //voids return type -- takes type int as an arg 

는 나 또한

void * p = 0L; 

이 유효한 코드가 있음을 이해하고 포인터 - 투 - 무효 긴 0의 초기화 값은 기본적으로 있다고.

하지만 그런 방법

void k = 0; 

에서 사용하는 값이나 목적이있다거나 난 그냥 데이터 유형을 무효화 무엇입니까? 그렇다면 데이터 유형을 무효 화하는 데 어떤 유용성이 있습니까? 내가 추측 할 수 있었던 것, 그것이 undefinable 데이터 유형과 같은

size_t fwrite(const void * restrict ptr, ...more args...); 

첫 번째 인수가 고정 된 유형이 아니므로 작업을위한 기능과 포인터에 매우 유용에서 내 책이 설명하기 때문에 "전제 ANSI C는이 인수에 대해 char * 유형을 사용하므로 실제 인수를 해당 유형에 타이프 캐스팅해야합니다."

데이터 형식을으로 사용할 수 있습니까? 그렇다면이 포인터와 함수로 제한됩니다 ?

다시 ... 나는 int를 void로 변환하는 방법에 관심이 없습니다. 나는 pointer-to-void valid와 관련이 없지만 단순히이 키워드를 효과적으로 사용하는 방법에 관심이있다. 나는 "언제 사용해야합니까?" 및 "어떻게 사용해야합니까?"

미리 답변 해 주셔서 감사합니다.

답변

6

void k = 0;

아니오, 그 문장이 이해가되지 않는 방식으로 그것을 사용하는 값이나 목적이있다, 그리고 컴파일러는 불완전한 유형에 대해 불평 할 것이다 . 당신이 유형 선언에 사용 void을 볼 때마다,이 같은 포인터를 표시하는 * 다음 있다고주의 :이 경우

void *foo = nil; 

, 당신은 정말 foo 포인터이다 컴파일러를 말하는거야 foo을 만들기 위해 알아 두어야 할 모든 것. *이 없으면 유형이없는 변수를 선언하려고 시도하고 있는데, 이는 컴파일러 (또는 그 사람과 관련하여)가 사용할 수있는 것이 아닙니다.

첫 번째 인수가 고정 된 형식이 아니기 때문에, 내 책은 "포인터에 대한 포괄 형 '인 것으로이 설명

첫 번째 인수 는"고정 타입 "입니다 - 유형 포인터입니다. 포인터가 가리키는 형식이 지정되지 않았지만 매개 변수 자체가 포인터 인 것은 사실입니다.

모든 데이터 유형을 사용할 수 있습니까?

포인터은 모든 유형의 데이터에 사용할 수 있습니다. fwrite()은 해당 유형의 크기, 객체 수 및 파일 포인터를 포함하여 일부 유형의 객체 배열에 대한 포인터를 가져 와서 해당 객체를 파일에 기록합니다. fwrite()은 객체의 유형을 신경 쓰지 않지만 유형 정보가 없으므로 크기와 수를 명시 적으로 전달해야합니다.

+2

감사합니다. 나의 책 didnt는 많은 세부에 들어간다. 이는 이러한 데이터 유형으로 인해 잠재적으로 발생했던 사항에 대한 필자의 이해 부족한 부분을 명확히하는 데 도움이됩니다. 또한 포인터가 내 기억에서 미끄러지는 형식 인 것을 상기시키는 것이 도움이됩니다. C 신참을 도와 주셔서 감사합니다. 이것은 나의 첫 번째 "실제 프로그래밍 언어"이며, 내가 공부할 때 더 많은 기본 개념을 이해하려고 노력하고있다. – jargonjunkie

3

void 유형이 사용되는 세 가지 기본 상황이 있습니다. 약간의 다른 한계 상황이있을 수 있지만,이 세 곳에서 void이 사용 된 곳이 아마 99 % 일 것입니다.

"void"는 "데이터 유형"에서와 같이 "여기에 유형이 없습니다"라는 것을 명심하십시오.

1) 일부 값을 반환하는 함수가 아니라 값을 반환하지 않는 함수를 선언하십시오.

2) 하나 이상의 매개 변수를 취하는 함수 대신 매개 변수를 사용하지 않는 함수를 선언하십시오.

3) "void에 대한 포인터"상황.

세 번째 경우는 기본적으로 일반 포인터를 정의합니다. ... something에 대한 포인터. 포인터를 처리하는 코드 섹션에서는이 "something"이 중요하지 않습니다.

예를 들어, 여기에 memcpy() 함수에 대한 매뉴얼 페이지의 :

MEMCPY(3)     Linux Programmer's Manual     MEMCPY(3) 

NAME 
     memcpy - copy memory area 

SYNOPSIS 
     #include <string.h> 

     void *memcpy(void *dest, const void *src, size_t n); 

DESCRIPTION 
     The memcpy() function copies n bytes from memory area src to memory 
     area dest. The memory areas must not overlap. Use memmove(3) if the 
     memory areas do overlap. 

당신은 매뉴얼 페이지를 자신의 나머지 부분을 읽을 수 있습니다. memcpy()는 복사 할 메모리 블록을 지정하는 몇 가지 포인터를 사용합니다. memcpy()는 포인터가 가리키는 곳을 신경 쓰지 않습니다. 그것을 알아야 할 필요가 없으므로 함수 프로토 타입은 포인터가 전달 될 수 있도록 지정합니다. 포인터는 int, 포인터는 char 또는 일부 클래스 인스턴스의 포인터입니다.

+0

감사합니다. 이것은 칼렙이 위에서 말한 것을 분명히하는 데 도움이되었습니다. – jargonjunkie