다음 코드 ( 여기에서 가져옴 ) :
int* ptr = int();
Visual C ++에서 컴파일하고 포인터를 값 초기화합니다.
어떻게 가능합니까? 내 말 int()
은 유형의 객체를 산출 하고 포인터에을 int
할당 할 수 없음을 의미합니다 int
.
위의 코드가 불법이 아닌 이유는 무엇입니까?
다음 코드 ( 여기에서 가져옴 ) :
int* ptr = int();
Visual C ++에서 컴파일하고 포인터를 값 초기화합니다.
어떻게 가능합니까? 내 말 int()
은 유형의 객체를 산출 하고 포인터에을 int
할당 할 수 없음을 의미합니다 int
.
위의 코드가 불법이 아닌 이유는 무엇입니까?
int()
값 구성 값 산출 int
및 기본값 (나는 C ++ 03 지정된 것은 생각입니다) int
입니다 0
. 이것은 다음과 동일합니다.int *ptr = 0;
NULL
0이 아닌 값이 될 수 있다고 말하지 않았습니다 . 나는 그것이 0 값 정수 상수 (포함 int()
) 일 수 있다고 말했습니다 .
답변:
int()
값이 0 인 상수 표현식이므로 널 포인터 상수를 생성하는 유효한 방법입니다. 궁극적으로 약간 다른 표현 일뿐입니다.int *ptr = NULL;
nullptr
대신 0
또는 NULL
새 코드에서 사용할 수있는 .
0
null 포인터 상수 또는 숫자 0을 의미 할 수있는 반면 nullptr
null 포인터 상수는 분명하기 때문입니다. 또한 Jamin이 말했듯이 "추가 컴파일 시간 검사"도 있습니다. 입력하기 전에 생각하십시오.
때문에 int()
수율 0
로 교체이다 NULL
. NULL
자체로 정의 0
C 년대와는 달리 NULL
입니다 (void *) 0
.
이것은 오류입니다.
int* ptr = int(5);
그리고 이것은 여전히 작동합니다.
int* ptr = int(0);
0
특수 상수 값이므로 포인터 값으로 처리 할 수 있습니다. 수율하는 정수 표현 0
등이뿐만 1 - 1
아니라 널 포인터 상수로 사용할 수 있습니다.
(void *)0
. 이는 단순히 "값이 0 인 정수 상수 표현식 또는 void * 유형으로 캐스팅 된 표현식"으로 정의 된 구현입니다.
NULL
과 같이 정의 된 C 컴파일러를 사용한 적이 없습니다 (void*)0
. 항상 0
(또는 어쩌면 0L
). (하지만 C90이 (void*)0
C에서 합법화되었을 때 이미 C ++를 사용하고있었습니다.)
#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)
버전 에서 libio.h는 다음을 포함합니다 : 우분투에있는 gcc의 현재 버전은 4.5이고 우리 시스템에서는 4.0입니다.
0
은 특수 리터럴입니다"-상수 표현식이고 특수 값 0을 갖기 때문 (1-1)
입니다. 똑같이 특별하고 널 포인터 상수이기도합니다 int()
. 0
리터럴 이라는 사실 만으로도 충분하지만 상수 표현이되기위한 필수 조건은 아닙니다. 과 같은 strlen("")
것은 특별한 값을 가지고 있지만 0
상수 표현식이 아니므로 널 포인터 상수가 아닙니다.
0
는 0
리터럴이 아닌 상수 값에 관한 것 입니다.
표현식 int()
은 기본값으로 초기화 된 상수 정수로 평가되며 값은 0입니다.이 값은 특별합니다. NULL 상태에 대한 포인터를 초기화하는 데 사용됩니다.
int f() { return 0; }
, 표현식 f()
은 값 0을 산출하지만 포인터를 초기화하는 데 사용할 수 없습니다.
n3290 (C ++ 03은 유사한 텍스트 사용)에서 4.10 포인터 변환 [conv.ptr] 단락 1 (강조는 내 것임) :
1 널 포인터 상수는 0으로 평가되는 정수 유형의 정수 상수 표현식 (5.19) prvalue 또는 std :: nullptr_t 유형의 prvalue입니다. 널 포인터 상수는 포인터 유형으로 변환 될 수 있습니다. 결과는 해당 유형의 널 포인터 값이며 오브젝트 포인터 또는 함수 포인터 유형의 다른 모든 값과 구별 할 수 있습니다. 이러한 변환을 널 포인터 변환이라고합니다. [...]
int()
0으로 평가되는 정수 유형의 정수 상수 표현식 prvalue이므로 포인터 유형을 초기화하는 데 사용할 수 있습니다. 보시다시피, 0
는 특수한 경우에만 적분식이 아닙니다.
int는 객체가 아닙니다.
나는 여기서 무슨 일이 일어나고 있는지 당신이 int *가 int ()에 의해 결정된 메모리 주소를 가리 키도록 지시하고 있다고 믿습니다.
따라서 int ()가 0을 생성하면 int *는 메모리 주소 0을 가리 킵니다.
int()
가장 확실한 것은 객체입니다.
int()
. int i;
의문의 여지없이 정의 i
는 객체입니다.
int
유형 이기 때문에 참 입니다. int()
객체를 생성 하든 rvalue 만 생성 하든 다른 사람이 말한 것에 영향을 미치지 않습니다.