C++

[강의] 9월 25일 수업정리

k-codestudy 2024. 9. 26. 03:59

오늘도 포인터에 대한 수업을 진행하였다.

 

포인터와 배열의 개념 정리

포인터는 일차원 배열과 유사하게 동작한다.

간단히 말해, 포인터는 거대한 일차원 배열의 특정 위치를 가리키는 주소 값을 제공하는 것이다.

 

예제 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개의 출력의 값은 어떤 식으로 나오게 되는가?

  1. *p는 arData [0]의 값인 5를 출력.
  2. *p + 1은 *p의 값에 1을 더해 6이 된다.
  3. *(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