포인터 변수에 적용되는 대표적인 연산자로는 다음과 같이 주소 연산자(&), 역참조 연산자(*), 증감 연산자(++/--) 이다.
연산자 | 의미 | 피연산자 (연산자를 적용가능한 변수) |
---|---|---|
& | :변수에 할당된 메모리의 주소를 얻는 연산자 (주소연산자) | 일반 변수 및 포인터 변수 |
* | 메모리 주소 값에 저장된 데이터 값을 얻는 연산자 (간접 참조 연산자, 역참조 연산자) | 포인터 변수 |
++ | 전위/후위 증가 연산자 | 일반 변수 및 포인터 변수 |
-- | 전위/휘의 감소 연산자 | 일반 변수 및 포인터 변수 |
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int a = 10, b = 20;
int *ptr;
ptr = &a;
cout << "포인터 변수(ptr)가 가리키는 주소(&a)에 저장된 값: " << *ptr << endl;
ptr = &b;
cout << "포인터 변수(ptr)가 가리키는 주소(&b)에 저장된 값: " << *ptr << endl;
return 0;
}
다음 프로그램은 일반 변수 a와 b 두 개와 포인터 변수 ptr 한 개를 선언하고 포인터 변수 ptr을 통해 일반 변수 a, b의 메모리 저장공간의 주소를 저장한 후 역참조 연산자를 통해서 메모리에 저장된 값을 참조하여 화면에 출력하고 있다.
프로르갬 실행 결과는 다음과 같다.
포인터 변수(ptr)가 가리키는 주소(&a)에 저장된 값: 10
포인터 변수(ptr)가 가리키는 주소(&b)에 저장된 값: 20
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
ptr++;
앞의 프로그램 예에서 ptr++ 는 ptr에 저장된 주소를 증가시키는 연산으로 주소 값이 1 증가되는 것이 아니라 포인터 변수가 가리키는 데이터의 자료형에 따라 다음 데이터를 가리키는 주소 값을 저장하도록 한다. 앞의 코드에서 ptr는 int형으로 ptr++ 는 ptr에 저장된 주소 값에 4가 더해진다.
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;
cout << "배열 arr의 첫 번째 원소의 값(*ptr): " << *ptr << endl;
ptr++; // 포인터 변수 값(주소 값) 증가
cout << "배열 arr의 두 번째 원소의 값(*ptr): " << *ptr << endl;
(*ptr)++; // 포인터 변수에 저장된 값의 증가
cout << "배열 arr의 두 번째 원소의 값(*ptr): " << *ptr << endl;
// 포인터 변수에 저장된 값 증가를 한 후 역참조 연산자로 메모리에 저장된 값 참조 출력
cout << "배열 arr의 세 번째 원소의 값(*ptr): " << *++ptr << endl;
// 세 번째 원소의 값 참조한 후 포언터 변수에 저장된 값 증가 (다음 원소의 주소 저장)
cout << "배열 arr의 세 번째 원소의 값(*ptr): " << *ptr++ << endl;
cout << "배열 arr의 네 번째 원소의 값(*ptr): " << *ptr << endl;
return 0;
}
앞의 프로그램 코드는 배열의 원소를 포인터 변수를 통해 접근하는 것이다.
int *ptr = arr
은 배열 변수를 위해 할당된 메모리의 시작 주소(arr에 저장된 값)를 포인터 변수 ptr에 저장한다.
그 후 ptr++
는 배열의 두 번쨰 원소가 저장된 주소 값으로 증가한다.
(*ptr)++
은 ptr에 저장된 주소에 저장된 데이터 값을 1 증가시킨다.
*ptr++
은 ptr의 주소에 저장된 데이터 값을 참조(*ptr)한 후 ptr의 주소 값을 증가시킨다.
*++ptr
은 ptr의 주소 값을 증가시킨 후 주소에 저장된 값을 참조한다.
배열 arr의 첫 번째 원소의 값(*ptr): 10
배열 arr의 두 번째 원소의 값(*ptr): 20
배열 arr의 두 번째 원소의 값(*ptr): 21
배열 arr의 세 번째 원소의 값(*ptr): 30
배열 arr의 세 번째 원소의 값(*ptr): 30
배열 arr의 네 번째 원소의 값(*ptr): 40