노트 : 이 답변은 C ++가 아닌 C 언어에 적용됩니다.
널 포인터
정수 상수 리터럴 0
은 사용되는 컨텍스트에 따라 다른 의미를 갖습니다. 모든 경우에 여전히 값을 갖는 정수 상수입니다.0
이며 다른 방식으로 설명되어 있습니다.
포인터가 상수 리터럴과 비교되는 0
경우 포인터가 널 포인터인지 확인합니다. 이것은 0
다음 널 포인터 상수라고합니다. C 표준은 0
유형에 캐스트되는 것을 정의합니다.void *
널 포인터 및 널 포인터 상수 .
또한 가독성을 높이기 위해 매크로 NULL
가 헤더 파일에 제공됩니다 stddef.h
. 컴파일러에 따라 다음이 가능할 수 있습니다.#undef NULL
이상한 것으로 다시 정의 할 .
따라서 다음은 널 포인터를 확인하는 올바른 방법입니다.
if (pointer == NULL)
NULL
널 포인터와 동일하게 비교하도록 정의됩니다. NULL
유효한 널 포인터 상수 인 한 실제 정의가 무엇인지 정의 된 구현 입니다.
if (pointer == 0)
0
널 포인터 상수의 다른 표현입니다.
if (!pointer)
이 if
문장은 "is not 0"을 암시 적으로 확인하므로 "is 0"을 의미하는 것으로 바 꾸었습니다.
다음은 널 포인터를 확인하는 잘못된 방법입니다.
int mynull = 0;
<some code>
if (pointer == mynull)
컴파일러에게 이것은 널 포인터 검사가 아니라 두 변수에 대한 동등 검사입니다. 이것은 아마도 작업 mynull가 결코 코드를 변경하지 않고 문 경우 컴파일러 최적화 상수가에 0 배,하지만이 보장되지 않으므로 컴파일러는 C 표준에 따라 적어도 하나의 진단 메시지 (경고 또는 오류)를 생산하는 경우.
C 언어에서 널 포인터는 무엇입니까? 기본 아키텍처에서는 중요하지 않습니다. 기본 아키텍처에 주소 0xDEADBEEF로 정의 된 널 포인터 값이있는 경우이 엉망을 분류하는 것은 컴파일러의 책임입니다.
따라서이 재미있는 아키텍처에서도 다음 방법은 여전히 널 포인터를 확인하는 유효한 방법입니다.
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
다음은 널 포인터를 확인하는 잘못된 방법입니다.
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
이것들은 컴파일러에 의해 일반적인 비교로 볼 수 있습니다.
널 문자
'\0'
은 널 문자로 정의됩니다. 즉, 모든 비트가 0으로 설정된 문자입니다. 이것은 포인터와 관련이 없습니다. 그러나이 코드와 비슷한 것을 볼 수 있습니다 :
if (!*string_pointer)
문자열 포인터가 널 문자를 가리키는 지 확인
if (*string_pointer)
문자열 포인터가 널이 아닌 문자를 가리키는 지 확인
널 포인터와 혼동하지 마십시오. 비트 표현이 동일하기 때문에 편리한 크로스 오버 케이스가 가능하기 때문에 실제로는 동일하지 않습니다.
또한 '\0'
모든 문자 리터럴과 마찬가지로 정수 상수이며이 경우 값은 0입니다. 따라서 '\0'
unadorned 0
integer constant 와 완전히 동일 합니다. 유일한 차이점은 인간 독자에게 전달 하려는 의도 입니다 ( "Null 문자로 사용하고 있습니다").
참고 문헌
자세한 내용 은 comp.lang.c FAQ의 질문 5.3을 참조하십시오 . C 표준에 대해서는 이 pdf 를 참조하십시오 . 섹션 6.3.2.3 포인터, 단락 3을 확인하십시오.