검색결과 리스트
[포인터 연산 및 자료형에 따는 출력 변화]에 해당되는 글 1건
- 2014.03.19 [smart]이재우-20140319
글
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=0xAA;
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=0xAA;
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 |
RECENT COMMENT