-
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