int n = 100;
우리는 어떤 수나 문자를 저장하기 위해서 변수를 사용한다. 그러나 이 변수는 우리의 컴퓨터의 메모리에 어느 위치에 대한 이름인지를 나타낸 것이다.
친구랑 서울시청에서 모이기로 하였다. 서울 시청의 주소는 서울특별시 중구 세종대로 110이다. 우리는 후자와 전자로 말하여도 어디있는지 알 수 있지만 컴퓨터는 주소를 알아야 그 장소를 찾을 수 있다.
그래서 이 n이라는 변수는 100이 저장되어있는 어느 메모리의 이름인 것이다.
포인터(Pointer)
int* n;
int a = 10;
n = &a;
cout << "a의 주소 : " << &a << "\n";
cout << "n의 주소 : " << n << "\n";
포인터는 변수의 주소값을 저장하는 변수이다.
예를 들어, 변수 a에 10을 저장시키고, 포인터 n에게 a의 주소를 할당시킨다. 그리고 a의 주소와 n이 가르키고 있는 주소를 출력해보면 같은 값이 나올것이다. 즉 n은 a의 주소를 가르키는 함수이다.
인자전달
값전달에 대한 자세한 설명은 아래 글에 있다.
https://sayhello06.tistory.com/13
주소연산자와 역참조 연산
int a = 10;
cout << &a << "\n";
cout << *&a << "\n";
주소연산자 &로 변수의 주소를 확인할 수 있다.
또한 역참조 연산자 *로 주소값에있는 값에 접근할 수 있다.
동적 메모리 할당과 해제
int *n = new int;
*n = 123;
cout << "동적으로 할당된 변수의 값: " << *n << endl; //123
delete n;
포인터는 동적으로 메모리를 할당하고 사용할 수 있다. new 연산자를 사용하여 메모리를 할당하고, 사용이 끝나면 메모리 누수를 줄이기 위해 delete연산자를 활용하여 메모리 할당을 해제 해주어야 한다.
int* n = new int[3];
delete[] n;
이렇게 동적으로 배열을 만들 수도 있다.
배열과 포인터
int numbers[] = {1, 2, 3, 4, 5};
int *arrayPointer = numbers;
cout << "첫 번째 요소: " << *arrayPointer << endl; // 출력: 1
arrayPointer++; //배열은 연속된 주소값을 가지기 때문에 1의 다음수인 2가 된다.
cout << "두 번째 요소: " << *arrayPointer << endl; // 출력: 2
배열은 포인터와 관련이 깊다. 배열의 이름은 해당 배열의 첫 번째 요소를 가리키기 때문에 포인터와 같은역할을 한다. 그래서 포인터변수에다가 배열을 할당시켜주면 그 배열에 접근할 수 있다.
결론
C++의 핵심인 포인터는 이해하기 어렵지만 C++을 사용하려면 무조건 이해해야 하 개념이다. 포인터를 잘 활용하면 C++프로그래밍에서 메모리 관리와 유연한 데이터 조작을 할 수 있게된다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++]그리디 알고리즘(Greedy Algorithm) (0) | 2023.12.18 |
---|---|
[프로그래머스/C++] 네트워크 (0) | 2023.12.04 |
[프로그래머스/C++] 신고 결과 받기 (1) | 2023.11.22 |
[알고리즘/C++] 이진 탐색 트리 (Binary Search Tree, BST) (2) | 2023.11.08 |
[Algorithm] DFS와 BFS (2) | 2023.10.11 |