2017-10-20 1 views
4

이 표현식의 결과는 동일합니까?포인터 연산 - 동일한 표현식입니까?

&(*ptr) += 4 // Expression 1 
ptr += 4 // Expression 2 

저는 주로 Java 개발자이며 VS2008에서 VS2015로 이전 프로젝트를 다시 컴파일해야합니다. 위의 첫 번째 행은 왼쪽 피연산자가 수정 가능한 l 값이 아니기 때문에 컴파일 오류가 발생합니다. 문제는 첫 번째 표현식 대신 두 번째 표현식을 사용할 수 있는지의 문제입니다.

ptr은 char*입니다.

통찰력 및/또는이 문제에 대한 도움에 매우 감사드립니다.

+0

그래서 첫 번째 _did_가 VS2008에서 컴파일됩니다. 만약 그렇다면, 컴파일러는 비표준적인 일을하고 있었고, 실제로'ptr'의 값을 변경했는지 또는 임시 포인터의 값을 변경하고 그 결과를 던져 버렸는지는 분명하지 않았습니다. 나는주의를 권고한다. –

+0

예. 컴파일러는 첫 번째 표현식에 액세스 할 수 없다는 것을 알고 있으므로 문제가 있음을 알게되었습니다. 두려워서 나는 끊임없이 일해 온 것을 바로 잡을 것입니다. – Sarynn

+3

첫 번째 것은 어리 석다. 솔직히 나는 그 요점이 무엇인지 알지 못했다. 나는 더 많은 맥락이 필요하다고 생각한다. 컴파일러가 임시 주소를 수정하려는 첫 번째 시도를 말하고 있기 때문에 컴파일하는 경우'ptr '에 아무런 영향을 미치지 않을 것이므로 항상 동일한 컴파일러를 사용하고 직접 볼 수 있기 때문에 그들은 동일하지 않습니다. – George

답변

1

&은 왼쪽 값의 주소를 반환하지만 그 자체로는 수정할 수 없으므로 &a에 할당 할 수 없으므로 (&a)++은 의미가 없습니다. 따라서 첫 번째 표현식은 정의 된 연산이 아닙니다. (따라서 왼쪽 피연산자의 오류는 수정 가능한 좌변 값이 아닙니다.) 또한 &(*ptr) = ptr은 포인터를 참조 해제 한 다음 주소를 가져 오는 것이므로 &(*ptr)은 유효한 구문 구조이므로 꽤 무의미합니다. 두 번째 명령문은 4 개의 메모리 주소 위로 포인터를 이동합니다.

그래서 진술은 동일하지 않습니다.

편집 : VS2008에서 컴파일 된 점에 흥미 롭습니다. 컴파일러는 수정 가능한 값으로 &을 정의해야합니다. 기본적으로 주소의 포인터를 만드는 것입니다. 이것은 아마도 컴파일러의 버그 일뿐입니다. 구문 론적으로 올바른 코드로 변환해야 할 경우 두 번째 표현식을 올바르게 수행해야합니다. ptr에 대한 최종 결과가 수정되기를 원한다고 가정하십시오. (어떤 문장이 + =를 사용하기 때문에, 나는 그것이 원하는 의미라고 생각한다).