Southern Island

[ C언어 ] 포인터 연산을 활용하여 원하는 메모리 접근

by 월루

C 포인터 ?

해당 글에선 포인터에 대해서 다루지 않는다, 따로 글을 작성한다면 링크를 달아두겠다.
임시로 TCPSCHOOL의 C 포인터 자료 첨부 tcpschool.com/c/c_pointer_intro

 

포인터의 크기

포인터를 하나 생성하면 그 포인터 또한 변수이기 때문에 메모리에 일정한 공간을 차지한다.

포인터 하나는 대체 얼마만큼의 공간을 차지할까?

포인터는 메모리 주소값을 저장한다. 따라서 메모리 주소 크기만큼의 공간만 있으면 충분하다.

x86(32비트) 운영체제는 메모리 주소값의 크기가 32비트 즉 4바이트이다,
x64(64비트) 운영체제는 64비트 즉 8바이트 따라서 포인터의 크기는 사용하는 운영체제의 아키텍처에 따라 달라진다.

#include <stdio.h>

int main(void) {
	int* ptr;
	printf("ptr의 크기 : %d", sizeof(ptr));

	return 0;
}
// x86(32비트) 운영체제
ptr의 크기 : 4

// x64(64비트) 운영체제
ptr의 크기 : 8

 

포인터의 연산

포인터에 연산을 하면 어떻게 될까?

#include <stdio.h>

int main(void) {
	// int형 포인터에 주소값 10000(0x2710) 할당
	int* ptr = (int*)10000;
	printf("ptr = 0x%08x\n", ptr);
	printf("++ptr = 0x%08x\n", ++ptr);

	return 0;
}
ptr = 0x00002710
++ptr = 0x00002714

뭔가 이상하지 않은가? 증감연산자(++)은 특정 변수에 1을 추가하는 연산자이지 않은가?

왜 포인터의 연산에서 4가 증가했을까? ++ptr 부분을  ptr + 1로 치환하여도 같은 결과가 나온다.
우선 결과부터 얘기하자면 포인터의 자료형 크기만큼 증가하였다. 포인터가 long으로 선언되었다면 8만큼 증가한다.

이는 생각해보면 단순하다, 일반적인 상황에서 포인터에 연산을 사용할 필요가 있을까? 딱히 없다.
하지만 배열이라면 다르다

#include <stdio.h>

int main(void) {
	int array[5] = { 1, 2, 3, 4, 5 };
	printf("array	  = %d\n", *array);
	printf("array + 1 = %d\n", *(array + 1));

	return 0;
}
array     = 1
array + 1 = 2

그렇다, 배열에서 포인터 연산을 활용하면 인덱스를 이용하지 않아도 다음, 이전 배열 데이터에 접근이 가능하다.
추가로 *(array + 1)에 괄호를 사용한 이유는 포인터(*) 연산자가 (+)연산자 보다 우선순위가 높아서 괄호없이 사용하면 (주소값의 데이터값 + 1)이 된다.

 

마치며...

제가 글을 쓰는 가장큰 이유는 배운 내용을 정리하고 나중에 다시 공부하기 위해서입니다, 따라서 잘못된 정보가 포함되어 있거나 중요한 내용이 빠져 있을 수 있습니다, 잘못된 내용이나 빠진 내용이 있는 경우 댓글로 말씀해주시면 정말 감사드리겠습니다!

'프로그래밍 > C++' 카테고리의 다른 글

[ C++ ] C, C#, JAVA의 문법 차이점  (0) 2021.05.17

블로그의 정보

남쪽의 외딴섬

월루

활동하기