주소로 전달

Jaemyeong Lee·2024년 8월 8일
0

FastCampusC++

목록 보기
41/78

C++ 주소(포인터) 전달 예제: 자세한 설명

이 포스트에서는 C++에서 포인터를 사용하여 주소를 전달하는 방법에 대해 알아보겠습니다. 포인터를 통해 함수 내에서 원본 데이터를 수정하는 다양한 예제를 통해 개념을 이해해보세요.

예제 1: 포인터 기본

int main() {
    {
        int x = 10;
        int* px = &x;

        cout << x << endl;       // 10
        cout << *px << endl;     // 10

        x = 20;
        cout << x << endl;       // 20
        cout << *px << endl;     // 20

        *px = 30;
        cout << x << endl;       // 30
        cout << *px << endl;     // 30
    }
}

설명:

  • x의 값을 10으로 설정하고, 포인터 pxx의 주소로 초기화합니다.
  • x*px를 출력하여 값이 같음을 확인합니다.
  • x의 값을 20으로 변경하고, *px도 같은 값을 출력합니다.
  • *px를 30으로 변경하면 x도 30으로 변경됩니다.

이 예제는 포인터를 사용하여 변수의 주소를 가리키고 해당 주소의 값을 변경하는 방법을 보여줍니다.

예제 2: 포인터를 사용한 스왑 함수

void swap0(int *px, int *py)
{
    int temp = *px;
    *px = *py;
    *py = temp;
}

int main() {
    {
        int x = 10, y = 20;
        cout << x << endl;       // 10
        cout << y << endl;       // 20

        swap0(&x, &y);

        cout << x << endl;       // 20
        cout << y << endl;       // 10
    }
}

설명:

  • swap0 함수는 두 정수 포인터를 받아 값을 교환합니다.
  • xy의 주소를 swap0에 전달하여 값을 교환합니다.
  • xy의 값이 바뀌었음을 확인할 수 있습니다.

이 예제는 포인터를 사용하여 함수 내에서 원본 변수의 값을 변경하는 방법을 보여줍니다.

예제 3: 수동 포인터 스왑

int main() {
    {
        int x = 10, y = 20;
        cout << x << endl;       // 10
        cout << y << endl;       // 20

        int* px = &x;
        int* py = &y;

        int temp = *px;
        *px = *py;
        *py = temp;

        cout << x << endl;       // 20
        cout << y << endl;       // 10
    }
}

설명:

  • swap0 함수의 단계를 main 함수 내에서 수동으로 수행합니다.
  • pxpyxy의 주소를 가리킵니다.
  • *px*py를 교환하여 xy의 값을 바꿉니다.

이 예제는 포인터를 사용하여 수동으로 값을 교환하는 방법을 보여줍니다.

예제 4: 주소로 값 설정

void scan(int* n)
{
    *n = 10;
}

int main() {
    {
        int n = 0;
        scan(&n);
        cout << n << endl; // 10
    }
}

설명:

  • scan 함수는 정수 포인터를 받아 값을 10으로 설정합니다.
  • n의 주소를 scan에 전달하여 n의 값을 10으로 변경합니다.

이 예제는 함수 내에서 포인터를 사용하여 변수의 값을 설정하는 방법을 보여줍니다.

예제 5: 구조체 포인터를 사용한 수정

struct Weapon {
    int price;
    int power;
};

void upgrade(Weapon* pWeapon)
{
    pWeapon->price += 10;
    pWeapon->power += 10;
}

int main() {
    {
        Weapon weapon{10, 20};
        upgrade(&weapon);

        cout << weapon.price << endl; // 20
        cout << weapon.power << endl; // 30
    }
}

설명:

  • Weapon 구조체를 정의하고 pricepower 필드를 포함합니다.
  • upgrade 함수는 Weapon 포인터를 받아 값을 수정합니다.
  • weapon의 주소를 upgrade에 전달하여 값을 수정합니다.

이 예제는 구조체 포인터를 사용하여 함수 내에서 구조체의 값을 수정하는 방법을 보여줍니다.

예제 6: const 포인터를 사용한 출력

void print(const Weapon *weapon)
{
    cout << weapon->price << endl;
    cout << weapon->power << endl;
}

int main() {
    {
        Weapon weapon{10, 20};
        print(&weapon);
    }
}

설명:

  • print 함수는 Weapon의 const 포인터를 받아 값을 출력합니다.
  • weapon의 주소를 print에 전달하여 값을 출력합니다.

이 예제는 const 포인터를 사용하여 함수 내에서 구조체의 값을 출력하는 방법을 보여줍니다.

예제 7: 배열 포인터 전달

void func0(int nums[4])
{
    cout << typeid(nums).name() << endl;

    for (int i = 0; i < 4; ++i)
    {
        int num = nums[i];
        cout << num << endl;
    }
}

int main() {
    {
        int nums[4] = {1, 2, 3, 4};
        func0(nums);
    }
}

설명:

  • func0 함수는 정수 배열을 받아 값을 출력합니다.
  • 배열은 실제로 포인터로 전달됩니다.
  • nums의 타입을 출력하면 int*로 표시됩니다.

이 예제는 배열을 함수에 전달할 때 포인터로 전달된다는 것을 보여줍니다.

예제 8: 명령줄 인수 처리

void func1(int argc, char** argv)
{
    // 구현 내용 없음
}

void func2(int argc, char(*argv)[5])
{
    // 구현 내용 없음
}

int main(int argc, char* argv[])
{
    {
        cout << typeid(argv).name() << endl; // char**
    }
    {
        func1(argc, argv);

        char strs[][5] = {"abcd", "efgh"};
        func2(2, strs);
    }
}

설명:

  • func1 함수는 명령줄 인수를 char**로 받아 처리합니다.
  • func2 함수는 2차원 배열을 받아 처리합니다.
  • argv의 타입을 출력하면 char**로 표시됩니다.

이 예제는 명령줄 인수가 실제로 포인터 배열로 전달된다는 것을 보여줍니다.

결론

C++에서 포인터를 사용하여 주소를 전달하면 함수 내에서 원본 데이터를 수정할 수 있습니다. 이를 통해 보다 효율적이고 유연한 코드를 작성할 수 있습니다. 포인터를 사용한 주소 전달의 개념을 이해하는 것은 C++ 프로그래밍에서 중요한 부분입니다.

profile
李家네_공부방

0개의 댓글