티스토리 뷰

Coding/C

포인터의 연산

빠리빵 2018. 5. 22. 11:43
#include

/*
16진수
10 : A
11 : B
12 : C
13 : D
14 : E
15 : F
*/

void main(void) {
	int *p, *q;

	p = (int *)0x1008;
	q = (int *)0x1000;

	// 주석처리된 부분은 에러가 발생한다. 
	// printf("%X\n", p*q);
	// printf("%X\n", p/q);
	// printf("%X\n", p+q);
	printf("%X\n", p-q);	// 2 -> 포인터 사이의 뺄셈은 간격을 의미한다. 주소와 데이터 타입 고려
	printf("%X\n", q-p);	// FFFFFFFE -> -2

	// printf("%X\n", p*2);
	// printf("%X\n", p/2);
	printf("%X\n", p+2);	// 1010 -> 데이터 타입을 고려하여 주소를 증가시킨다.
	printf("%X\n", p-2);	// 1000

	//---------------------------------------------------------//
	int * a = (int *)malloc(sizeof(int));
							
	// 실제 a의 주소는 실행 시마다 다르다. 편의상 1020이라 가정함.
	*a = 100;					// 1020번지의 데이터를 100으로 변경한다.
	printf("\n%X\n", a);			// 1020
	printf("%d\n", *a);			// 100
	printf("%d\n", *(a - 1));	// (a-1)의 주소의 데이터 -> a - 1은 데이터 타입을 고려하여 101C -> 101C의 데이터를 출력(쓰레기값)
	printf("%X\n", (a - 1));	// 101C

	//---------------------------------------------------------//
	// 위의 예제를 char type으로 바꾼다면?
	char * b = (char *)malloc(sizeof(char));
	
	// 실제 b의 주소는 실행 시마다 다르다. 편의상 1030이라 가정함.
	*b = 'X';
	printf("\n%X\n", b);		// 1030
	printf("%c\n", *b);			// X
	printf("%d\n", *(b - 1));	// (b-1)의 주소의 데이터 -> b - 1은 데이터 타입을 고려하여 102F -> 102F의 데이터를 출력(쓰레기값)
	printf("%X\n", (b - 1));	// 102F
	// 포인터의 덧셈, 뺄셈 연산은 데이터 타입을 고려해서 계산하자.

	system("pause");
}
#include

void main(void) {
	int a = 100;
	int *p;

	p = &a;

	// printf에서 #은 지정된 진수 형식에 따라서 앞에 0(8진수) 또는 0x(16진수)를 붙인다.
	// printf("%#o\n", 123); // -> 0173 (참고로 123은 8진수로 173임)
	// printf("%#x\n", 123); // -> 0x7b
	// . 은 몇 칸을 차지하게 출력할지 결정한다.
	// %#.8x -> 16진수로 표현하면서, 앞에 0x를 붙이며, 8칸을 차지하게 출력한다.

	printf("%#.8x %#.8x\n", p, &a);
	printf("%#.8x %#.8x\n", *p, a);
	printf("%#.8x %#.8x\n", p+1, p-1);
	printf("%#.8x %#.8x\n", *(p+1), *(p-1));

	system("pause");



}


'Coding > C' 카테고리의 다른 글

1차원 배열의 포인터  (0) 2018.05.22
little endian과 big endian  (0) 2018.05.22
pointer 와 선치, 후치 연산자  (0) 2018.05.20
static 및 extern // case03  (0) 2018.05.20
static 및 extern // case02  (0) 2018.05.20
댓글