1. void
void 키워드는 "빈 유형"이라는 개념을 나타냅니다. 그러나 여기서 "빈 유형"은 "모든 유형"을 의미하는 것이 아니라 존재하지 않음을 의미합니다. 즉, C/C++에서는 void a 문을 작성할 수 없으며 void 유형이 없습니다.
void는 "존재하지 않는다"는 의미인데, 이는 void의 두 가지 적용에서 반영될 수 있습니다.
1. void가 함수의 반환 값 유형으로 사용되는 경우 함수 반환 값이 존재하지 않습니다. 즉, 함수에 반환 값이 없습니다.
예:
void FunctionNoReturn_0(std::string strName)
{
std::cout << strName << std::endl;
return;
}
void FunctionNoReturn_1(std::string strName)
{
std::cout << strName << std::endl;
}
FunctionNoReturn_1 함수 본문 명시적인 Return 문이 없습니다. 그러나 함수에 반환 값이 없음을 나타내는 암시적 Return이 있습니다.
FunctionNoReturnType(void)
{
return 10;
}
C 언어에서 반환 값 유형을 제한하지 않는 모든 함수는 컴파일러에서 반환 정수 값으로 처리됩니다. 값을 반환하지 않는 대신. 따라서 FunctionNoReturnType 함수가 10을 반환하는 것이 맞습니다.
C++에서는 각 함수마다 반환 값 유형을 제한해야 하며 반환 값 제한은 허용되지 않습니다. 따라서 C++ 컴파일러는 FunctionNoReturnType에 오류를 보고합니다.
2. 함수의 매개변수 제한으로 void가 사용되면 함수 매개변수가 존재하지 않는다는 의미입니다. 즉, 함수에 형식 매개변수가 없다는 의미입니다.
예:
void FunctionNoArgument_0(void)
{
return;
}
void FunctionNoArgument_1()
{
return;
}
참고: void FunctionNoArgument_1(); 이는 공식적인 매개변수가 없음을 의미합니다.
C 언어에서는 FunctionNoArgument_1(10)이 유효합니다. 컴파일러는 오류를 보고하지 않습니다.
C 언어에서는 FunctionNoArgument_0(10)이 불법입니다. 컴파일러는 오류를 보고합니다.
C++ 언어에서 FunctionNoArgument_1(10)과 FunctionNoArgument_0(10);
은 모두 불법입니다. 컴파일러는 오류를 보고합니다.
C언어에서는 에러가 없어도 상관없습니다. 매개변수 10은 함수 실행 결과에 영향을 미치지 않기 때문입니다. 그러나 코드 유지관리는 숨은 피해를 입힐 수도 있고, 다른 사람에게 오해를 불러일으킬 수도 있습니다.
설명: void 의 두 가지 용도가 제공되므로 이를 사용하세요. 즉, 함수가 값을 반환하지 않으면 반환 값 유형은 void로 작성되고, 함수에 형식 매개변수가 없으면 형식 매개변수는 void로 작성됩니다. 이해하지 못한다면 컴파일러의 기본 동작에 의존하지 마십시오. 기본 동작을 알고 있더라도 그것에 의존하지 마십시오. 분명히 그것을 이해하지 못하는 사람이 있을 것이고, 다른 사람들은 여러분의 코드를 이해하지 못할 것이기 때문입니다.
2. void*
void*는 "null 유형 포인터"를 의미하며 void*는 "모든 유형의 포인터" 또는 "포인터가 주소 값과 관련되어 있음"을 의미합니다. , 그러나 이 주소의 개체 유형을 알 수 없습니다." (모든 유형의 데이터를 나타내기 위해 void를 사용하지 않는 이유는 무엇입니까? 우리 모두 알고 있듯이 C/C++는 정적으로 유형이 지정되는 언어입니다. 변수를 정의하면 메모리가 할당됩니다. 그러나 다양한 유형의 변수는 서로 다른 메모리를 차지합니다. type, 메모리 할당 방법은 무엇입니까? 따라서 C 및 C++에는 어떤 유형의 변수도 없습니다. 그러나 int*, char*, string*, Student* 등 모든 포인터 유형 변수에는 동일한 메모리 공간이므로 "모든 유형의 포인터"를 정의할 수 있습니다.
C++/ANSI C:
void* 포인터는 몇 가지 제한된 작업만 지원합니다. 다른 포인터와 비교하거나 함수에서 void* 포인터를 반환하여 다른 void* 포인터 할당을 제공합니다. . void* 포인터는 가리키는 개체를 조작하는 데 사용할 수 없습니다. 예를 들어 void* 포인터는 역참조할 수 없습니다. void* 포인터에 대한 산술 연산은 허용되지 않습니다.
GNU C:
GNU C는 void* 포인터에 대한 산술 연산이 char*와 일치하도록 지정합니다.
void*는 "모든 유형의 포인터"를 의미하며 주로 메모리 연산 함수의 형식 매개변수 유형 및 반환 값 유형에 사용됩니다(메모리 연산은 메모리의 데이터 유형과 관련이 없습니다. 즉, , 모든 유형이 허용됩니다).
memcpy
프로토타입: extern void *memcpy(void *dest, void *src, unsigned int count)
사용법: #include
기능: 가리키는 메모리 영역에서 복사 횟수 src 바이트로 dest가 가리키는 메모리 영역으로 이동합니다.
참고: src와 dest가 가리키는 메모리 영역은 겹칠 수 없으며 함수는 dest에 대한 포인터를 반환합니다.
참고: strcpy와 비교할 때 memcpy는 '