“int * ptr = int ()”값 초기화가 어떻게 불법이 아닌가?
다음 코드 ( 여기에서 가져옴 ) :
int* ptr = int();
Visual C ++에서 컴파일하고 포인터를 값 초기화합니다.
어떻게 가능합니까? 내 말 int()
은 유형의 객체를 산출 하고 포인터에을 int
할당 할 수 없음을 의미합니다 int
.
위의 코드가 불법이 아닌 이유는 무엇입니까?
int()
값이 0 인 상수 표현식이므로 널 포인터 상수를 생성하는 유효한 방법입니다. 궁극적으로 약간 다른 표현 일뿐입니다.int *ptr = NULL;
때문에 int()
수율 0
로 교체이다 NULL
. NULL
자체로 정의 0
C 년대와는 달리 NULL
입니다 (void *) 0
.
이것은 오류입니다.
int* ptr = int(5);
그리고 이것은 여전히 작동합니다.
int* ptr = int(0);
0
특수 상수 값이므로 포인터 값으로 처리 할 수 있습니다. 수율하는 정수 표현 0
등이뿐만 1 - 1
아니라 널 포인터 상수로 사용할 수 있습니다.
표현식 int()
은 기본값으로 초기화 된 상수 인 정수로 평가되며 값은 0입니다.이 값은 특별합니다. NULL 상태에 대한 포인터를 초기화하는 데 사용됩니다.
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을 가리 킵니다.
참고 URL : https://stackoverflow.com/questions/8067897/how-is-int-ptr-int-value-initialization-not-illegal
'IT story' 카테고리의 다른 글
Android의 활동에 서비스 바인딩 (0) | 2020.09.13 |
---|---|
Rake DSL 메소드에 대한 전역 액세스는 더 이상 사용되지 않습니다. (0) | 2020.09.13 |
'Maven 프로젝트 업데이트 중'중에 내부 오류가 발생했습니다. (0) | 2020.09.13 |
실행시 jar 파일에 매개 변수를 어떻게 전달합니까? (0) | 2020.09.13 |
네이티브 DLL 내보내기 기능 뷰어가 있습니까? (0) | 2020.09.13 |