금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하
6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15
6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값, 주소값 참조에의한전달 : 참조변수 변수주소값의매개변수전달 void Power(int *pnum) *pnum = *pnum * *pnum; 2 /15 int Num = 3; Power(&Num); cout << Num << endl; Num 3 * pnum pnum을통해 Num 접근가능
6 강. 함수와배열, 포인터, 참조함수와포인터 주소값의반환 p 주소값반환도가능 단, 해당타입의포인터로 받음 * 값반환 * pary int *GetArray(int Count) int *p = new int[count]; return p; int *pary; pary = GetArray(5); for (int i = 0; i < 5; i++) pary[i] = i + 1; cout << pary[i] << endl; 3 /15 1 2 3 4 5 delete [] pary; 사용하고난후메모리해제
6 강. 함수와배열, 포인터, 참조함수와포인터 두변수의값을서로교환하는함수를다음과같이 만들었더니제대로동작하지않았다. 두변수의값 이교환되도록프로그램을수정하라. void swap(int x, int y) int temp = x; x = y; y = temp; a b 변수값전달의문제점 3 43 x 4 34 y 4 /15 int a = 3, b = 4; cout << "a = " << a << ", b = " << b << endl; swap(a, b); cout << "a = " << a << ", b = " << b << endl;
6 강. 함수와배열, 포인터, 참조함수와포인터 프로그램확인 void swap(int *x, int *y) int temp = *x; *x = *y; *y = temp; a b 해결방법 : 주소값전달 34 * x 43 * y 5 /15 int a = 3, b = 4; cout << "a = " << a << ", b = " << b << endl; swap(&a, &b); cout << "a = " << a << ", b = " << b << endl;
6 강. 함수와배열, 포인터, 참조함수와배열 배열의매개변수전달방법 첫번째원소의주소값전달 참고사항 int Ary[5]; Ary의타입 : int * &Ary의타입 : int (*)[5] 원소의개수를함께전달 int Sum(int *pary, int Count) int S = 0; for (int i = 0; i < Count; i++) S += pary[i]; return S; Ary 1 * pary 포인터를배열처럼사용 6 /15 2 3 4 5 int Ary[5] = 1, 2, 3, 4, 5 ; cout << Sum(Ary, 5) << endl;
6 강. 함수와배열, 포인터, 참조함수와배열 int 형 1 차원배열을매개변수로전달받아원소들의 값을역순으로재정렬하는함수 Reverse 를작성하라. 중간까지반대편원소와교환 1 2 3 4 5 int Ary[5] = 1, 2, 3, 4, 5 ; Reverse(Ary, 5); for (int i = 0; i < 5; i++) 2. 교환 cout << Ary[i] << " "; cout << endl; 1. 교환 7 /15
6 강. 함수와배열, 포인터, 참조함수와배열 프로그램확인 void Reverse(int *pary, int Count) for (int i = 0; i < Count / 2; i++) int temp = pary[i]; pary[i] = pary[count - i - 1]; pary[count - i - 1] = temp; 중간까지반대편원소와교환 1 2 3 4 5 2. 교환 1. 교환 8 /15
6 강. 함수와배열, 포인터, 참조함수와참조 참조에의한매개변수전달 변수그자체를매개변수로전달받을수있음 void square(int &Num) Num = Num * Num; a와 Num은동일한변수 Num == a 3 int a = 3; square(a); cout << a << endl; 9 /15
6 강. 함수와배열, 포인터, 참조함수와참조 10 /15 참조의반환 변수그자체를반환할수있음 사라질변수 ( 지역변수와같은 ) 그자체를반환하지않도록 주의 int &GetNumber(int &Num) Num = Num + Num; return Num; int a = 3; GetNumber(a) = 100; cout << a << endl; 매개변수전달 Num == GetNumber(a) == a 참조반환 63 Num == a 100 6
6 강. 함수와배열, 포인터, 참조함수와참조 두변수의값을서로교환하는함수인 swap 함수를 포인터가아닌참조를사용하여구현해보라. void swap(int x, int y) int temp = x; x = y; y = temp; int a = 3, b = 4; cout << "a = " << a << ", b = " << b << endl; swap(a, b); cout << "a = " << a << ", b = " << b << endl; 11 /15
6 강. 함수와배열, 포인터, 참조함수와참조 프로그램확인 void swap(int &x, int &y) int temp = x; x = y; y = temp; x == y == a b 43 43 12 /15 int a = 3, b = 4; cout << "a = " << a << ", b = " << b << endl; swap(a, b); cout << "a = " << a << ", b = " << b << endl;
6 강. 함수와배열, 포인터, 참조프로그래밍연습 int 형배열과원소의개수를매개변수로전달받아 원소들전체를더한결과와곱한결과를한꺼번에 반환하고자한다. 그러나함수의반환값으로는단 한개만반환이가능하다. 매개변수를사용하여이 를해결해보라. 1. 포인터를사용해보라. 2. 참조를사용해보라. int Ary[5] = 1, 2, 3, 4, 5 ; int Sum, Multi; Sum = SumMulti(Ary, 5, Multi); //? cout << "Sum : " << Sum << endl; cout << "Multi : " << Multi << endl; 13 /15
6 강. 함수와배열, 포인터, 참조프로그래밍연습 포인터를사용한경우 int SumMulti(int *Ary, int Count, int *Mul) int Sum = 0; *Mul = 1; for (int i = 0; i < Count; i++) Sum += Ary[i]; *Mul *= Ary[i]; return Sum; int Ary[5] = 1, 2, 3, 4, 5 ; int Sum, Multi; Sum = SumMulti(Ary, 5, &Multi); cout << "Sum : " << Sum << endl; cout << "Multi : " << Multi << endl; 14 /15
6 강. 함수와배열, 포인터, 참조프로그래밍연습 참조를사용한경우 int SumMulti(int *Ary, int Count, int &Mul) int Sum = 0; Mul = 1; Mul 과 Multi 는동일 for (int i = 0; i < Count; i++) Sum += Ary[i]; Mul *= Ary[i]; return Sum; int Ary[5] = 1, 2, 3, 4, 5 ; int Sum, Multi; Sum = SumMulti(Ary, 5, Multi); cout << "Sum : " << Sum << endl; cout << "Multi : " << Multi << endl; 15 /15