본문 바로가기

C++

C++ 배우기 12(포인터)

포인터

드디어 정말 어렵고 헷갈리는 부분에 들어오게 되었다. C를 배울 때에도 많이 고생했던 부분이기도 하다...

우선 포인터란, 메모리 주소를 가리키는 도구라고 할 수 있다. 주소값에 접근하기 위한 도구라고 알아두면 된다.

이것도 자료형 중에 하나로, 메모리에 접근할 주소를 저장할 수 있는 타입이다.

크기는 운영체제에 따라서 다를 수도 있는데, 4byte는 32bit 체제의 크기이고, 8byte는 64bit 체제의 크기이다.

 

int a = 5;
int* b; //int* : int형 주소를 담을 수 있는 포인터
b = &a;

cout << "b의 값 : " << b << endl;
cout << "b가 가리키는 값 : " << *b << endl;
cout << "b의 주소 : " << &b << endl;
cout << "a의 값 : " << a << endl;
cout << "a의 주소 : " << &a << endl;

위에 변수 a = 5를 초기화하고 int형 포인터 b를 선언했다. 그리고 참조자(&)를 통해 b = &a로 초기화를 시키면,

b에는 a의 주소값이 들어가게 된다. 여기서 참조자(&)는 변수에 담긴 값이 아니라 그 데이터의 주소를 읽어오는 역할이다.

출력 결과

b에는 주소값이 담겨서 값으로 이상한 값이 출력이 되는 것을 볼 수 있는데, 이 주소값은 16진수로 표현이 된 것이다.

그래서 b의 값과 a의 주소값이 같은 것을 알 수 있다. 그리고 이 b에 담긴 주소값이 가리키는 데이터의 값은 5를 말한다.

그래서 &var는 해당 변수의 주소를 나타내는 것이고, *var는 해당 주소가 가리키는 값을 나타내준다.

 

모든 자료형 뒤에 포인터(*)를 붙이면 포인터 자료형이 된다.

하지만, 자료형의 종류는 통일시켜줘야 서로 값을 주고받을 수 있다는 것만 알아두자.


이중 포인터(Double pointer)

그냥 더블 포인터라고도 부른다. 말 그대로 포인터(*)를 두 개 연속으로 달아놓은 자료형을 말한다.

int a = 5;
int* b;
b = &a;

int** c; //더블 포인터, int*형의 주소를 담는 포인터
c = &b;

cout << "c의 값 : " << c << endl;
cout << "c가 가리키는 값 : " << *c << endl;
cout << "c가 가리키는 값의 가리키는 값 : " << **c << endl;
cout << "c의 주소 : " << &c << endl;

이중 포인터(int** c)는 포인터(int* b)의 주소값을 담을 수 있다.

따라서 결괏값은 이렇게 나온다.

이중포인터 출력 결과

여기서 c가 가리키는 값은 결국 포인터 b에 담긴 값을 말을 말한다. 즉, a의 주소값과 같은 것을 말하는 것이다.

이렇게 포인터가 늘어날수록, 서로 가리키는 값이 어느 것인지 잘 구별할 필요가 있다.

 

이중 포인터 말고도 삼중 포인터 사중 포인터 등등 본인이 원하는 만큼의 포인터를 붙일 수 있다.

하지만 그렇게까지 많이 붙이는 일은 드물어서 많아봤자 사중 포인터가 최대인 경우가 많다.


그리고 우리가 앞서 배열에 대해서 배웠을 것이다.

이 배열에도 주소값이 있는데, 배열의 주소값은 바로 배열의 이름이다.

예를 들면 int arr [10];의 주소값이 arr라는 것이다.  arr는 배열의 시작점, arr [0]의 주소를 말하고 있는 것이다.

그래서 arr [2]를 풀어서 쓰자면 *(arr + 2)의 형태로 쓸 수 있는 것이다.

 

const char* str1 = "*****"; //const 상수 심볼릭 상수
const char* str2 = "*****";

cout << str1 << endl;
cout << str2 << endl;
cout << str1 + 1<< endl;
cout << str2 + 2 << endl;

위와 같이 문자열을 초기화시켰다. 문자열은 배열의 형태로 저장이 될 텐데, 그래서 이를 출력하면 이러한 결과가 나온다.

출력 결과

배열의 이름이 주소라고 했듯이, str1과 str2는 문자열의 시작점을 말하고 있다.

그래서 문자열 전체가 출력이 된 것을 볼 수 있다.

그때 + index값을 해주어서 문자열의 시작점을 바꾼다면, 해당하는 위치가 시작점이 되어 출력이 되므로

중간부터 출력이 된 것을 볼 수 있다.

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

C++ 배우기 14(동적 할당)  (0) 2022.10.31
C++ 배우기 13(메모리 관리)  (0) 2022.10.31
C++ 배우기 11(메모리 구조)  (0) 2022.10.26
C++ 배우기 10(2차원배열)  (0) 2022.10.25
C++ 배우기 9(함수)  (0) 2022.10.24