[C언어] 포인터 쉽게 이해하기
본문 바로가기
C++/C Basic

[C언어] 포인터 쉽게 이해하기

by Macgyvering2 2020. 10. 5.

포인터를 쉽게 이해하려면 다음의 5가지를 이해하면 된다. 

반대로, 포인터가 어렵게 느껴지는 이유는 이 5가지를 이해하지 못해서이다.

 

1. 포인터의 정의 

2. 포인터를 사용하는 이유

3. 포인터를 선언하는 방법

4. 포인터에 대입해줘야 하는 것의 정체

5. 포인터가 가키리고 있는 값을 읽어오는 방법

 

차례대로 한번 이해해보자.

 

포인터의 정의

먼저, 포인터는 다른 변수의 주소를 저장하는 변수이다.

 

포인터 사용 방법

아래의 과정을 통해 포인터의 선언, 값 읽어오기 등 기본적인 사용 방법을 알아보자.

 

아래 코드는 num 변수를 선언하여 123으로 초기화하고 출력하는 기본적인 코드다.

#include <stdio.h>


int main(void)
{
	int num = 123;
	printf("%d\n", num);

	return 0;
};

 

위 코드에 포인터를 하나 선언하여  num 변수를 연결시켜 줄 수 있다.

어디에 무엇을 어떻게 추가할 것인가?

 

#include <stdio.h>

int main(void)
{
	int num = 123;
	int* ptr = &num;
	printf("%d\n", *ptr);	// 주소가 가르키는 값(내용) 출력
	//printf("%d\n", ptr);	// 주솟값 출력
	
	return 0;
};

1) 포인터 선언 방법

일단 포인터를 변수 선언하는 방법과 비슷한데 조금 다르다.

포인터 선언 방법은 int* ptr; 과 같은 방식으로 선언하면 된다.

 

2) 포인터에 대입 해줘야 하는 것

이 예제에서 포인터는 num 변수의 주소를 저장할 것이다.

따라서 다음과 같이 &연산자를 이용해 num변수의 주소를 직접 대입시켜주면 된다. 

 

&를 붙인다는 것은 그 변수의 값이 아닌 그 변수가 위치하고 있는 주소(숫자)를 의미하는 것이다.

 

3) 포인터에 담겨있는 주소의 값을 읽어오는 방법

위 소스 코드를 실행하면 num 변수에 담겨있는 값이 출력되는 것을 확인할 수 있다.

포인터가 가리키고 있는 값에 접근하기 위해서는 포인터 변수 앞에 *(애스터리스크)를 붙이면 된다

 

포인터 선언 방법 부연 설명

포인터를 선언하는 방법은 규칙이기 때문에 어쩔 수 없다. 외워야 한다.

다음처럼 일반 변수 선언하듯이 선언하고 변수 이름 앞에 *(Asterisk;애스터리스크)를 붙이고 주소를 넣어주면 된다.

#include <stdio.h>


int main(void)
{
	int num = 123;
	int* ptr = &num;
	//int *ptr = &num;
	//int * ptr = &num;
	
	return 0;
};

주석처럼 선언해도 모두 똑같이 포인터이기 때문에 스타일이 갈리게 된다.

나는 외우기로는 int* 방법으로 외웠는데, 여러 변수를 한번에 선언할 때는 다음과 같이 선언해야 하기 때문에 2번 방식을 주로 사용한다. ex) int *ptr1, *ptr2, *ptr3;

 

선언할 때 애스터리스크를 붙이는 것은 어떤 원리가 있는 게 아니고 그냥 규칙이다. 컴파일러의 입장에서는 이렇게 선언된 것은 포인터로 생각하겠다 이거다.

 

위의 ptr 포인터 변수에 저장된 것은 num 변수의 주소값이다.

주소값을 저장하는 이유는 num 변수의 주소만 알면 그 변수의 값에 바로 접근할 수 있음을 이용하기 위해서이다.

 

포인터를 사용하는 이유

데이터의 주소만으로 그 값에 접근하기 위해서이다.

일반 변수, 배열, 함수, 구조체 등 모두가 포인터를 연결할 수 있다. 

그 말은 포인터를 사용하여 내가 만든 메모리 공간을 포인터를 이용하여 컨트롤 할 수 있다는 얘기이다. 

 

결국 포인터가 왜 필요한지?

포인터가 이런 방식으로 동작하는 건 알겠지만 이게 왜 필요한건지, 이게 왜 좋은건지 이해가 안될 것이다.

 

예를 들어, 영상을 메모리 공간에 올리고, 모든 픽셀에 대해 일괄적으로 어떤 처리를 하려고 할 때 영상 전체를 넘겨주는 것은 비효율적이다. 이럴 때 우리는 영상을 메모리에 저장해두고 이를 포인터로 잡아서 포인터만 전달해주면 주소는 대부분 4byte만 넘겨주면 되기 때문에 아주 적은 데이터만 넘겨줬을 뿐인데 영상을 처리할 수 있게 되는 것이다. 이런 부분에 포인터가 주로 쓰인다. 

 

요약

1. 포인터의 정의: 다른 변수의 주소를 저장하는 변수

2. 포인터를 사용하는 이유: 데이터의 주소만으로 그 값에 접근하기 위해서

3. 포인터를 선언하는 방법: 변수명 뒤에 *를 붙인다.

4. 포인터에 대입해줘야 하는 것의 정체: 메모리의 주솟값

5. 포인터가 가리키는 값을 읽어오는 방법: 포인터 변수 앞에 *를 붙인다.

6. 변수의 주소를 읽어오는 방법: 변수명 앞에 &를 붙인다.

 

댓글