void * a = & a는 어떻게 합법적입니까? 다음 C ++ 코드를

다음 C ++ 코드를 고려하십시오.

void* a = &a;

컴파일러가 선언되지 않은 식별자 사용에 대해 불평하지 않는 이유는 무엇입니까?

또한 컴파일러는 변수 a를 무엇으로 간주 합니까? void 객체에 대한 void*포인터입니까 아니면 포인터에 대한 포인터입니까?



답변

C ++에서 변수 선언의 범위는 매우 놀랍습니다.

void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on

따라서, &a이다 void**그러나 어떤 포인터 형식 이후에 암시 적으로 변환입니다 void*


답변

다음과 같습니다.

void* a;
a = &a;

따라서 a선언되었습니다. 그래서 aa쓰여진 주소를 얻 습니다 a. 그래서 그것은 void 포인터에 대한 포인터입니다. (아직 개체를 정의하지 않았습니다.)


답변

에서 void* a, a아닌 포인터로 선언 void유형하지만 “모든”유형 (특별한 경우)에. a물론 선언되는 다른 변수와 마찬가지로 주소 (메모리의 위치)가에 할당됩니다 .

그 후, 방금 선언 된 &a변수를 초기화하기 위해 표현식 이 평가됩니다 ( a이는 관련이 없습니다). 의 유형 &a은 “모든 유형에 대한 포인터에 대한 포인터”이며, “모든 유형에 대한 포인터”의 특수한 경우이며의 유형과 완전히 호환됩니다 a. Ergo, 컴파일러 메시지가 없습니다.

결과 : void*강력한 유형 검사를 원하는 경우 사용하지 마십시오 . 무엇이든 변환 할 수 있습니다. void*그 자체를 제외하고는 반대 방향으로 반대입니다 (유형이 자신과 호환되지 않는 것은 불필요한 예외입니다).

또한 AFAIR는 실제로 C에서 비롯됩니다.