C언어 포인터



안녕하세요 열코입니다.


이번시간에는 C언어 포인터에 대해 알아보겠습니다.


포인터(Pointer)란 프로그래밍 언어에서 변수의 메모리 주소를 가리키는 변수를 말합니다.


포인터는 Low Level 언어(C/C++/어셈블리...등)에서 많이 사용됩니다.



이번 포스트는 다음과 같이 진행됩니다.


1. 포인터 사용법


2. 포인터 활용


3. 포인터와 배열의 차이점



준비되셨으면 그럼 시작하겠습니다!!


먼저 포인터에 대한 사용법에 대해 알아보겠습니다.



1. 포인터 사용법


포인터를 사용하려면 먼저 두가지 연산자에 대한 이해가 필요합니다.


& 연산자와 * 연산자입니다.


scanf에 대해 공부하셨다면 &연산자에 대해 보신적이 있을텐데요.


& 연산자에 대해 조금 설명하자면 변수의 주소에 액세스 하기위한 단항 연산자입니다.


(참고 영어로는 ampersand라고 합니다.)


그래서 scanf는 표준 입력함수로 콘솔에서 입력을 변수에 메모리에 접근하여 저장하기 위해 


& 연산자를 사용하는 것입니다.


아래 예제는 & 연산자를 이용하여 변수의 주소를 출력하는 코드입니다.


#include <stdio.h> // 표준 입출력 라이브러리


int main(void) {

int num = 10; // 정수형 변수 선언

printf("%p", &num); // num의 주소값 출력

}


위 코드는 num이라는 이름을 가진 정수형(Integer) 변수를 선언하고 그 값으로 10이라는 


정수(10진수)를 정의했습니다.


그리고 이 num이라는 변수는 메모리 어딘가(스택영역)에 할당됩니다.


(참고 : 메모리공간은 크게 데이터, 스택, 힙 공간으로 분류됩니다.


여기서 num 변수는 main() 함수의 지역변수이기 때문에 지역변수의 저장 공간인 스택영역에 저장되게 됩니다.)


표준 출력함수인 printf() 함수를 통해 num 변수의 주소값을 출력해보겠습니다.



첫번째 매개변수로 %p를 주었습니다. 왜 %d가 아닌 %p일까요?


%d 는 decimal의 줄임말로 변수를 10진수로 표현하기 위한 포맷(format)입니다.


%p 는 주소값을 표현하기 위한 포맷이라고 생각하시면 되겠습니다.


두번째 매개변수로는 num앞에 &연산자를 추가했습니다. 이는 num변수안에 저장된 값 10이 아닌


num변수가 저장된 메모리 주소에 접근하기 위해 연산자 &를 사용한 것입니다.



우리가 사용하는 컴퓨터의 메모리는 RAM인거 다 아시죠?


RAM은 Random Access Memory의 줄임말로 접근이 임의인 메모리입니다.


따라서 num 변수의 주소값은 출력할 때마다 매번 다른 값을 출력하게됩니다.(직접해보세요)



이제 포인터를 사용하기 위해 * 연산자에 대해 알아보겠습니다.


앞서 배운 & 연산자를 일반적으로 참조 연산자라고 부르며, * 연산자를 역참조 연산자라고 부릅니다.


포인터를 사용하기 위해서는 변수와 자료형 사이에 * 연산자를 추가하면 됩니다.


아래 예제 코드를 참고하세요.


#include <stdio.h> // 표준 입출력 라이브러리


int main(void) {

int num = 10; // 정수형 변수 선언

int *p; // 정수형 포인터 선언

p = &num; // 포인터가 num 변수의 주소값을 가리킴


printf("%d\n", p); // 포인터가 가리키는 변수의 주소 출력

printf("%d\n", *p); // 포인터가 가리키는 변수의 값 출력

printf("%d\n", &p); // 포인터 변수의 주소 출력

}


자 *도 많고 &도 많고 참 헷갈린다 그쵸?


먼저 글로 최대한 간단히 설명하고 그림으로 설명드리겠습니다.


첫번째 줄 부터 설명하겠습니다.




① num이라는 정수형 변수를 선언했습니다. 이로써 스택영역에 num 변수의 메모리가 할당됩니다.


② p라는 정수형 포인터를 선언했습니다. 이로써 힙영역에 p 변수의 메모리가 할당됩니다.


(num이라는 정수형 변수를 가리키기 위한 포인터로써 정수형 포인터를 선언합니다. 


또한 포인터는 힙 영역에 할당 됩니다.)


③ p라는 정수형 포인터에 num 변수의 주소값을 대입했습니다.


(포인터의 주소값을 대입하는 표현을 편의상 가리킨다라고 표현합니다.)



여러분들의 이해를 돕기위해 그림을 직접 그려서 대령했습니다.(짝짝)


메모리는 데이터, 힙, 스택영역이 있다고 위에 설명했죠?


따라서 지역변수인 num은 스택영역할당되고, 포인터 변수인 p는 힙 영역에 할당되었습니다.


그리고 num의 주소값을 p에게 대입(p가 num을 가리킴)을 화살표로 표현했습니다.



여기서 출력값에 대해 알아보면


printf("%d\n", p); // 포인터가 가리키는 변수의 주소 출력


printf("%d\n", *p); // 포인터가 가리키는 변수의 값 출력


printf("%d\n", &p); // 포인터 변수의 주소 출력


은 각각 어떤 값을 출력할까요?


맞추시는 분께는 열코 블로그 3개월 구독권을 드립니다! (필요없음)




자 하나씩 살펴보도록 합시다.


첫번째 p의 출력값은 p가 가리키는 변수의 주소 출력, 따라서 num의 주소값이 0(임의의 주소값)이 출력되겠죠?


두번째 *p의 출력값은 p가 가리키는 변수의 값 출력, 따라서 num의 값 10이 출력됩니다.


세번째 &p의 출력값은 p의 주소값, 따라서 100이 출력됩니다.


위 과정에 대한 이해가 안되시는분은 댓글로 질문남겨주시면 더욱! 더욱! 상세히 설명드리겠습니다.



2. 포인터의 활용은 다음 포스팅에서 소개하겠습니다. ^0^




이상 'C언어 포인터'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



'C, C++' 카테고리의 다른 글

C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26
C++ 자바 상속 비교  (0) 2018.09.08
C 랜덤 - 난수 생성하기  (7) 2018.09.06
C++ String 문자열 사용법 정리  (0) 2018.08.20
[C++] C# 연동하기 / C# dll 파일 만들기  (1) 2018.08.18

to Top