pass-by-address

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
47/56

GPT

C/C++에서 주소로 전달(Pass by Address)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.

1. 주소로 전달 개요

주소로 전달은 함수에 인수의 주소를 전달하는 방법입니다. 이는 포인터를 사용하여 함수에 인수를 전달하며, 함수가 매개변수를 통해 인수의 주소에 직접 접근하고 수정할 수 있습니다. 따라서 함수 내부에서 매개변수의 값을 변경하면 실제 인수에도 영향을 미칩니다.

2. 주소로 전달의 선언과 사용법

예제: 주소로 전달

#include <iostream>

// 주소로 전달을 통한 값 수정 함수
void modifyValue(int* ptr) {
    *ptr = 10; // 포인터를 통해 값 변경
}

int main() {
    int a = 5;
    std::cout << "Before modifyValue: " << a << std::endl;
    modifyValue(&a); // 주소로 전달
    std::cout << "After modifyValue: " << a << std::endl; // a의 값이 변경됨
    return 0;
}

주요 개념

  • 포인터 사용: 함수 호출 시 인수의 주소를 포인터로 전달합니다.
  • 직접 수정: 함수 내부에서 포인터를 사용하여 인수의 실제 값을 직접 수정할 수 있습니다.

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

스택 프레임과 주소로 전달

주소로 전달할 때, 함수가 호출될 때마다 새로운 스택 프레임이 생성됩니다. 이 스택 프레임에는 매개변수의 주소(포인터), 지역 변수, 반환 주소 등이 저장됩니다. 함수가 종료되면 해당 스택 프레임은 제거됩니다.

스택 메모리 구조:
+------------------+
|      ...         |
+------------------+
| modifyValue 함수  |
| 매개변수 ptr (주소)|
+------------------+
| main 함수         |
| 변수 a            |
+------------------+
|      ...         |
+------------------+

메모리 접근

주소로 전달할 때, 함수는 매개변수로 받은 포인터를 통해 실제 인수의 메모리 위치에 접근합니다. 이를 통해 함수 내부에서 인수의 값을 직접 수정할 수 있습니다.

4. 그림과 삽화

주소로 전달의 개념과 메모리 구조를 이해하기 쉽게 그림과 표로 표현하였습니다.

주소로 전달 예시:

int a = 5;
modifyValue(&a);

메모리 배치:
+------------------+
| main 함수         |
| 변수 a: 5         |
+------------------+
       |
       v
+------------------+
| modifyValue 함수  |
| 매개변수 ptr: 주소 |
+------------------+

주소로 전달 과정:
1. a의 주소가 ptr에 전달됨
2. ptr이 a의 주소를 가리킴
3. *ptr을 통해 a의 값을 10으로 변경
4. modifyValue 함수 종료 후 a의 값은 10으로 변경됨

5. 예제 코드 확장

다양한 상황에서 주소로 전달을 사용하는 예제를 추가로 제공합니다.

배열의 주소로 전달

#include <iostream>

// 배열을 주소로 전달하여 값 수정 함수
void modifyArray(int* arr, int size) {
    for (int i = 0; i < size; ++i) {
        arr[i] = i * 2; // 배열 요소 수정
    }
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    std::cout << "Before modifyArray: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    modifyArray(arr, 5); // 배열의 주소로 전달

    std::cout << "After modifyArray: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

구조체의 주소로 전달

#include <iostream>

struct Point {
    int x, y;
};

// 구조체를 주소로 전달하여 값 수정 함수
void modifyPoint(Point* p) {
    p->x = 10;
    p->y = 20;
}

int main() {
    Point pt = {5, 5};
    std::cout << "Before modifyPoint: (" << pt.x << ", " << pt.y << ")" << std::endl;
    modifyPoint(&pt); // 구조체의 주소로 전달
    std::cout << "After modifyPoint: (" << pt.x << ", " << pt.y << ")" << std::endl;
    return 0;
}

요약

주소로 전달은 함수에 인수의 주소를 포인터로 전달하는 방법입니다. 이를 통해 함수는 매개변수를 통해 인수의 실제 메모리 위치에 접근하고, 인수의 값을 직접 수정할 수 있습니다. 주소로 전달은 함수 호출 시 새로운 스택 프레임을 생성하며, 포인터를 사용하여 메모리에 접근합니다. 운영체제는 함수 호출과 관련된 스택 메모리를 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.

이와 같은 내용을 통해 C/C++의 주소로 전달에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글