ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 함수(2)
    C++ 2025. 3. 22. 16:03

    C++에서 배열의 이름은 배열의 첫번째 원소의 주소값과 같다.

    #include <iostream>
    const int SIZE = 8;
    
    using namespace std;
    
    int sumArr(int*, int);
    
    int main() {
        int arr[SIZE] = {1, 2, 4, 8, 16, 32, 64, 128};
        // arr == &arr[0]
        int sum = sumArr(arr, SIZE);    
        
        cout << "함수의 총 합은 " << sum << endl;
        return 0;
    }
    
    int sumArr(int* arr, int n) {
        int total = 0;
            for (int i =0; i< n; i++) {
                total += arr[i];
    
        }
        return total;
    }

    SIZE, 즉 배열의 크기는 8로 선언하였다.

    포인터 arr은 배열의 시작인 arr[0]의 주소를 가리키고 있다.

    예를들어, 배열의 시작 주소와 끝 주소를 매개변수로 사용할 수 있다.

    #include <iostream>
    const int SIZE = 8;
    
    using namespace std;
    
    int sumArr(int* begin, int* end);
    
    int main() {
        int arr[SIZE] = {1, 2, 4, 8, 16, 32, 64, 128};
        int sum = sumArr(arr, arr + SIZE);    
        
        sum = sumArr(arr, arr+3);
        cout << "세번째  인덱스 까지의 합은 " << sum << endl;
        return 0;
    }
    
    int sumArr(int* begin, int* end) {
        int total = 0;
        int* pt;
    
            for (pt = begin; pt !=end; pt++)
            total += *pt;
        return total;
    }

    배열의 시작주소와 끝 주소를 알려준다. 카운터로써 포인터 pt를 선언하고, 포인터가 배열의 끝주소를 가리키면 반복문은 끝난다.

    포인터 begin은 arr를 받았기때문에 arr[0]을 가리킨다. 따라서 반복문 내에서 pt는 arr[0]을 가리키며 반복문을 시작한다.

     

    함수로 구조체를 관리하는 방법이다.

    #include <iostream>
    using namespace std;
    
    struct Time {
        int hours;
        int mins;
    };
    
    const int minsPerHr = 60;
    
    Time sum(Time*, Time*);
    void showTime(Time);
    
    int main() {
        //함수는 원본이 아닌 복사본을 대상으로 작업한다.
    
        Time day1 = {5, 45};
        Time day2 = {4, 55};
    
        Time total = sum(&day1, &day2);
    
        cout << "이틀간 소요 시간 : ";
        showTime(total);
        
        return 0;
    }
    
    Time sum(Time* t1, Time* t2) {
        Time total;
    
        total.mins = (t1 -> mins + t2 -> mins) % minsPerHr;
        total.hours = t1 -> hours + t2 -> hours + (t1 ->mins + t2->mins) / minsPerHr;
    
        return total;
    }
    
    void showTime(Time t1) {
        cout << t1.hours << "시간, " <<t1.mins << "분 입니다." << endl;
    }

    구조체 Time을 만들고, 멤버 변수로 hours랑 mins를 선언하였다.

    day1과 day2는 각각 5시간 45분, 4시간 55분을 저장할는 구조체이다.

    sum함수를 호출할 때 주소를 전달한다.

    sum 함수 매개변수 t1과 t2는 각각 구조체의 주소를 가리킨다.

    구조체의 값에서 멤버에 접근할때는 . 연산자를 사용하고, 구조체의 주소에서 멤버에 접근할때는 간접참조연산자인 -> 를 사용한다.

    구조체의 규모가 커질때는 함수는 구조체의 원본이아닌 복사본을 대상으로 작업을한다. 포인터를 사용하면 시간을 줄일 수 있다.

     

    재귀함수

    #include <iostream>
    using namespace std;
    
    void countDown(int n) {
        cout << "Counting..." << n <<endl;
        if (n >0) {
            countDown(n-1);
        }
    
        cout << n << "번째 재귀함수" << endl;
    
    }
    int main() {
    
        countDown(5);
    
        return 0;
    }

    나 자신을 호출하는 함수를 재귀함수라 한다. 재귀 호출은 스택을 이용하여 진행되며, 나중에 호출된 것이 먼저 실행 종료된다.(LIFO)

    위 코드에서 countDown에 5라는 값을 입력하면 n의값은 5 , 4 , 3 , 2 , 1로 출력되고, n번째 재귀함수는 역순으로 출력된다.

     

    어떠한 함수에 함수의 주소를 매개변수로 넘겨주는 경우 유용하게 사용할 수 있다.

    1. 함수의 주소를 얻는다.

    2. 함수를 지시하는 포인터를 선언한다.

    3. 함수를 지시하는 포인터를 사용하여 그 함수를 호출한다.

     

    함수의 주소를 얻는 방법은 함수가 선언돼어있을때 뒤에 붙은 괄호를 빼고 이름만 사용하면된다.

    #include <iostream>
    using namespace std;
    
    int func(int n) {
        return n + 1;
    }
    
    int main() {
        int (*pf)(int);
        pf = func;
    
        cout << (*pf)(3) << endl;
    
        return 0;
    }

    먼저 int (*pf)(int) 구문은 함수 포인터를 선언한 부분이다.

    pf는 정수를 매개변수로 받아 정수를 반환하는 함수의 주소를 저장할 수 있다.

    func 함수의 주소를 pf 포인터에 저장한다.

    정리하면 func()를 가리키는 함수 포인터 pf를 선언하고, pf에 func의 주소를 저장한다. (*pf)(3)을 호출하여 4를 출력하는 문이다.

    'C++' 카테고리의 다른 글

    C++ 함수 오버로딩과 템플릿  (0) 2025.03.26
    C++ 인라인 함수 및 디폴트 매개변수  (0) 2025.03.25
    C++ 함수 (1)  (0) 2025.03.21
    C++ if구문과 if else 구문 , switch 구문과 break/continue  (0) 2025.03.21
    C++ 반복문 (2)  (0) 2025.03.21
Designed by Tistory.