본문 바로가기

C

[1] 포인터

728x90

이번에는 C언어의 포인터를 공부해 보겠습니다.

 

먼저, 포인터를 알아보기 전에 "어드레스"라는 것을 보겠습니다.

어드레스메모리의 주소. 즉, 주소 값입니다.

주소 값이란 변수 등이 들어가 있는 메모리의 위치를 말합니다.

 

주소 값을 나타낼 때는 어드레스 연산자 "&"를 사용합니다.

 

주소 값은 보통 16진수 같은 수치로 나타내고, 이 값은 사용하는 환경에 따라 달라질 수 있습니다.

 

그렇다면 주소값 접근이 왜 필요할까요?

앞으로 차차 알아보겠지만, 주소 값에 직접 제어하면 메모리를 아끼거나 함수 내부에서 실인수 값을 직접 변경할 수 있게 되는 등 효율적으로 짤 수 있게 됩니다.

 

이 주소 값을 다루기 위해서는 "포인터"라는 것을 사용합니다.

포인터는 주소값을 저장할 수 있는 특별한 변수입니다.

 

포인터 사용방법

여기서 b는 포인터 변수입니다.

b에는 a의 주소 값을 대입해서 저장해 두었습니다.

이렇게 해서 변수로 주소 값을 다룰 수 있게 되었습니다.

 

포인터를 출력할 때는 변환 사양 "% p"를 사용합니다.

그림에서 보이듯이 a의 주소 값이 저장된 포인터 변수와 a의 주소 값은 같습니다.

 

포인터가 이렇게 표현하는 것을 "포인터 b는 a를 지시한다."라고도 표현합니다.

포인터b가 a의 주소값을 지시한다.

간접 참조 연산자(*)

포인터를 통해 주소뿐만 아니라 직접 값에도 접근할 수 있는데요.

간접참조 연산자를 통해서 변수에 저장된 값에 접근해 보겠습니다.

이렇게 접근하는 방식을 다른 표현으로 "역참조"라고도 합니다.

 

왜 간접 참조 연산자일까?

왜 메모리에 직접 접근해서 하는데 "직접 참조 연산자"가 아니라 "간접 참조 연산자" 일까요?

변수(a => a를 쓰면 값을 알 수 있음)처럼 직접 쓰는게 아니라 메모리 주소를 통해 접근해서 다시 값에 접근(*b => 메모리 주소에 먼저 접근해서 값에 접근)하기 때문에 간접 참조 연산자라는 이름이 붙은게 아닐까 생각해 봤습니다.

 

<간접 참조 예시>

보는 것과 같이 포인터 b에 간접 참조 연산자*를 붙여서 값에 접근했습니다.

실제로 변수 a를 출력한 값이 *b의 값과 같음을 알 수 있습니다.

정리하자면 포인터 b에 *를 붙여서

*b == a

인 것입니다.

 

포인터 특징

1. 주소 값이 저장된 포인터에 다른 주소 값을 대입할 수 있는데 이때, 기존 값은 덮어쓰기되어 사라집니다.(새로 대입할 때마다 주소값도 바뀝니다.)

2. 만약 포인터에 값이 들어있지 않으면 오류를 발생시킬 수 있기 때문에 이런 상황을 방지하기 위해서 초기화를 하는 것이 좋습니다.(값이 없을 때도 주소가 있기는 합니다.)

 

초기화하는 방법

그림처럼 포인터를 선언할 때 저장할 변수의 주소값을 저장합니다.

 

 

여기까지가 칠판 하나 가득 복습한 내용입니다.

이상으로 칠판 하나 설명을 마치겠습니다. 감사합니다.

 

ps. 추가로 포인터를 왜 해야하는가에 대한 도움이 될 수도 있는 영상자료입니다.

www.youtube.com/watch?v=V6IJ8M13JIU

 

728x90

'C' 카테고리의 다른 글

[5] 함수와 배열인수  (0) 2021.04.23
[4] 이중 포인터(포인터의 포인터)  (0) 2021.04.23
[3] 배열과 포인터의 관계  (0) 2021.04.22
[2] 인수와 포인터  (0) 2021.04.22
[0] C언어를 시작하며  (0) 2021.04.21