값의 유형을 내 머리말을 붙일 수 없습니다. 에 의해 값, 여기 내 말은 왼쪽 값 또는 값? 이 단항 것으로 보인다 위의 코드에서, p
의 (증가 객체를 반환 접두사 대응과는 달리)에 unincremented 값을 반환 ++
후위 이후 지금C++의 Dereference 연산자
int i = 1, *p = &i;
cout << *p++; // Prints 1, so far so good.
:
는 다음 코드를 고려 *
은 유일한 피연산자로 rvalue를 허용합니다. 그러나,
cout << *i; // error: invalid type argument of unary ‘*’ (have ‘int’)
좋아요는 어쩌면 i
의 값은 유효한 메모리 주소를 나타내지 않습니다.
unsigned long add = p; // error: invalid conversion from ‘int*’ to ‘long unsigned int’ [-fpermissive]
cout << *add; // error: invalid type argument of unary ‘*’ (have ‘int’)
이 또한 나를 나의 다음 질문으로 제공 : 이제 *
단항 유효한 메모리 위치를 나타내는를 rvalue 작업을 할 수 있는지 확인하기 위해, 나는 이런 식으로 뭔가를 시도했다. unsigned long
의 크기를 64 비트라고 가정하면 (작업중인 시스템의 경우), 값을 p
(64 비트 메모리 주소가 될 수 있음)에 복사 할 수없는 이유는 무엇입니까? add
에? 또는 다른 말로하면, 비 포인터 유형의 변수에 메모리 주소를 저장하는 방법이 있습니까 (메모리 주소가 결국 값이기 때문에 가능하지 않다면 놀랄 것입니다).
감사
'*'는 포인터에서만 사용할 수 있습니다. 'i'와'add'는 포인터가 아닌 정수이므로'* i'와'* add' 코드는 실패합니다; 가치 범주와 관련이 없습니다. –
비트 수를 생각하지 마십시오. 'int'와'double'은 둘 다 123bits 길이가 될 수 있습니다. 그러나 다른 유형입니다. 'int'와'unsigned int'는 각각 62 비트가 될 수 있지만 타입이 다릅니다. 포인터와 정수는 둘 다 같은 수의 비트를 가질지라도 서로 다른 유형입니다. 대다수의 경우 포인터를 정수로 또는 그 반대로 변환 할 필요가 없습니다. 이것은 끔찍한 코드 냄새입니다. – chi