본문 바로가기
Ghost의 Linux C Note(노트)/Ghost의 Linux C언어 포인터 Hexa

Ghost 기억속으로~~? @_@

by dark ghost 2012. 5. 8.
728x90
반응형

포인터를 이용하여 메모리 참조.

1. 변수에 unsigned char *ucp 라는 포인터 형 변수에 &inum 이라는 int 형 변수의 주소값을 넣는데 변수는 형동등성을 먼저 비교를 한다. 그런데 왼쪽에는 unsigned chat 포인터 변수인데 오른쪽은 int 형이다. 그래서 형을 동등하게 맞추기 위해서 *(unsigned char *)을 &inum 앞에 넣어주므로써 명시적 캐스팅을 한다.

그리고 printf("Address  ");로 먼저 출력을 하는데 반드시 Address는 2칸을 띄워놔야 한다.

for(icnt = 0; icnt <16; ++icnt)      

{

printf("%02X ", icnt);

}

2. for문을 쓴다고 선언하고 icnt는 0으로 초기화한다. 그리고 icnt가 16 보다 작을 때까지 즉 15가 될때 까지 돌린다는 것이다. 그럼 0에서 15까지면 16번까지 돌린다는 의미가 된다. 그리고 ++icnt는 값을 먼저 증가 시키고 넣겠다는 선행 증가식을 넣었다. 그렇게 해서 이 구문 전체를 보면 16번을 돌릴때 까지 1씩 증가를 시킨다는 것이다. 그리고 조건이 만족할때까지 for문 안의 printf("%02X", icnt); 구문을 돌리겠다는 것인데 즉 icnt는 자리를 증가 시켜 %02X 2자리로 16진수를 출력 시킨다. 

printf("     ASCII\n");

3. 빈 여백은 띄우고 ASCII를 출력 시키고 아래줄로 내려간다.

for(iloop = 0; iloop < 10; ++iloop)

4. for문으로 반복을 시키는데 iloop = 0 으로 초기화를 하고 iloop < 10 는 10보다 작을 때 까지 즉 9가 될때 까지 돌린다. ++iloop는 0에서 9가 될 때까지 1씩 증가 시킨다. 이 iloop는 아래로 내려 가는 줄을 10개까지 출력시키는 것이다.

{

printf("%08X ", ucp);

5. printf문으로 %08X는 8자리까지 16진수로 ucp를 출력 시킨다는 것이다.

for(icnt = 0; icnt < 16; ++icnt)

6.  for문으로 반복을 시키는데 icnt = 0 으로 초기화를 하고 iloop < 16 은 16보다 작을 때 까지 즉 15가 될때 까지 돌린다. ++icnt는 0에서 15가 될 때까지 1씩 증가 시킨다. 이 icnt는 옆 줄로 반복해서 돌리기 위해 쓰인다.

{

printf("%02X ", *(ucp + icnt)); 

}

7.  printf문으로 %02X는 2자리까지 16진수로 를 출력 시키는데 문제는 오른쪽항에 *(ucp + icnt)로 되어 있는 구문이다. 보통 일반적으로 ucp + icnt만 보면 덧셈을 하지만 ()앞에 *이 붙어 있는데 이 것이 포인터 즉 주소를 따라 가라는 것이다. *(ucp + icnt)는 ucp의 주소 값에 icnt의 주소 값 만큼 이동하라는 것이다.

 

for(icnt = 0; icnt < 16; ++icnt)

{

if(' ' <= *((signed char *)ucp + icnt))

 

8. for문은 위에서 나왔기 때문에 생략. if문 안에 ' ' 작은 따옴표는 아스키 코드로 스페이스 바를 나타내고 그 값이 ucp + icnt보다 작거나 같을때 이지만 형 동등성에서 작은 따옴표는 char 형이고 ucp + icnt는 int 형이기에 맞지가 않으므로 형을 같게 맞추기 위해서 캐스팅을 *(signed char *)로 해주므로 인해서 형을 같게 만들어 준다. 그럼 스페이스바의 아스키 코드값보다 ucp +  icnt 아스키 코드값이 크거나 같다면 이라는 조건이다..

{

printf("%c", *(ucp + icnt));

}

9. printf문으로 %c는 문자로 를 출력 시키고  ucp의 주소 값에 icnt의 주소 값 만큼 이동한 값의 주소를 따라 가 그 메모리에 있는 값을 %c를 통해 문자로 출력시킨다.

else

{

putchar('.');

}

}

10. 스페이스바의 아스키 코드값이 ucp + icnt 아스키 코드값보다 크다면이라는 조건일때 putchar로 ' '에 있는 점을 출력 시킨다. 그리고 정확히 해석을 하자면 else는 아니면 이기 때문에 코드 값보다 크다면이라는 해석이 아니다. 그 해석은 코드를 따로 해석 했기 때문에 헷갈리지 않기 위해서 해석 하다보니 그렇게 해석을 한것이다.

putchar('\n');

ucp = ucp + 16;

}

11. putchar는 위에서는 언급을 않했지만 한 문자를 출력 할때 사용 된다. 그리고 마지막에서 개행 문자인 \n을 사용 하여 엔터와 같은 기능을 사용 할 수있다. 옆으로 16번째 까지 출력하면 아래에 다음줄로 내려간다. 그리고 ucp = ucp + 16; 은 메모리 주소에 16만큼 더 이동하라는 것이다.

12. hexa2 파일을 실행 시킨 화면이다. 맨 왼쪽에 8자리로 된 16진수들이 보일 것이다. 이 것이 %08X로 출력 된 화면이고 오른쪽에 2자리로 출력된 16진수들은 %02X로 출력된 화면이다. 그리고 마지막 오른쪽이 %c와 그리고 '.'으로 출력된 화면이다.

728x90
반응형

댓글