2012-12-30 3 views
5

어떻게 정수형 변수에 주소를 할당 할 수 있습니까? 컴파일러는 오류를주지 않습니다. 난 당신은 당신은 문자 변수에 대해 동일한 작업을 수행 할 수정수 변수에 주소 할당

int a=0x28ff1c 

변수 정수에 정수 값을 지정할 수 있습니다 항상 불구하고, 컴파일러는 오류를 콘솔에 그것은 것

char b=0x28ff1c 

출력을 제공하지 않습니다 화면 쓰레기 문자 B의 값과

cout<<b 
    <<endl; 
cout<<a; 

누군가가 문자 B의 출력에 차이가 왜 나에게 설명하고를 int로 할 수 인터넷 용 임의의 값입니다. 누군가 char 변수와 정수 변수에 주소를 할당 할 수있는 이유를 설명 할 수 있습니까?

+3

'0x28ff1c'는 정수 값을 _is_ @Luchian 고르하여 답을 사용하는 구조로 *(int *)(Address) = value을 사용할 수 있습니다. – Mat

답변

5

숫자 0x28ff1c은 십진수 (기본 -10) 숫자 2686748의 16 진수 (16 진수) 표현입니다. cout은 기본적으로 정수에 대한 10 진수 값을 인쇄하기 때문에 인쇄 된 숫자 일 것입니다.

char b = 0x28ff1c의 경우와 약간 다릅니다,

  1. char 그 값을 보관 유지하는데 충분한 크기가 아닌 때문이다. 실제 결과는 0x1c으로 잘립니다.
  2. cout은 일반적으로 텍스트 데이터를 보관하는 데 사용되므로 cout은 어떤 종류의 제어 문자 인 코드 0x1c이있는 문자를 인쇄하므로 특별히 char을 처리합니다. 예를 들어 0x41으로 시도해 볼 수 있습니다 (ASCII 및 UTF-8로 'A'을 나타냄).

그리고 0x28ff1c을 주소로 표시하는 것이 없습니다. 주소는 &a 또는 (void*)0x28ff1c으로 구성됩니다.

+0

감사합니다. 감사합니다. – Computernerd

+0

'(char *) 0x28ff1c'가 더 안전합니다. ('0x28ff1c'가'int'를 위해 올바로 정렬되어 있음을 보장 할 수 없다면) - cc. @Lim 보너스 질문 - 결과가 잘리는가, 아니면 오버플로 때문에 정의되지 않은 동작입니까? (char가 서명 된 것을 고려하십시오)? –

+0

@LuchianGrigore 구현 정의 ('CHAR_BIT> = 23 '을 제외하고), 포화되거나, 자르거나, 모든 범위를 벗어나는 값을 13으로 매핑 할 수 있습니다. 구현은 단지 그것이하는 일을 문서화해야합니다. C에서는 구현 정의 된 신호를 발생시킬 수도 있습니다. –

8

0x28ff1c은 주소 자체가 아닙니다. 단지 16 진수 일뿐입니다.

다음은 해당 :

int a = 2686748; //decimal number 
int a = 0x28ff1c; //hexadecimal number 
int a = 012177434; //octal number 

주소가 포인터로 표현된다 - 그것은 단지의 경우, 주소, 당신은 void* 사용할 수 있습니다

void* p = (void*)0x28ff1c; 

에서이 경우

int a = p; 

은 컴파일되지 않습니다. p은 주소이므로 숫자 자체는 아닙니다.

+0

@Luchin int a와 char b의 출력의 차이를 어떻게 설명합니까? char에 정수 값을 할당 할 때 complier가 에러를 내지 않는 이유는 무엇입니까? – Computernerd

+0

@Lim char는 1 바이트 뿐이므로 저장할 수 없습니다 전체 가치. 경고 *를 발행 할 수는 있지만 필수 사항은 아닙니다. 기본적으로'char' 변수를 오버플로했습니다 (잘못된 결과를 출력합니다). –

+0

@ Luchin 감사합니다 – Computernerd

1

시작 문자는 실제로 정수입니다. 그래서 허용됩니다. 주소 인 경우가 정수일 수 있습니다.

+0

주소는 정수가 아닙니다. 많은 구현에서 문제없이 주소를 정수로 변환 할 수 있습니다. 일부 구현 예에서, 어드레스는 단일 정수로 잘 표현되지 않는 구조를 가질 수있다 (예를 들어, 어드레스의 인코딩에 1을 가하는 것은 메모리에서 1 바이트 더 멀리있는 어드레스를 생성하지 않을 수 있음). –

+0

좋은 지적 @EricPostpischil. "때로는 주소가 정수가 될 수 있습니다"라고 말하겠습니다. –

+0

@EricPostpischil 어떻게 관련이 있는지 모르겠습니다. 허락 해 주겠지 만,'int'는 주소를 담을 수는 없지만 포인터 연산은 여기에 의문의 여지가 없습니다. 당신이 지적한 바는 (주소에 추가하는 것보다) 훨씬 더 복잡합니다 (심지어 UB로 이어질 수도 있음). –

0

또한 valueAddress에를 할당하십시오 및