(char)0 은 1바이트짜리, -128~127 범위를 가지는 char 타입의 정수로서 0.
(char*)0 은, (char 타입 데이터가 있는 곳을 가리키는) 포인터로서 NULL 포인터, 일반적으로 32bit 입니다.
64비트 머신이라면 64비트일 수도 있고, 16비트 머신이라면 16비트일 수도 있습니다.
포인터는 메모리상의 특정 영역(주소)을 나타내는 것이지만, NULL 포인터는 아무 것도 가리키지 않는 포인터가 됩니다(?).
문자열에 쓰이게 된다면 둘 다 NULL 문자로 인식되겠습니다만, 까다로운 컴파일러라면 경고 내지는 오류 메시지를 띄울겁니다.
정수 0은 포인터형의 변수에 대입되거나 포인터형으로 캐스팅이 될 때 널 포인터가 된다고 C 언어상에서 약속이 되어 있습니다.
대부분의 컴파일러에서 널 포인터는 내부적으로 주소 0번을 가리키지만 오래된 몇몇 시스템에서는 널 포인터 주소값이 0이 아닌 경우도 있었다고 합니다. 그러나 이런 시스템의 C 컴파일러라도 표준을 따른다면 char *p = 0;이라 했을 때 p는 무조건 널 포인터 값이 저장된 변수가 되어야 합니다. 이것은 마치 개행문자가 '\r\n'인 환경에서도 printf 함수로 '\n' 문자만 출력하면 자동으로 '\r\n'을 출력해주는 것과 비슷하다 할 수 있습니다.
웬만하면 널 포인터와 널 문자는 정확히 구분해서 사용하는 것이 좋습니다. 널 문자가 들어갈 곳에 NULL 매크로 상수를 사용한다던가 널 포인터가 사용될 곳에 '\0'을 사용한다던가 하는 일은 피하는 것이 좋지요. 또한 변수에 대입을 할 때 = 기호 양쪽의 데이터형을 맞추는 것은 기본 중의 기본입니다. 된다고 안심할 일이 절대로 아니죠.
(char)0 은 1바이트짜리, -128~127 범위를 가지는 char
(char)0 은 1바이트짜리, -128~127 범위를 가지는 char 타입의 정수로서 0.
(char*)0 은, (char 타입 데이터가 있는 곳을 가리키는) 포인터로서 NULL 포인터, 일반적으로 32bit 입니다.
64비트 머신이라면 64비트일 수도 있고, 16비트 머신이라면 16비트일 수도 있습니다.
포인터는 메모리상의 특정 영역(주소)을 나타내는 것이지만, NULL 포인터는 아무 것도 가리키지 않는 포인터가 됩니다(?).
문자열에 쓰이게 된다면 둘 다 NULL 문자로 인식되겠습니다만, 까다로운 컴파일러라면 경고 내지는 오류 메시지를 띄울겁니다.
전자는 char형 정수 0을 의미합니다.후자는 char *형 널
전자는 char형 정수 0을 의미합니다.
후자는 char *형 널 포인터를 의미합니다.
정수 0은 포인터형의 변수에 대입되거나 포인터형으로 캐스팅이 될 때 널 포인터가 된다고 C 언어상에서 약속이 되어 있습니다.
대부분의 컴파일러에서 널 포인터는 내부적으로 주소 0번을 가리키지만 오래된 몇몇 시스템에서는 널 포인터 주소값이 0이 아닌 경우도 있었다고 합니다. 그러나 이런 시스템의 C 컴파일러라도 표준을 따른다면 char *p = 0;이라 했을 때 p는 무조건 널 포인터 값이 저장된 변수가 되어야 합니다. 이것은 마치 개행문자가 '\r\n'인 환경에서도 printf 함수로 '\n' 문자만 출력하면 자동으로 '\r\n'을 출력해주는 것과 비슷하다 할 수 있습니다.
웬만하면 널 포인터와 널 문자는 정확히 구분해서 사용하는 것이 좋습니다. 널 문자가 들어갈 곳에 NULL 매크로 상수를 사용한다던가 널 포인터가 사용될 곳에 '\0'을 사용한다던가 하는 일은 피하는 것이 좋지요. 또한 변수에 대입을 할 때 = 기호 양쪽의 데이터형을 맞추는 것은 기본 중의 기본입니다. 된다고 안심할 일이 절대로 아니죠.
FYI.http://bbs.kldp.org/viewtopic.ph
FYI.
http://bbs.kldp.org/viewtopic.php?t=29882
---
http://coolengineer.com
댓글 달기