오늘도 포인터에 대한 수업을 진행하였다.
포인터와 배열의 개념 정리
포인터는 일차원 배열과 유사하게 동작한다.
간단히 말해, 포인터는 거대한 일차원 배열의 특정 위치를 가리키는 주소 값을 제공하는 것이다.
예제 1: 포인터의 주소값 변화
#include <iostream>
int main()
{
int nData{};
int* p{};
nData = 1;
p = &nData;
printf("%p\n", p);
p++;
printf("%p\n", p);
}
위 코드에서 nData는 int형 변수이고, p는 nData의 주소를 가리키는 포인터이다.
p를 출력하고 p++을 한 후 다시 출력을 하게 되면 값은 어떻게 바뀌게 되었을까?
실행을 해보게 되면 4가 증가된 것을 볼 수 있다.
왜 1이 증가하지 않고 4가 증가하였을까? 그 이유는 int형이 4 bytes이기 때문이다.
포인터는 자료형의 크기만큼 증가하게 되고, 이는 배열에서 다음 칸으로 이동하는 것과 동일한 개념이다.
즉 포인터는 칸이 증가한다라고 개념을 잡으면 좋을 거 같다.
예를 들어 p += 3은 12 bytes(4 * 3) 증가한다.
.
예제 2: 포인터와 배열
#include <iostream>
int main()
{
int arData[5] = { 5,4,3,2,1 };
int* p{};
p = &arData[0];
printf("%d\n", *p);
p++;
printf("%d\n", *p);
}
배열 arData와 포인터 p를 사용하였다.
p에는 arData [0]의 주소를 가리키는데,
첫 번째 출력은 arData [0]의 주소값이 저장되어 있기에 5가 출력이 될 것이다.
p++을 하면 어떤 값이 나오게 되는가? 값은 4가 나오게 된다. 이유는 무엇일까?
아까 말했다시피 int형이라면 4가 증가하게 되는데 그렇게 되면 arData [1]을 가리키게 된다.
즉, 포인터를 증가시키면 배열의 다음 요소로 이동하게 되는 것이다.
예제 3: 포인터의 값 접근 방식
#include <iostream>
int main()
{
int arData[5] = { 5,4,3,2,1 };
int* p{};
p = &arData[0];
printf("%d\n", *p );
printf("%d\n", *p + 1);
printf("%d\n", *(p + 1));
}
그럼 아래의 3개의 출력의 값은 어떤 식으로 나오게 되는가?
- *p는 arData [0]의 값인 5를 출력.
- *p + 1은 *p의 값에 1을 더해 6이 된다.
- *(p + 1)은 p가 가리키는 위치에서 1만큼 이동하여 arData [1]의 값을 출력. ( 즉, *(p + 1) == p [1] )
팁, arData == &arData [0] 즉, 둘의 주소값은 같다.
스마트 포인터
스마트 포인터는 일반 포인터처럼 동작하지만, 메모리를 자동으로 관리하여 메모리 누수를 방지합니다. C++에서는 std::unique_ptr, std::shared_ptr 등 다양한 스마트 포인터를 사용할 수 있으며, 이들은 메모리 관리의 복잡성을 줄여줍니다.
'C++' 카테고리의 다른 글
[강의] 9월 27일 수업정리 (0) | 2024.09.27 |
---|---|
[강의] 9월 26일 수업정리 (1) | 2024.09.27 |
[강의] 9월 24일 수업정리 (0) | 2024.09.25 |
[강의] 9월 13일 수업정리 (0) | 2024.09.14 |
[강의] 9월 12일 수업정리 (0) | 2024.09.12 |