Young & Rich

 

오늘은 배열과 포인터 2편내용으로 포인터에 대해서 포스팅을 해보려고 합니다.

 

[포인터(Pointer)]

- 일단 포인터의 정의에 대해서 알아보겠습니다.

 

포인터(Pointer) 영어의 뜻으로 말하면 가리키는 것? 이라고 해석해보면, 무엇가를 가르키는 변수다 라고 생각하면 쉽습니다.

그럼 무엇을 가르키는 걸까요? 바로 변수입니다. 포인터는 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수입니다. 그래서 포인터에는 변수의 주소값이 담아지게 됩니다.

* 포인터 변수에는 주소값 이외에는 어떤 값도 담을 수 없습니다.

 

그럼 어떻게 선언할까요? 포인터 변수를 선언할 때는 앞에 * 를 붙이게 됩니다.

int *num;

이런식으로요. 일단, 포인터변수로 선언을 하게 되면 포인터 변수에는 변수의 주소값만 담을 수 있습니다.

또한, 포인터의 크기는 무조건 4byte 입니다.

double *num;

char *num;

int *num;

어떻게 선언을 하든 4byte 입니다. 왜 일까요? 모든 주소값들이 4byte 로 표현이 가능하기 때문입니다.

 

다음으로는 C언어에서 * 의 의미를 설명드리겠습니다.

1. * 은 포인터 변수를 선언할 때도 사용하지만, 선언하고 나서 *을 붙이면 포인터 변수안에 담기 주소값의 변수를 의미합니다.

2. 선언을 할 때를 제외한 다른 곳에서의 * 은 값을 참조하라는 의미입니다.

아래의 예제를 같이 살펴봅시다.

#include<stdio.h>

void main()
{
	int number = 0;
	int *p_number = &number;

	number = 10;
	printf("number[%d], *p_number[%d], &number[%x], p_number[%x]\n", number, *p_number, &number, p_number);
	
}

프로그램 실행결과
프로그램 실행결과

number == *p_number 와 같은 의미라는 것을 알 수 있습니다.

*p_number 는 포인터 변수 p_number 에 있는 주소값을 참조하라 라는 뜻입니다. p_number 에는 number의 주소값이 있으니깐 그것을 참조한다면 number 의 변수를 의미합니다.

&number 와 p_number 의 값이 같다는 것도 위의 실행결과를 보면 알 수 있습니다.

 

자 그럼 포인터 변수에 1차원 배열의 주소값을 넣으면 어떻게 될까요? 예제를 보면서 설명드리겠습니다.

#include<stdio.h>

void main()
{
	int i = 0;
	int number[5] = {1,2,3,4,5};
	int *p_number = number;		// number == &number[0]

	
	for ( i = 0; i < 5; i++ )
	{
		printf("number[%d], *p_number[%d]\n", number[i], *p_number);
		p_number++;			// p_number
	}
}

프로그램 실행결과
프로그램 실행결과

포인터 변수에 배열의 첫 번째 변수 (number[0]) 의 주소값을 넣고, 위와 같이 출력해주면 같은 결과물이 나옵니다.

위에서 설명드린 것과 같이, 포인터 변수의 안의 주소값을 참조하라(따라가라) 라는 뜻이기 때문에 같은 결과값이 찍히게 됩니다.

 

자, 그럼 여기서 p_number++ 에 대해서 설명을 드리겠습니다. ++ 는 +1 을 하라는 의미입니다.

p_number = p_number + 1; 과 같은 의미입니다.

++ 를 (++p_number, p_number++) 이처럼 어디에 붙이냐에 따라 또 다른 의미가 있는데, 현재는 넘어가겠습니다.

 

배열을 선언을 하면, 컴퓨터 메모리에 아래와 같이 number[5] 를 위한 연속적인 메모리를 할당합니다.

포인터 설명
포인터 설명

처음에는 p_number 에는 &number[0] 인 10이 저장되어 있었으니 1의 값이 출력이 되고, p_number++ 를 해주게 되면,

p_number = p_number(10) + 1(자료형의 크기 4byte) == 10 + 1( X 4) == 14 가 되게 됩니다.

&이것은 number[1] 의 주소값을 가르키도록 변경되는 것이죠.

 

추가적 설명을 드리면, 배열은 이렇게도 사용할 수도 있습니다.

*(number + i) == number[i]  이렇게도 사용할 수 있습니다. 왜 그런 것이냐? number 는 &number[0] 이기 때문입니다.

 

[ 요약 ]

- 포인터는 변수의 주소값 만을 담을 수 있는 변수이다.

- 포인터 변수는 자료형을 막론하고 무조건 4byte이다.

- * 은 해당 변수의 주소값을 참조하라(따라가라) 라는 의미이다.

 

이 3가지는 포인터 개념에서 꼭 기억하셔야 되는 개념입니다.

 

다음 포스팅 때, 지금까지 다뤘던 1차원 배열이 아닌 2차원 배열 및 포인터에 대해서 좀 더 깊이 알아보도록 하겠습니다.

 

그럼 20000.

 

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band