IT 프로그래밍/C++

[따배시 6.13] 포인터와 const

기술1 2024. 3. 29. 16:30
반응형
	int* array1 = new int[length](0);

이렇게 되면 0으로 초기화가 됩니다.

	int* array1 = new int[length] {11, 22, 33, 44, 55, 66};

위의 경우 11 22 33 44 55 66 까지 정상적으로 나오고 이후에는 쓰레기값으로 출력되게 됩니다. 

 

	int value = 5;
	int* ptr = &value;
	*ptr = 6;

이럴경우 ptr을 6으로 바꿔지면서 value도 6으로 바뀌게 됩니다. 

 

그런데 만약에 const int value를 하게 되면 포인터를 통해서 value를 읽으려면 point 또한 const를 붙여주셔야 합니다. 

int main()
{
	const int value = 5;
	const int* ptr = &value;

	cout << *ptr << endl;

	return 0;
}

 

그런데 만약 *ptr = 6; 이런 식으로 바꿔주려고 하면 안됩니다. const로 되어 있기 때문입니다. 

 

	int value = 5;
	const int* ptr = &value;
	*ptr = 6;

위 같은 경우 오류인 구문입니다. *ptr을 바꾸지 못합니다. 왜냐하면 const로 *ptr이 &value의 값을 가진다는 것을 const로 걸어놨기 떄문입니다. 

	int value = 5;
	const int* ptr = &value;
	value = 6;

	cout << *ptr << endl;

하지만 이렇게 value를 바꿔준다면 포인터도 6으로 바꿔줄 수 있습니다. 

 

	const int* ptr = &value1;

이 의미는 가리키고 있는 주소에 있는 값을 안 바꾸겠다는 것이지 ptr에 저장되는 주소값을 안 바꾸겠다는 의미가 아닙니다. 이것이 조금 헷갈려서 이해가 어렵기는 합니다. 

 

ptr의 값을 바꿀 수는 없는 것입니다. 예를들면 *ptr = 7은 불가능한 것입니다. 하지만 ptr = &value2; 이런 식으로는 가능합니다. 하지만 *ptr = 8;이런 식으로는 불가능한 것입니다. 

----------------------------------------------------

const int* ptr = &value1; 같은 선언에서 사용된 const int* 부분을 살펴보면 이것은 상수 포인터를 선언하는 것을 나타냅니다. 여기서 상수 포인터는 포인터가 가리키는 메모리 주소의 내용을 변경할 수 없음을 의미합니다. 즉 해당 포인터를 가리키는 메모리의 값을 변경할 수 없습니다.

 

따라서 *ptr = 7; 같은 코드는 허용하지 않습니다. 왜냐하면 ptr이 상수 포인터이기 때문에 해당 포인터를 가리키는 메모리의 내용을 변경할 수 없기 때문입니다.

 

그러나 ptr = &value2;와 같이 포인터가 가리키는 메모리 주소 자체는 변경할 수 잇습니다. 이는 다른 변수의 메모리 주소를 ptr에 할당하는 것입니다.

 

따라서 const omt *ptr = &value1;에서 포인터를 상수 포인터로 선언하였지만, 이는 포인터가 가리키는 메모리 주소를 변경할 수 없을 뿐입니다.. 포인터가 가리키는 메모리의 저장된 값은 변경될 수 있습니다. 이러한 개념은 처음에는 헷갈릴 수 있지만 제가 앞에 써놓은 부분을 쭉 읽어보면 이해가 갈 겁니다. 

 

 

반응형