본문 바로가기

C 언어/임베디드 C

포인터(3)

//short형의 포인터 변수가 int형의 데이터를 접근하는 프로그램
#include <stdio.h>

int main()
{
 int iNum, *ip; //ip는 int형을 가리키는 포인트 변수
 short *sp; //sp는 short형을 가리키는 포인트 변수

 iNum = 0x0F5A0B43; //iNum의 초기화
 ip = &iNum; //ip의 초기화
 printf("iNum : %X ip : %08X \n",iNum, ip);
 sp = (short *)ip; //sp가 iNum을 가리킨다
 printf("sp : %08X, *sp : %X\n", sp, *sp);
 sp = sp++;
 ip = ip++; //sp가 iNum의 세 번째 바이트를 가리킨다
 printf("sp : %08X, *sp : %X\n", sp, *sp);
 printf("ip : %08X, *ip : %X\n", ip, *ip); //ip 증가값 보기
 return 0;
}

결과
iNum : F5A0B43 ip : 0012FF7C
sp : 0012FF7C, *sp : B43
sp : 0012FF7E, *sp : F5A
ip : 0012FF80, *ip : 12FFC0

sp = sp + 1 -> type * 1


//float형의 포인터가 int형의 변수에 접근하는 프로그램
#include <stdio.h>

int main()
{
 int i;
 float *fp;

fp = (float *)&i; //float형의 포인터 변수가 int형의 변수를 가리킨다. fp는 *float, &i는 *int
 i = 357;
 *fp = *fp + 1;
 printf("%d\n", *fp);
 printf("%d\n", i);
 return 0;
}

결과
0

//포인터 변수가 초기화되지 않고 사용된 프로그램
#include <stdio.h>

int main()
{
 int i = 3, *ip;
 printf("%p\n", ip); //ip가 초기화되지 않은 상태에서 값을 출력
 *ip = 21;
 printf("%d\n", *ip);
 return 0;
}

결과
CCCCCCCC

리눅스에서 결과
0x40009ca0
세그멘테이션오류

이 프로그램에서 포인터 변수 ip는 초기화되지 않아 가리키는 메모리가 없는 상태에서 대장 메모리에 대한 값을 부여받았다. 따라서 컴파일 단계에서 경고 메세지가 출력되고, 실행도 정상적으로 되지 않는 것이다.

'C 언어 > 임베디드 C' 카테고리의 다른 글

함수  (0) 2011.04.19
주소 값의 연산  (0) 2011.04.19
포인터(2)[IEEE754방식으로 확인]  (0) 2011.04.15
포인터(1)  (0) 2011.04.15
구구단 출력하기  (0) 2011.04.15