2011-11-03 2 views
0

이 행은 정확히 무엇을합니까? 이해 : int 주소에서 char 배열로 변환

(char*) (&input)

나는 그것이 INT (입력)으로 변환 알고 array..or은 내가 잘못을 CHAR? 어떻게 계산합니까?

갱신 : 나는 지금 조금 이해 생각, 나는 귀하의 의견

#include <cstdlib> 
#include <iostream> 

using namespace std; 
int main(){ 
int input = 123456; 
int *p = &input; 

char *cp = (char*)p; 

for(int counter = 0;counter <sizeof(input); counter++){   
     cout << *(cp+counter) << endl; 
     } 


system("pause"); 
return 0; 
} 

에서 C++ 코드를 생성하지만 난 내 코드가 잘못 생각합니다. '@', 큰 'r'만 표시하기 때문에? , 그리고 십자 기호 같은 것 ...

+0

어떻게'input'이 선언 되었습니까? – Johnsyweb

+0

나는 그것을 int 입력으로 선언했다; – jko

답변

1

char에 대한 포인터로 input의 주소를 전송 중입니다. char 이후

input의 주소에서 단일 바이트를 읽어 유용
unsigned char *bytes = (unsigned char*)&input; 

, 크기의 바이트입니다 : 당신은 같은 약간 다른 것을 볼 수 있습니다. char 서명과 -128에서 128의 범위 유의 unsigned char는 동안 (명백하게) 서명과 서명되지 않은 그리고 당신은 다음과 같은 특정 바이트를 읽을 수 255

0 범위로 바이트를 읽어보다 적절한 :

first_byte = bytes[0]; 

아니면 당신과 같은 특정 바이트 설정할 수 있습니다 :

bytes[0] = 0x7E; 
1

input이 정수인 경우 해당 주소의 바이트 블록을 마치 (아마도 서명 된) 문자 인 것처럼 읽습니다. 입력 (바이트 순서 같은 세부 무시)하고 값 1234567890 숯 *의 값부터 0x49 0x96을 0x02로 0xD2

을 가리킬 것이다 있었다 그렇다면

그것은 정수의 주소를 얻어

1

(포인터 투 INT) 포인터를 char에 대한 포인터로 변환합니다. 그런 다음 해당 포인터를 사용하여 정수의 바이트를 한 번에 하나씩 읽을 수 있습니다.

+0

예. 0x22ff44..i를 얻었습니다. 아직도 그것을 얻지 못합니다 .. 어떻게 바이트를 읽을 것입니까? 당신은 예를 들어주세요 :) – jko

+0

int i = 12345; const char * pi = (const char *) & i; (int i = 0; i

3

그것은 아무것도 "변환"하지 않습니다. 단순히 정수의 첫 번째 바이트를 가리키고 있습니다. 당신이 char 포인터에 그 포인터를 캐스팅

다음
int myInt = 123456; 
int *ptr = &myInt; 

당신의 int 32 비트 (4 바이트)이며, 당신이 그것을에 대한 포인터가있는 경우 ... ...

char *cPtr = (char*)ptr; 

이제 정수의 첫 번째 바이트를 가리키는 char 포인터가 있습니다. 당신은을 통해 개별적으로 각 바이트를 볼 수 있습니다 char이 서명

int i; 
for (i = 0; i < sizeof(int); i++) 
{ 
    printf("%d\n", *(cPtr+i)); 
} 

하는 것으로, 그래서 일부 바이트 음수 바꿈 수 있습니다. 대신 unsigned char을 사용하면 해당 동작이 변경됩니다. 포인터 연산으로 인해 혼란 스럽다면 *(cPtr+i)cPtr[i]으로 바꿀 수 있으며 동일한 출력을 얻을 수 있습니다.

+0

당신은 * 위에 * 게시 한 코드에주의해야합니다. 몇개의 매우 중요한 장소에서'*'가 빠졌습니다. 선언에서'*'는 포인터를 선언한다는 것을 의미합니다. –

+1

여러분의 편집 코드는'cout'에 문자를 보내고'char *'유형이기 때문에 바이트를 인쇄 가능한 문자로 변환합니다 (기본 문자 세트, 아마도 UTF-8). 'cout' 스트림으로 보내면 실제로 바이트를'int'로 변환해야합니다 :'cout << (int) * (cp + counter) << endl;' –

+0

어떻게 얻을 수 있습니까? 그 바이트에 상응하는 바이트로 인쇄 – jko