c언어

[c언어 개념] 포인터 기본 개념

chu_dw 2022. 7. 4. 21:13

c언어 개념 같은 경우 조금 더 정리가 필요한 부분들 위주로 정리할 예정이다.

이번 학기 들었던 수업을 바탕으로 적어 보려 한다. 시작은 포인터로 해 보겠다.


● 포인터에 앞서

 

c언어를 이해할 때 변수와 함수 등 코드의 상태를 그림으로 나타내 공부하니 훨씬 쉽게 와닿는 느낌이었기에

이를 바탕으로 정리를 해볼 것이다.

위 코드를 그림으로 나타내면 아래와 같다.

 

변수, 즉 어떤 값을 저장하는 장소가 코드에서 선언되면 main 안에 값을 저장할 수 있는 공간이 생성된다.

이 공간의 크기는 선언된 각 자료형에 맞게 만들어진다. ()

 

 그리고 이렇게 만들어진 각 공간은 main 안에서 어느 위치에 있는지에 대해 알려주는 고유 주소를 가진다.

이 주소는 위 그림에 나타낸 것처럼 &(앰퍼샌드) 를 이용하여 나타낸다.

원래는 숫자로 주소를 가지지만 간단하게 변수 a의 주소는 &a로 나타낸다.

 

그럼 위 코드를 통해 만들어진 변수에 데이터를 넣어 보겠다.

이 경우를 그림으로 표현하면 아래와 같이 나타낼 수 있다.

 


● 포인터란

 

포인터 변수라고도 불리는 포인터는 위에서 봤던 변수들과 똑같이 값을 저장하는 변수이다.

다만 포인터 변수에는 다른 변수의 주소 값만이 저장 가능하다.

 

포인터 변수도 변수이기 때문에 선언 방식은 일반 변수와 비슷하다.

일반 변수 선언에서 변수 이름 앞에 *만 붙여주면 된다. 

*에 대해선 뒤에 추가로 설명하겠다.

 

포인터 변수의 자료형은 포인터 변수에 저장되는 주소값의 변수의 자료형과 똑같이 맞춰 줘야 한다.

 

포인터 변수 또한 가장 간단한 예시를 통해 그림으로 나타내 보겠다.

포인터 변수 또한 다른 변수와 같이 main에 저장되는 공간이 만들어지게 된다.

즉 위 그림과 코드는 정수 데이터(int형)를 저장할 수 있는 공간 하나와 변수의 주소를 저장할 수 있는

공간 하나가 생긴 상태인 것이다.

 

이 저장 공간에 데이터를 넣는 코드는 아래와 같다.

변수 a에는 정수 값 10을 넣어 줬고 포인터 변수 pa에는 변수a의 주소 값을 넣어 준 것이다.

그림에서 볼 수 있듯이 &a는 변수 a의 주소값을 나타낸다.

그림으로 보면 좀 더 편하게 이해가 될 수도 있다.


● 간접참조 연산자

 

이제는 포인터 변수를 사용하여 데이터를 출력하는 방법을 알아보겠다.

여기서 아까 뒤에서 설명한다 했던 * 에 대하여 알아야 한다.

 

포인터 변수를 사용하는데 * 은 두 가지 역할을 한다.

첫 번째는 위에서 사용했던 것처럼 포인터 변수를 선언할 때 사용한다.

두 번째로는 포인터를 통해 데이터를 출력할 때 사용한다. 이때 * 을 간접참조 연산자라고 한다.

 

예시를 통하여 이해하기 위해 위의 그림을 다시 사용하겠다.

저 상황에서 printf("%d",a);를 하면 당연하게 10이 나온다.  그럼 printf("%d",pa);를 하면 어떤 값이 나올까?

한 번 코드를 직접 실행해 보겠다.

알 수 없는 숫자가 나오는데 이 숫자가 이때까지 &a로 표현했던 변수 a의 주소값이다.

그럼 저 주소를 따라가게 되면 변수 a의 위치가 나오게 되고 그 a에 저장된 값을 가져올 때 간접참조 연산자를 사용한다.

즉 printf("%d",*pa); 를 하게되면 pa에 저장된 주소에 해당하는 변수 안에 저장된 값인  10을 출력하게 된다.

이름 그대로 a에 직접접근 하지 않고 주소값을 저장하고 있는 포인터 변수를 통하여 간접적으로 접근하는 것이다.

 


여기까지 포인터의 가장 기본적인 개념을 정리했다.

여기까지 배운 후 가장 의문이었던 점은 그래서 왜 이 포인터를 사용하는 가에 대한 것이었다.

이는 다음 글에 설명하겠다.