본문 바로가기
Embedded Programming/C/C++

포인터(pointer) 변수의 개념

by 중동콜링 2013. 3. 20.

* 포인터 변수란?

포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조(逆參照, dereferencing)라고 한다.

포인터는 어셈블리어CC++파스칼 등 하위 레벨까지 제어할 수 있는 언어에서 주로 많이 쓰이며, 모듈라-2에이다와 같은 언어에서는 극히 제한적으로 사용되고, 자바에펠등에서는 완전히 숨겨져 사용할 수 없다.

첫 번째 부류의 언어에서는 포인터를 메모리의 임의의 주소를 가리키도록 할 수 있으며 포인터의 연산도 가능하다.

C#의 경우 제한적으로 포인터가 사용 가능하다.

일반적으로 포인터는 메모리 주소로 바꿀 수 있다. 포인터는 다른 변수나 함수를 가리키도록 사용된다.

-위키백과


포인터 변수란 위키백과의  설명에서 알 수 있듯이 변수의 메모리 주소를 값으로 가지는 변수, 쉽게 말하면 다른 변수를 가리키는 변수라고 정의할 수 있다. 이름에서도 그 용도가 유추가 가능할 것이다. (point 가리키다 + er)


포인터 변수의 선언

(자료형) *(변수명);

ex) int *ptr;

포인터 변수는  위와 같이 일반 자료형 선언에서 *만 첨가한 것이다.

저기서 int *의 뜻은 int형을 가리킬 수 있는 포인터 변수 ptr이라고 할 수 있다.


포인터 변수의 초기화

int num = 10;

int *ptr;

ptr = #


포인터 변수는 주소값을 value로 가지는 변수이므로 주소연산자"&"를 가리키려는 변수명 앞에 붙여줘야 초기화가 된다.

변수의 주소를 포인터 변수의 값으로 대입하는 것이다.


이를 도식화 해보면 아래와 같은 그림이 나온다.

int num = 10;

int *ptr = #

*ptr = 12;

셋째쭐의 코드에서 처럼 num의 주소값을 value로 가지는 int형 포인터 변수 ptr을 *ptr형식으로 사용하면 num 값을 

바꿔줄 수도 있다.




10이 들어가 있던 int num의 값이

① 번 코드에서 포인터를 이용한 접근으로 num의 값이 변한 것을 확인 할 수 있다.



마지막으로 정리해보자.

① * : 포인터 연산자는 곱셉 연산자와도 혼용되는데

int *ptr; 

과 같이 선언문에 사용되면 해당 변수가 해당 자료형의(이 경우는 int 형의) 포인터 변수임을 

지정하는 것이고, *ptr = 12; 와 같으면 참조하는 변수의 값을 조작한다는 뜻이다.

value = num1 * num2;, value = 3 * value; 와 같이 항의 오른쪽에서(R - value) 

일반 변수나 상수와 함께 쓰이면 곱셉연산자 *로 인식이 된다.


② & : 변수의 주소를 가리키는 연산자로 포인터 초기화에 쓰인다.

int *ptr = # 와 같은 식이다.

포인터 자체의 주소를 지정하고 싶으면 &ptr을 사용하면 된다.

 

③ (포인터명) : 포인터 명은 포인터 변수가 담고 있는 값이

참조하고 있는 변수의 주소값이므로 그 주소값을 가진다.


아래는 포인터의 특징을 마지막으로 정리해본 예제이다.