C++ 프로그래밍 10 2009년 2학기 전자정보공학대학 컴퓨터공학부
Outline Review: 배열과 구조체와 포인터 함수
배열과 포인터 일반적인 변수에서의 포인터와 거의 같다. int arrays[10]; int * p = &arrays[5];
포인터에 정수를 더하기/빼기 배열을 가리키는 포인터에 정수를 더하는/빼는 것은 원소의 개수만큼 이동하는 것을 의미! -1 +1
포인터간의 뺄셈 주소의 차가 아닌 사이의 원소의 개수가 나온다 int array[10]; int * p1 = array[5]; cout<<“p1=“<<p1<<“\n”; cout<<“p2=“<<p2<<“\n”; cout<<“p2-p1=“<<p2-p1<<“\n”;
배열의 특정 원소를 가리키기 int array[10]; int * p = array[0]; 5번째 원소는? array[5]; 배열의 이름은 첫번째 원소를 가리키는 상수 포인터
포인터의 배열 포인터를 원소로 갖는 배열을 정의할 수 있다 변수형 *포인터이름[원소개수]; 예제) int * pArray[3];
구조체를 가리키는 포인터 구조체를 변수형처럼 사용해서 포인터를 정의 할 수 있다 struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc;
구조체의 맴버 변수 접근 구조체변수.맴버변수 구조체에서는: 구조체포인터는: (*구조체포인터).맴버변수 구조체포인터->맴버변수 구조체포인터->맴버변수
구조체의 맴버 변수 접근 예 struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc; rc.x=10; (*p).x = 10; p->x = 10; 모두 같다
구조체와 포인터 구조체 내에 포인터를 맴버로 가질 수 있다 struct IHavePointer { int a; int * p; };
구조체를 가리키는 맴버 포인터 구조체를 가리키는 포인터를 맴버로 가질 수 있다 struct test { int a; test * p; };
구조체를 가리키는 맴버 포인터 struct Test { int id; Test * p; }; Test a,b,c; a.id = 1; a.p=&b; b.id = 2; b.p=&c; c.id = 3; c.p=NULL; cout<<“a.id:”<<a.id<<“\n”; cout<<“b.id:”<<a.p->id<<“\n”; cout<<“c.id:”<<a.p->p->id<<“\n”;
구조체를 가리키는 맴버 포인터 NULL
코딩연습 앞의 코드를 변경하여, while 문을 사용하여 a로 부터 출발하여 a, b, c의 int 내용을 다 출력 해주는 프로그램을 만들어라
Announcement 휴강공고 10월 8일 (목요일) 보강 계획: 추후 공고
함수1
함수 코드를 정리하고 정돈한다! 사후관리용이
함수란 작은 프로그램 (subprogram)
함수를 쓰는 이유 프로그램 작성 용이 절차의 추상화 일을 여러 단계의 작은 일로 쪼개는 것 Procedural Abstraction 일을 여러 단계의 작은 일로 쪼개는 것 Divide-and-conquer 반복적인 일의 수행 시 소스코드의 크기를 줄여준다
함수의 모양 초등학교 산수시간에… ?
y = f(x) 함수의 모양 고등학교 수학시간에… x: 함수의 인자 (parameter) f(): 함수 본체(body) y: 함수의 결과값 (반환값:return value)
함수의 모양 함수의 정의: 반환변수형 함수이름(인자1, 인자2,…) { 함수 내용; return 반환값; }
함수의 호출 인자(parameter)의 형태 및 개수가 함수의 정의와 같아야 한다. 함수이름(인자1, 인자2,…);
함수의 가장 간단한 모양 함수의 정의-인자와 반환값이 없을 경우: void 함수이름() { 함수 내용; }
간단한 함수 예제 #include <iostream> using namespace std; void printMessage() { cout<<“My first function! \n”; } int main() printMessage(); return 0;
간단한 함수 예제
간단한 함수 예제 #include <iostream> using namespace std; void printMessage() { cout<<“My first function! \n”; } int main() printMessage(); return 0;
함수의 위치 #include <iostream> using namespace std; int main() { printMessage(); return 0; } void printMessage() cout<<“My first function! \n”; ERROR!: main은 printMessage함수가 있는지 모른다!
함수의 위치 #include <iostream> using namespace std; void printMessage(); int main() { printMessage(); return 0; } void printMessage() cout<<“My first function! \n”; 어딘가에 함수가 있음을 알려줌 함수의 원형 (prototype)
함수의 모양 함수의 정의 – 반환값이 있는 경우: 반환변수형 함수이름() { 함수 내용; return 반환값; }
간단한 함수 예제2 #include <iostream> using namespace std; int three() { return 3; } int main() int i; i=three(); cout<<“i=“<<i<<“\n”; return 0;
간단한 함수 예제2 함수는 하나의 값만을 반환할 수 있다
Return 의 활용 Return의 두가지 의미 void printMessage() { return; 값을 반환 함수를 끝내라 void printMessage() { return; cout<<“My first function! \n”; } int main() printMessage(); return 0;
함수 활용 시의 주의점 다른 함수에 정의되어 있는 변수를 사용할 수 없다. void sub(); int main() { // 변수를 정의한다. int a = 3; // 함수 호출 sub(); return 0; } void sub() // 변수를 사용한다. ++a; // Error
인자(Arguments)의 전달 (1) 함수를 호출하면서 인자를 전달하는 예 int Factorial(int n); int main() { int result = Factorial( 5 ); cout << "5! 는 " << result << "입니다.\n"; return 0; } int Factorial(int n) int result = 1; for (int i = 1; i <= n; ++i) result *= i; return result;
인자(Arguments)의 전달 (1) 함수를 호출하면서 인자를 전달하는 예 [그림 14-10]
인자의 전달 (2) 인자는 함수의 매개 변수(Parameters)에 대입된다. [그림 14-11]
인자 전달의 규칙 함수가 호출될 때마다 인자의 값이 매개 변수로 대입되는 가상의 코드가 실행된다. int max(int a, int b) { return a > b ? a : b; } int main() // 3과 5중에 큰 값을 구한다. int ret = max(3, 5); return 0;
인자 전달의 규칙 함수가 호출될 때마다 인자의 값이 매개 변수로 대입되는 가상의 코드가 실행된다. [그림 14-13]
인자의 전달과 메모리 구조(1) main() 함수가 시작되고 화살표까지 실행된 순간의 메모리 상태 int max(int a, int b) { return a > b ? a : b; } int main() int arg1 = 3; int arg2 = 5; int ret = max(arg1, arg2); return 0; [그림 14-15]
인자의 전달과 메모리 구조(2) max() 함수가 호출되고 화살표까지 실행된 순간의 메모리 상태 이때 다음과 같은 가상의 코드가 실행된다. int max(int a, int b) { return a > b ? a : b; } int main() int arg1 = 3; int arg2 = 5; int ret = max(arg1, arg2); return 0; [그림 14-16] int a = arg1; int b = arg2;
인자의 전달과 메모리 구조(3) max() 함수가 끝나고 화살표까지 실행된 순간의 메모리 상태 int max(int a, int b) { return a > b ? a : b; } int main() int arg1 = 3; int arg2 = 5; int ret = max(arg1, arg2); return 0; [그림 14-17]
함수의 연습 인자 n을 받아서 “*”을 n개 만큼 출력하는 함수를 만들어라. example) n=5인 경우 ***** 이 함수를 이용하여 다음과 같은 삼각형을 출력! * ** *** **** *****
포인터와 레퍼런스의 사용 반환되어야 하는 값이 2개 이상일 때? 포인터를 사용 레퍼런스를 사용
포인터 변수를 인자로 전달하기(1) 나누기를 하여 몫과 나머지를 구한다 void Div_Rem(int a, int b, int div, int rem) { div = a/b; rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, div, rem); cout<<“23 = 5*“<<div<<“+”<<rem<<“\n”; return 0;
포인터 변수를 인자로 전달하기(1) 나누기를 하여 몫과 나머지를 구한다 void Div_Rem(int a, int b, int * pdiv, int * prem) { * div = a/b; * rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, &div, &rem); cout<<“23 = 5*“<<div<<“+”<<rem<<“\n”; return 0;
포인터 변수를 인자로 전달하기(2) 화살표까지 실행된 순간의 메모리 상태 void Div_Rem(int a, int b, int * pdiv, int * prem) { * div = a/b; * rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, &div, &rem); return 0; pdiv prem [그림 14-21] 23 5 div rem
포인터 변수를 인자로 전달하기(2) 화살표까지 실행된 순간의 메모리 상태 void Div_Rem(int a, int b, int * pdiv, int * prem) { * div = a/b; * rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, &div, &rem); return 0; pdiv prem [그림 14-21] 23 5 div 4 rem 3
포인터 변수를 인자로 전달하기(4) 포인터 타입의 인자를 사용해서 함수의 결과 값을 얻어오는 방법의 정리 함수의 매개 변수는 포인터 타입으로 정의한다. 인자를 넘겨줄 때는 결과 값을 담고 싶은 변수의 주소를 넘겨준다. 함수 안에서 결과를 넘겨줄 때는 매개변수가 가리키는 곳에 값을 넣어준다.
레퍼런스 변수를 인자로 전달하기(1) 레퍼런스 변수를 사용해서 함수 밖으로 결과를 전달 void Div_Rem(int a, int b, int& pdiv, int& prem) { div = a/b; rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, div, rem); cout<<“23 = 5*“<<div<<“+”<<rem<<“\n”; return 0;
레퍼런스 변수를 인자로 전달하기(2) 레퍼런스 타입의 인자를 사용해서 함수의 결과 값을 얻어오는 방법의 정리 함수의 매개 변수는 레퍼런스 타입으로 정의한다. 인자를 넘겨줄 때는 결과 값을 담고 싶은 변수를 그대로 넘겨준다. 함수 안에서 결과를 넘겨줄 때는 매개 변수에 값을 넣어준다.
코딩연습1 문자열을 입력 받아 입력 받은 문자열을 한 글자씩 미루게 만들어 주는 함수를 만들어라: 입력 문자열: abcde 함수 호출뒤: bcdea 이 함수를 이용하여 다음과 같이 출력하는 코드를 작성하라 입력: abcde 출력: abcde bcdea cdeab deabc eabcd
코딩연습2 아래와 같은 구조체를 정의하고 이 구조체 변수, a, b, c, d를 정의 한 뒤 두 변수를 연결시켜 주는 다음의 함수를 만들고, void Connect(test * front, test * back); 이를 이용해 a b c d NULL 로 연결되는 구조를 만들라. 연결된 변수들을 출력해 주는 다음의 함수 void print(test * a); 를 만들고 값들을 출력해 보여라. struct test { int val; test * p; };