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;에서 포인터를 상수 포인터로 선언하였지만, 이는 포인터가 가리키는 메모리 주소를 변경할 수 없을 뿐입니다.. 포인터가 가리키는 메모리의 저장된 값은 변경될 수 있습니다. 이러한 개념은 처음에는 헷갈릴 수 있지만 제가 앞에 써놓은 부분을 쭉 읽어보면 이해가 갈 겁니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 6.15 ~ 6.16] 참조, 포인터와 참조의 멤버 선택 연산자 (0) | 2024.03.30 |
---|---|
[따배시 6.14] 참조 변수 (0) | 2024.03.30 |
[따배시 6.11] 메모리 동적할당 new와 delete (1) | 2024.03.29 |
[따배시 6.10] C언어 스타일의 문자열 심볼릭 상수, 포인터 사용의 유의점 (0) | 2024.03.29 |
[따배시 6.9] 포인터 연산과 배열 인덱싱 (0) | 2024.03.29 |