포인터(pointer) 변수의 개념
* 포인터 변수란?
포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조(逆參照, dereferencing)라고 한다.
포인터는 어셈블리어, C, C++, 파스칼 등 하위 레벨까지 제어할 수 있는 언어에서 주로 많이 쓰이며, 모듈라-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을 사용하면 된다.
③ (포인터명) : 포인터 명은 포인터 변수가 담고 있는 값이
참조하고 있는 변수의 주소값이므로 그 주소값을 가진다.
아래는 포인터의 특징을 마지막으로 정리해본 예제이다.