포인터
드디어 정말 어렵고 헷갈리는 부분에 들어오게 되었다. 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 |