Araina’s Blog

포인터 기초 개념 본문

Develop Study/C++

포인터 기초 개념

Araina 2024. 1. 23. 16:05


 

 

1. 다이내믹 메모리

컴퓨터가 사용하는 모든 데이터는 메모리 상에 저장됩니다.

배열(Array)의 경우 연속된 메모리 공간을 할당하여 여러 개의 데이터를 한꺼번에 관리하는 방법이지만 메모리 공간이 유동적으로 필요할 경우에 문제가 발생합니다.

이는 배열을 위한 메모리 공간을 할당한 이후에는 그 공간의 크기를 유동적으로 조절할 수 없기 때문입니다.

만약, 배열의 크기를 넘어갈 경우 오버플로우(Overflow) 에러가 발생하고, 배열의 크기보다 적게 사용할 경우 메모리 공간이 낭비되는 문제가 생깁니다.

포인터 변수는 '메모리 주소'를 저장하는 방식을 사용하기 때문에 이러한 문제에서 자유롭습니다.

포인터 변수는 아래와 같이 정의합니다.

int *p;

 


 

2. & 연산자

포인터 변수는 값이 아닌 값의 주소를 저장합니다.

그렇다면 값의 주소는 어떻게 가져올까요?

이때 & 연산자가 사용됩니다.

& 연산자는 해당 값의 메모리 주소를 가져오는 역할을 합니다.

int num = 10;
int *p = #

cout << p;

p는 포인터 변수이므로, num 대신 &num을 할당했습니다.

위 코드를 실행해 보면 num 변수에 할당된 정수 값인 10이 출력되지 않습니다.

그 대신 0x1124dv1....처럼 num 변수의 메모리 주소가 출력됩니다.

 


 

3. * 연산자

* 연산자는 앞서 설명한 것처럼 포인터 변수를 정의할 때도 사용되지만, 메모리 주소에 저장된 값을 출력할 때도 사용됩니다.

이를 역참조 연산자(Dereference operator)라고 부릅니다.

int num = 10;
int *p = &num;

cout << *p;

이제 num에 저장된 값인 10이 출력될 것입니다.

이처럼 동일한 문자가 위치에 따라 다른 의미를 지니는 경우가 있으므로 혼동하지 않게 주의해야 합니다.

- & 연산자는 변수의 메모리 주소에 접근할 때 사용됩니다.

- * 연산자는 역참조 연산자로서 포인터 변수에 저장된 메모리 주소의 값에 접근할 때 사용됩니다.

- * 연산자는 포인터 변수를 정의할 때도 사용되는데, 이 경우에는 역참조 연산자와는 별개입니다.

 


 

4. 포인터 변수 다루기

포인터 변수는 값이 아닌 메모리 주소를 저장한다는 특징이 있어 경우에 따라 매우 유용하게 다룰 수 있습니다.

int num = 10;
int *p = &num;

cout << p << endl;   // 0x11dv...
cout << *p; << endl; // 10

*p = 5;

cout << num << endl;  // 5
cout << *p << endl;   // 5

위 코드에서 *p = 5 부분의 의미는 '포인터 변수 p가 가리키고 있는 메모리 주소에 5를 할당한다'는 의미입니다.

즉, num 변수의 메모리 주소에 접근하여 5를 저장하게 됩니다.

포인터 변수는 아래와 같이 배열과 함께 사용할 수도 있습니다.

int arr[] = {1, 2, 3, 4, 5};
int *p = &arr;

cout << *p << endl;     // 1
cout << *(p+1) << endl; // 2

*p += 1;

cout << *p << endl;     // 2

 


 


수고하셨습니다!


'Develop Study > C++' 카테고리의 다른 글

상속의 타입  (0) 2024.02.13
2D Array Row, Column  (0) 2024.01.23
friend 키워드  (0) 2024.01.10
클래스  (0) 2023.12.27
구조화된 바인딩  (0) 2023.12.24
Comments