본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 9: 포인터와 참조자

by cogito21_cpp 2024. 8. 1.
반응형

포인터 (Pointers)

포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터는 매우 강력한 도구로, 동적 메모리 할당, 배열, 함수 인자 등에서 유용하게 사용됩니다.

 

1. 포인터 선언과 초기화

포인터를 선언할 때는 데이터 타입 뒤에 *를 붙입니다. 포인터는 다른 변수의 주소를 저장할 수 있습니다.

int a = 10;
int *p = &a;  // 포인터 p는 변수 a의 주소를 저장

 

2. 주소 연산자와 간접 참조 연산자

  • 주소 연산자 (&): 변수의 메모리 주소를 반환합니다.
  • 간접 참조 연산자 (*): 포인터가 가리키는 변수의 값을 반환합니다.
    int a = 10;
    int *p = &a;  // p는 a의 주소를 저장
    cout << "Address of a: " << &a << endl;
    cout << "Value of p: " << p << endl;
    cout << "Value pointed by p: " << *p << endl;

3. 포인터 연산

포인터는 산술 연산이 가능합니다. 포인터에 숫자를 더하거나 빼면, 포인터가 가리키는 메모리 주소가 변경됩니다.

int arr[3] = {1, 2, 3};
int *p = arr;
cout << *p << endl;     // 1
p++;
cout << *p << endl;     // 2
p--;
cout << *p << endl;     // 1

 

4. 동적 메모리 할당

new 연산자를 사용하여 동적으로 메모리를 할당할 수 있습니다. 할당된 메모리는 delete 연산자를 사용하여 해제합니다.

int *p = new int;  // 정수형 변수에 대한 메모리 할당
*p = 10;
cout << *p << endl;
delete p;  // 메모리 해제

int *arr = new int[5];  // 정수형 배열에 대한 메모리 할당
for (int i = 0; i < 5; i++) {
    arr[i] = i * 2;
}
delete[] arr;  // 배열 메모리 해제

 

참조자 (References)

참조자는 다른 변수의 별칭(또는 별명)입니다. 참조자는 변수의 메모리 주소를 직접 참조하므로, 값 자체를 변경할 수 있습니다.

 

1. 참조자 선언과 초기화

참조자를 선언할 때는 데이터 타입 뒤에 &를 붙입니다. 참조자는 선언과 동시에 초기화해야 합니다.

int a = 10;
int &ref = a;  // ref는 a의 참조자

 

2. 참조자의 사용

참조자를 사용하여 원래 변수를 수정할 수 있습니다.

int a = 10;
int &ref = a;
ref = 20;
cout << "a: " << a << endl;  // 20

 

3. 함수 인자로 참조자 사용

참조자를 함수 인자로 사용하면, 함수 내에서 원래 변수의 값을 변경할 수 있습니다.

void increment(int &n) {
    n++;
}

int main() {
    int a = 10;
    increment(a);
    cout << "a: " << a << endl;  // 11
    return 0;
}

 

예제 문제

문제 1: 포인터를 사용하여 두 정수의 값을 교환하는 함수 작성

포인터를 사용하여 두 정수의 값을 교환하는 함수를 작성하고, 이를 테스트하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 10, y = 20;
    cout << "Before swap: x = " << x << ", y = " << y << endl;
    swap(&x, &y);
    cout << "After swap: x = " << x << ", y = " << y << endl;
    return 0;
}

 

이 프로그램은 포인터를 사용하여 두 정수의 값을 교환하는 swap 함수를 구현하고 테스트합니다.

 

문제 2: 동적 메모리를 사용하여 배열의 요소를 입력받아 출력하는 프로그램 작성

사용자로부터 배열의 크기를 입력받아 동적으로 메모리를 할당한 후, 배열의 요소를 입력받아 출력하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

int main() {
    int n;
    cout << "Enter the size of the array: ";
    cin >> n;

    int *arr = new int[n];
    cout << "Enter " << n << " elements: ";
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    cout << "Array elements: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    delete[] arr;  // 동적 메모리 해제
    return 0;
}

 

이 프로그램은 동적 메모리를 사용하여 배열의 요소를 입력받아 출력합니다.

 

문제 3: 참조자를 사용하여 두 수를 더하는 함수 작성

참조자를 사용하여 두 수를 더하는 함수를 작성하고, 이를 테스트하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

void add(int &a, int &b, int &result) {
    result = a + b;
}

int main() {
    int x = 10, y = 20, sum;
    add(x, y, sum);
    cout << "Sum: " << sum << endl;  // 30
    return 0;
}

 

이 프로그램은 참조자를 사용하여 두 수를 더하는 add 함수를 구현하고 테스트합니다.

 

다음 단계

9일차의 목표는 C++의 포인터와 참조자에 대해 학습하는 것이었습니다. 다음 날부터는 동적 메모리 할당에 대해 다룰 것입니다.

 

내일은 "동적 메모리 할당 (new, delete)"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형