게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
포인터를 확인해봅시다
게시물ID : programmer_1128짧은주소 복사하기
작성자 : 사쿠라
추천 : 1
조회수 : 2032회
댓글수 : 1개
등록시간 : 2014/02/10 11:45:16
#include stdio.h
#include conio.h // _getch(); 를 사용하기 위하여

/*
 a라는 변수를 선언하면 프로그램은 메모리의 4바이트 공간을 a라는 이름으로 사용합니다.
 전역변수의 경우 미리 정해놓은 영역, 지역변수의 경우 함수 또는 해당 블럭이 실행되는 동안
 스택에 잠시 할당받은 공간을 이용하지만 모든 것은 중요하지 않습니다.
 결a는 메모리의 공간이기 때문입니다.

 본문에 사용되는 LPBYTE 는 BYTE *, unsigned char * 와 같습니다.
 (LPBYTE) 는 (BYTE *) 또는 (unsigned char *) 로 바꾸셔도 된다는 말입니다.
*/

int main(int argc, char *argv[])
{
// a라는 공간 안에 1 이라는 값을 대입합니다.
int a = 1;
// 잘 들어갔는지 확인해봅니다.
printf("%d\n", a);
/*
 여기서 포인터를 사용하기 위해서 알아두셔야할 부분이 있습니다.
 컴퓨터는 메모리에 값을 거꾸로 저장합니다.
 int는 4바이트지만 1을 저장하면 즉 00 00 00 01 이지만 01, 00, 00, 00 으로 저장이 됩니다.
*/

// int 는 4바이트라서 +1 을 하면 주소를 4바이트만큼 더합니다.
printf("%x %x %x %x\n", &a, ((LPBYTE)(&a)+1), ((LPBYTE)(&a)+2), ((LPBYTE)(&a)+3));
// 변수의 값을 1바이트씩 확인해봅시다.  a의 4바이트를 1바이트씩 보려면 &(a) 의 앞에 (unsigned char *) 를 붙여야합니다
// 그래야 주소가 1바이트씩 더해집니다. ( 주소의 더하기는 변수의 형태를 따릅니다, int는 4바이트라서 4씩 더해집니다 )
printf("%2d %2d %2d %2d\n", *(LPBYTE)(&a), *(LPBYTE)((LPBYTE)(&a)+1), *(LPBYTE)((LPBYTE)(&a)+2), *(LPBYTE)((LPBYTE)(&a)+3));

// *는 값, &는 주소입니다.
*(int *)(&a) = 2;
/*
이것을 직역하면 아래와 같습니다.
값을수정하자(int 형태의 값)(a의 주소) = 2; <==========
a주소의 값을 2로 수정하자
int는 4바이트 입니다. int 형태의 값 이라는것은 4바이트만큼을 수정하겠다는 의미입니다.
확인해봅시다.
*/
printf("%x %x %x %x\n", &a, ((LPBYTE)(&a)+1), ((LPBYTE)(&a)+2), ((LPBYTE)(&a)+3));
printf("%2d %2d %2d %2d\n", *(LPBYTE)(&a), *(LPBYTE)((LPBYTE)(&a)+1), *(LPBYTE)((LPBYTE)(&a)+2), *(LPBYTE)((LPBYTE)(&a)+3));
/*
응용하면 *(unsigned char *)(&a) = 3; 로 사용할수도 있습니다.
주소 a의 값을 1바이트만큼 3으로 바꾸겠다는 내용입니다.
확인해봅시다.
*/
*(LPBYTE)(&a) = 3;
printf("%x %x %x %x\n", &a, ((LPBYTE)(&a)+1), ((LPBYTE)(&a)+2), ((LPBYTE)(&a)+3));
printf("%2d %2d %2d %2d\n", *(LPBYTE)(&a), *(LPBYTE)((LPBYTE)(&a)+1), *(LPBYTE)((LPBYTE)(&a)+2), *(LPBYTE)((LPBYTE)(&a)+3));

/*
이번에는 a 주소에 +1한 주소의 값을 1바이트만큼 4로 수정해봅시다.
그리고 결과를 확인합니다. 아마 잘 수정되었을겁니다
*/
*(LPBYTE)((LPBYTE)(&a)+1) = 4;
printf("%x %x %x %x\n", &a, ((LPBYTE)(&a)+1), ((LPBYTE)(&a)+2), ((LPBYTE)(&a)+3));
printf("%2d %2d %2d %2d\n", *(LPBYTE)(&a), *(LPBYTE)((LPBYTE)(&a)+1), *(LPBYTE)((LPBYTE)(&a)+2), *(LPBYTE)((LPBYTE)(&a)+3));

_getch();
return 0;
}


여기에 코딩하며 컴파일은 해보지 않았습니다 에러 있으면 알려주시고 고칠 부분이 있다거나
설명이 필요한 부분이 있으면 말씀해주세요
이것을 이해하고 응용할수 있다면 1차원적 포인터는 마스터입니다.

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호