728x90

 

2014.03.19 수업 ver1_0a.docx

2014. 03. 19 수업 및 과제 


1 포인터(Pointer)의 이해 

  - 주소를 저장하기 위한 변수

  - 주소(address)범위: 4 byte, 32bit, 16진수 FFFF FFFF, 10진수(4,294,967,295)

  - CPU BUS 라인에 따라 메모리 처리 용량이 결정

 

 

2 메모리 저장방식의 이해

  - Intel 컴퓨터 -> Little Eddian 방식

메모리 값:12345678

저장 메모리순서: 78563412

저장 메모리 순서가 틀린 이유: 계산을 주로 하는 컴퓨터 이기 때문에 속도를 위해 작은 숫자부터 저장. 

 

  - Super 컴퓨터 -> Big Eddian 방식

메모리 값:12345678

저장 메모리순서: 123456

저장 메모리 순서가 같은 이유: 대소 비교가 빠르다.(큰 값을 먼저 비교) 

 

 

3 메모리 저장방식의 이해

  - Intel 컴퓨터 -> Little Eddian 방식

 

[예제1]

#include <stdio.h>
int
 main()
{
  
int   iNum=0x12345678
;
  
char *  p=(char*)&
iNum;

/* char 형 값의 표현 범위 -128 ~ +127 */

/* char 형 값의 표현 범위 -128 ~ +127 */

/*  char *  p=(char*)&iNum;  AA(1010 1010)=10진수 170(-40)
가 음수정수로 저장 되기 때문에 FFFFFFAA  가 저장됨*/

  *p=0x
AA;
  printf(
"%08X \n"
, iNum);
  printf(
"%02X \n"
, *p);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  
return 0
;
}

[결과]

 

 

[예제2]

#include <stdio.h>
int
 main()
{
  
int   iNum=0x12345678
;
  
unsigned char *  p=(unsigned char*)&
iNum;

/* char 형 값의 표현 범위 -128 ~ +127 */

/* unsigned char 형 값의 표현 범위 0 ~ +255 */

/*  unsigned char *  p=(unsigned char*)&iNum;  AA(1010 1010)=10진수 +170
가 양의정수로 입력 되기 때문에 FFFFFFAA 가 000000AA로 저장됨 /

  *p=0x
AA;
  printf(
"%08X \n"
, iNum);
  printf(
"%02X \n"
, *p);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  printf(
"%02X \n", *p
);
  
return 0
;
}

[결과]   

 

 

[예제3]

#include <stdio.h>
int
 main()
{
  
int   iNum=0x12345678
;
  
unsigned char *  p=(unsigned char*)&
iNum;
  *p=0xAA;
  printf(
"%08X \n"
, iNum);
  printf(
"%02X \n"
, *p);
  printf(
"%02X \n", *(p+1
));
  printf(
"%02X \n", *(p+2
));
  printf(
"%02X \n", *(p+3
));
  
return 0
;
}

[결과]   

 

 

4 포인터의 연산 및 자료형에 따른 출력 변화

   - 포인터에 주소값을 가지므로 + - ++ --연산자를 쓸 수 있다. (기타 다른 연산자(* / .. 는 쓸 수 없다.)       [예제]

[예제1]

#include <stdio.h>
int main()
{
  int   iNum=0x12345678; /* int 4byte */
  unsigned char *  p=(unsigned char*)&iNum; /* unsigned char 1byte */
  unsigned short * sp=(unsigned short*)&iNum;  /* unsigned short 2byte */

  *p=0xAA;    /* 실제 메모리 Little Eddian 저장방식 AA563412 */

  printf("%08X \n", iNum); /* 123456AA 화면에 출력시 순서대로 출력 */
  printf("%02X \n", *p);  /* AA 실제 메모리 Little Eddian 저장방식 */
  printf("%02X \n", *(p+1)); /* 56 실제 메모리 Little Eddian 저장방식 */
  printf("%02X \n", *(p+2)); /* 34 실제 메모리 Little Eddian 저장방식 */
  printf("%02X \n\n", *(p+3)); /* 12 실제 메모리 Little Eddian 저장방식 */

  printf("%08X \n", p);  /* p주소: 0012FF6C 출력 */
  printf("%08X \n", (p+1)); /* p+1주소: 0012FF6D 출력 */
  printf("%08X \n", (p+2)); /* p+2주소: 0012FF6E 출력 */
  printf("%08X \n\n", (p+3)); /* p+3주소: 0012FF6F 출력 */

  printf("%04X \n", *sp); /* sp가 가리키는 값(iNum): 56AA 출력 */
        /* AA56이 아닌 이유: sp가 short형 이므로 2byte씩 출력 */
  return 0;
}

[결과]         

      

 

 [예제2]

#include <stdio.h>
int main()
{
  int iNum=0xABCDEF98;    /* 실제 메모리 저장: 98EFCDAB */
  unsigned char * uCPDATA = (unsigned char *)&iNum;
  
  printf("%02X \n", *uCPDATA);  /* 98  1 byte 출력*/
  ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  printf("%02X \n", *uCPDATA);  /* EF 다음(98) 1 byte 출력*/
  ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  printf("%02X \n", *uCPDATA);  /* CD 다음(EF) 1 byte 출력*/
  ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  printf("%02X \n", *uCPDATA);  /* AB 다음(CD) 1 byte 출력*/
  return 0;
}

[결과] 

[예제3]   예제2의 for문으로 출력 

#include <stdio.h>
int main()
{
  int iCnt;
  int iNum=0xABCDEF98;    /* 실제 메모리 저장: 98EFCDAB */
  unsigned char * uCPDATA = (unsigned char *)&iNum;
  
  for(iCnt=0;4>iCnt;++iCnt)
  {
    printf("%02X ", *uCPDATA);  /* 98 앞쪽 1 byte 출력*/
    ++uCPDATA;      /* 1 uCPDATA 주소 1byte 증가*/
  }
  return 0;
}

[결과]

더블클릭을 하시면 이미지를 수정할 수 있습니다

 

'…™업무일지。' 카테고리의 다른 글

[smart]이재우-20140321  (0) 2014.03.21
[smart]이재우-20140320  (0) 2014.03.20
[smart]이재우-20140318  (0) 2014.03.18
[smart]이재우-20140317  (0) 2014.03.17
[smart]이재우-20140314  (0) 2014.03.14