본문 바로가기
프로그래밍/C++

[C++] 5. C++의 "포인터와 참조"

by iwbap 2024. 6. 14.
728x90

C++ 학습: 포인터와 참조

C++에서 포인터와 참조는 메모리와 데이터를 효율적으로 다루기 위한 중요한 도구입니다. 이번 글에서는 포인터 개념, 포인터와 배열, 동적 메모리 할당, 그리고 참조에 대해 알아보겠습니다.


1. 포인터 개념: 포인터의 기본 개념과 사용법

포인터는 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 선언하려면 변수 자료형 앞에 *를 붙입니다. 포인터의 기본 사용법은 다음과 같습니다.

 

 

포인터 선언과 사용

[cpp]
 
#include <iostream>
using namespace std;

int main() {
    int var = 10;
    int *ptr = &var; // 포인터 ptr은 변수 var의 주소를 저장

    cout << "var의 값: " << var << endl;
    cout << "ptr이 가리키는 값: " << *ptr << endl; // 포인터를 통해 변수 var의 값에 접근

    return 0;
}
 

위의 예제에서 int *ptr은 정수를 가리키는 포인터를 선언합니다. &var는 변수 var의 주소를 반환하고, *ptr을 통해 포인터가 가리키는 변수의 값에 접근할 수 있습니다.


2. 포인터와 배열: 배열과 포인터의 관계

배열의 이름은 배열의 첫 번째 요소의 주소를 가리키는 포인터로 해석됩니다. 배열과 포인터의 관계는 다음과 같습니다.

 

 

포인터와 배열 사용 예

[cpp]
 
#include <iostream>
using namespace std;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 배열 이름은 첫 번째 요소의 주소를 가리킴

    for (int i = 0; i < 5; i++) {
        cout << "arr[" << i << "] = " << arr[i] << ", *(ptr + " << i << ") = " << *(ptr + i) << endl;
    }

    return 0;
}
 

위의 예제에서 int *ptr = arr은 배열 arr의 첫 번째 요소의 주소를 ptr에 저장합니다. *(ptr + i)를 통해 배열의 요소에 접근할 수 있습니다.


3. 동적 메모리 할당: new와 delete

동적 메모리 할당은 프로그램 실행 중에 필요한 메모리를 동적으로 할당하는 방법입니다. C++에서는 new와 delete를 사용하여 동적 메모리를 관리할 수 있습니다.

 

 

동적 메모리 할당 예제

[cpp]
 
#include <iostream>
using namespace std;

int main() {
    // 정수를 위한 동적 메모리 할당
    int *ptr = new int;
    *ptr = 10;
    cout << "동적으로 할당된 정수: " << *ptr << endl;
    delete ptr; // 메모리 해제

    // 배열을 위한 동적 메모리 할당
    int *arr = new int[5];
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }
    for (int i = 0; i < 5; i++) {
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }
    delete[] arr; // 배열 메모리 해제

    return 0;
}
 

위의 예제에서 new를 사용하여 정수와 배열을 위한 메모리를 동적으로 할당하고, delete와 delete[]를 사용하여 할당된 메모리를 해제합니다.


4. 참조: 참조자와 포인터의 차이

참조자는 변수의 별명(alias)으로, 변수의 주소를 저장하는 포인터와 다르게 변수 자체를 가리킵니다. 참조자는 선언 시 초기화가 필요하며, 한 번 초기화되면 다른 변수를 참조할 수 없습니다.

 

 

참조자 사용 예

 

[cpp]

 

#include <iostream>
using namespace std;

int main() {
    int var = 10;
    int &ref = var; // 참조자 ref는 변수 var를 참조

    cout << "var의 값: " << var << endl;
    cout << "ref의 값: " << ref << endl;

    ref = 20; // ref를 통해 var의 값을 변경
    cout << "var의 값(변경 후): " << var << endl;
    cout << "ref의 값(변경 후): " << ref << endl;

    return 0;
}

 

 

참조자와 포인터의 차이

  • 참조자 : 선언 시 반드시 초기화해야 하며, 한 번 참조하면 다른 변수를 참조할 수 없습니다. & 연산자를 사용하지 않고도 변수처럼 사용할 수 있습니다.
  • 포인터 : 선언 후 나중에 초기화할 수 있으며, 포인터 변수를 통해 다른 변수를 가리킬 수 있습니다. * 연산자를 사용하여 값을 참조합니다.

이번 글에서는 C++의 포인터와 참조에 대해 알아보았습니다. 포인터의 기본 개념과 사용법, 포인터와 배열의 관계, 동적 메모리 할당, 그리고 참조자와 포인터의 차이를 이해하는 것은 C++ 프로그래밍의 중요한 부분입니다. 다음 단계에서는 구조체와 클래스 개념을 학습해보세요. Happy Coding!

728x90