c++ - unsigned char*에서 char*로의 무효 변환




unsigned-char (3)

다음은 코드입니다.

  1 int main(int argc, char *argv[])
  2 {
  3     signed char S, *psc;
  4     unsigned char U,  *pusc;
  5     char C, *pc;
  6 
  7     C = S;
  8     C = U;
  9 
 10     pc = psc;
 11     pc = pusc;
 12 
 13     return 0;
 14 }

$ gcc test.cpp -o a
test.cpp: In function int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from signed char*’ to char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from unsigned char*’ to char*’ [-fpermissive]

이것은 gcc 버전 4.6.3에서 Intel 32 비트 컴퓨터의 Ubuntu 12.10에서 컴파일됩니다.

x86에서 char 유형이 unsigned char 임을 고려할 때 . -

포인터가 아닌 타입에 대해 7 번과 8 번에 대입하면 10 번과 11 번 라인의 포인터 타입에 에러가 발생하는 이유는 무엇입니까?

또한 C = U 가 캐스트를 요구하지 않고 성공해야합니까?


C ++에는 자동 포인터 변환이 없으며 할당의 각면에 포인터 유형이 무엇인지는 중요하지 않습니다. 포인터가 다를 경우 캐스트가 필요합니다.


우선, char , signed charunsigned char 이 모두 다른 유형 이라는 사실을 강조하는 것이 중요합니다. C ++ 11 표준의 섹션 4.10에서는 다양한 유형의 포인터 사이에서 가능한 세 가지 표준 포인터 변환을 정의합니다.

1 . 널 포인터 상수는 0 또는 std :: nullptr_t 유형의 prvalue로 평가되는 정수 유형의 정수 상수 표현식 (5.19) prvalue입니다. 널 포인터 상수는 포인터 유형으로 변환 될 수 있습니다. 결과는 해당 유형의 널 포인터 값이며 오브젝트 포인터 또는 함수 포인터 유형의 다른 모든 값과 구별 할 수 있습니다. 이러한 변환을 널 포인터 변환이라고합니다. 같은 타입의 2 개의 널 포인터 값은 같아야한다. null 포인터 상수를 cv 한정 유형에 대한 포인터로 변환하는 것은 단일 변환이며 포인터 변환의 순차가 아니며이어서 자격 변환 (4.4)이 수행됩니다. 정수형의 널 포인터 상수는 std :: nullptr_t 유형의 prvalue로 변환 될 수 있습니다. [참고 : 결과 prvalue는 널 포인터 값이 아닙니다. -end note]

여기에는 nulltptr_t 유형의 널 포인터가 없으므로 관련이 없습니다.

2. "cv T에 대한 포인터"유형의 prvalue는 T가 객체 유형 인 경우 "pointer to cv void"유형의 prvalue로 변환 될 수 있습니다. "cv T에 대한 포인터"를 "cv void에 대한 포인터"로 변환 한 결과는 마치 객체가 T 유형의 가장 많이 파생 된 객체 (1.8) 인 것처럼 T 유형의 객체가 상주하는 저장 위치의 시작을 가리 킵니다 (즉, 기본 클래스 하위 객체가 아닙니다). 널 포인터 값은 목적지 유형의 널 포인터 값으로 변환됩니다.

대상 유형이 void 가 아니므로 적용 할 수 없습니다. 마지막으로,

삼 . D가 클래스 형인 "cv D에 대한 포인터"유형의 prvalue는 "cv B에 대한 포인터"유형의 prvalue로 변환 될 수 있습니다. 여기서 B는 D의 기본 클래스 (10 절)입니다. B가 접근 할 수 없거나 (11 절) 모호한 (10.2) 기본 클래스가 있다면,이 변환을 필요로하는 프로그램은 잘못되었다. 변환 결과는 파생 클래스 객체의 기본 클래스 하위 객체에 대한 포인터입니다. 널 포인터 값은 목적지 유형의 널 포인터 값으로 변환됩니다.

signed charsigned char 의 기본 클래스가 아니므로이 경우에도 적용되지 않습니다.

따라서 signed char 에서 char 로의 암시 적, 표준 포인터 변환은 수행 할 수 없습니다.

한편, 정수형의 값 사이의 변환은 4.7 절에서 규정 한 것에 따라 허용된다.


charunsigned charsigned char 와 구별되는 유형입니다. 그 중 하나와 동등한 값 표현을 보장 할 수는 있지만 여전히 구별 유형입니다. 따라서 unsigned char* 또는 signed char*char* (즉, reinterpret_cast 를 사용하지 않는 한)로 변환 할 수 없습니다. C ++은 이와 같은 고유 한 유형간에 포인터 변환을 허용하지 않습니다. 한 유형이 다른 유형으로 위장 할 수 있기 때문입니다.

그러나 unsigned char 또는 signed char 에서 char 로의 변환은 값의 변환을 포함하기 때문에 완벽합니다.

이 방법을 고려해보십시오. intfloat 로 변환 할 수 있지만 int*float* 로 변환 할 수는 없습니다.





unsigned-char