Microsoft PowerPoint - ch07 - 포인터 pm0415

Similar documents
제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

ch15

untitled

11장 포인터

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - chap-11.pptx

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

금오공대 컴퓨터공학전공 강의자료

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

슬라이드 1

Data Structure

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter_08.pptx

8장. 포인터

설계란 무엇인가?

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

Infinity(∞) Strategy

쉽게 풀어쓴 C 프로그래밍

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - chap10-함수의활용.pptx

11장 포인터

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

ABC 6장

Microsoft Word - FunctionCall

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

PowerPoint Template

문서의 제목 나눔명조R, 40pt

02장.배열과 클래스

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap12-고급기능.pptx

설계란 무엇인가?

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

6.1 Addresses and Pointers Recall memory concepts from Ch2 ch6_testbasicpointer.c int x1=1, x2=7; double distance; int *p; int q=8; p = &q; name addre

untitled

Microsoft PowerPoint - 09_C_Language_Pointer_Advanced

KNK_C_05_Pointers_Arrays_structures_summary_v02

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

chap10.PDF

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap6 [호환 모드]

Microsoft PowerPoint - chap06.ppt

OCW_C언어 기초

Microsoft PowerPoint - 제3장-배열.pptx

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

chap7.key

Microsoft Word - ExecutionStack

Microsoft PowerPoint - chap06-8 [호환 모드]

슬라이드 1

C 프로그래밊 개요

본 강의에 들어가기 전

강의10

PowerPoint 프레젠테이션

ABC 6장

C++ Programming

Chapter 4. LISTS

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft PowerPoint - chap06-8.ppt

Microsoft PowerPoint - C_9장 포인터 pptx

K&R2 Reference Manual 번역본

11장 포인터

Chapter 4. LISTS

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

歯7장.PDF

chap7.PDF

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - additional01.ppt [호환 모드]

BMP 파일 처리

11장 포인터

untitled

중간고사

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - 05장(함수) [호환 모드]

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 9ÀÏ°_ÂüÁ¶ÀÚ.ppt

Microsoft PowerPoint - Chapter_04.pptx

Transcription:

함수의인수 (argument) 전달방법 C 에서함수의인수전달방법 값에의한호출 (call-by-value): 기본적인방법 포인터에의한호출 (call-by-pointer): 포인터이용 참조에의한호출 (call-by-reference): 참조 (reference) 이용 7-35

값에의한호출 (call-by-value) 함수호출시에변수의값을함수에복사본으로전달 복사본이전달되며, 호출하는 (calling) 함수의변수와호출된 (called) 함수의인수 (argument) 는별도의변수로관리됨 호출된함수의인수가변경되어도, 호출한함수의변수는변경없음 값에의한호출은값만을복사해요. 100 int main(void) int i = 100; 100 i int sub( int v ) 100 v... sub( i );...... 7-36

Argument passing in Call-by-Value double average(int i, int j); void main(int argc, char *argv[]) int x, y; double d; x = 3; y = 5; d = average(x, y); printf( Average: %f n, d ); double average(int i, int j) double avg; Function Call: Function average() Return Function Call: main() stack frame for average( ) - arguments: int i, int j - local variables: double avg copy copy stack frame for main( ) - arguments: int argc, char * argv[] - local variables: int x, int y, double d Memory Stack return copy avg = (i + j)/2.0; return avg; 7-37

포인터에의한호출 (call-by-pointer) 함수호출시에변수의주소정보 ( 포인터 ) 를함수의매개변수로전달 참조에의한호출은주소를복사합니다. 96 int main(void) int i = 100;... sub( &i ); int sub( int *p )...... 100 i 96 93 94 95 96 97 98 99 100 p 7-38

Argument passing in Call-by-Pointer double average(int *pi, int *pj); void main(int argc, char *argv[]) int x, y; double d; x = 3; y = 5; d = average(&x, &y); printf( Average: %f n, d ); double average(int *pi, int *pj) double avg; Function Call: Function average() Return Function Call: main() stack frame for average( ) - arguments: int *pi, int *pj - local copy variables: of double avg return addr copy copy of stack frame for main( ) addr - arguments: int argc, char * argv[] - local variables: int x, int y, double d Memory Stack avg = (*pi + *pj)/2.0; return avg; 7-39

참조에의한호출 (call-by-reference) 함수호출시에변수의주소정보 ( 참조 ) 를함수의매개변수로전달 함수의호출시에 calling 함수에서의호출은 call-by-value에서와동일 호출된함수에서의 parameter에는 & 표시가데이터유형다음에표시됨 call-by-reference의경우, 호출된함수에서호출한함수의변수값을변경할수있음 예 double average(int i, int j); // call-by-value double average(int& i, int& j); // call-by-reference void main(int argc, char *argv[]) int x, y; double d;..... d = average(x, y);..... 7-40

Argument passing in Call-by-Reference void average(int i, int j, int& sum, double& avg); void main(int argc, char *argv[]) int x, y, sum; double avg; x = 3; y = 5; average(x, y, sum, avg); cout << Sum: << sum; cout <<, Average: << avg; void average(int i, int j, int& sum, double& avg) sum = i + j; avg = sum/2.0; Function Call: Function average() Return Function Call: main() 7-41 stack frame for average( ) - arguments: int i, j, int&sum, double& avg - local variables: copy ref ref stack frame for main( ) - arguments: int argc, char * argv[] - local variables: int x, y, sum, double avg Memory Stack

swap() 함수 #1 call-by-value 변수 2 개의값을바꾸는작업을함수로작성 #include <stdio.h> void swap(int x, int y); int main(void) int a = 100, b = 200; printf("a=%d b=%d\n",a, b); swap(a, b); printf("a=%d b=%d\n",a, b); return 0; 100 a <main> 200 100 200 200 100 b 함수호출시에값만복사된다. x y <swap> 7-42 void swap(int x, int y) int tmp; printf("x=%d y=%d\n",x, y); tmp = x; x = y; y = tmp; printf("x=%d y=%d\n",x, y); a=100 b=200 x=100 y=200 x=200 y=100 a=100 b=200

swap() 함수 #2 - call-by-pointer 포인터를이용 #include <stdio.h> void swap(int x, int y); int main(void) int a = 100, b = 200; printf("a=%d b=%d\n",a, b); swap(&a, &b); printf("a=%d b=%d\n",a, b); return 0; 함수호출시에주소가복사된다. void swap(int *px, int *py) int tmp; printf("*px=%d *py=%d\n", *px, *py); tmp = *px; *px = *py; *py = tmp; printf("*px=%d *py=%d\n", *px, *py); 200 100 &a a 200 100 &b b <main> px py <swap> 7-43 a=100 b=200 *px=100 *py=200 *px=200 *py=100 a=200 b=100

swap() 함수 #3 - call-by-reference 포인터를이용 #include <stdio.h> void swap(int& x, int& y); int main(void) int a = 100, b = 200; printf("a=%d b=%d n",a, b); swap(a, b); printf("a=%d b=%d n",a, b); return 0; 함수호출시에주소정보가전달된다. void swap(int & x, int &y) int tmp; printf("x=%d y=%d n", x, y); tmp = x; x = y; y = tmp; printf("x=%d y=%d n", x, y); 200 100 a 200 100 b <main> x y <swap> 7-44 a=100 b=200 x=100 y=200 x=200 y=100 a=200 b=100

파라메터전달방식의비교 /* TestParameterPassing.c */ #include <stdio.h> void swap_call_by_value (int x, int y); void swap_call_by_pointer(int *px, int *py); void swap_call_by_reference(int &x, int &y); void main() int x, y; x = 10; y = 30; printf(" nbefore call-by-value: x = %d, y = %d n", x, y); swap_call_by_value(x, y); printf("after call-by-value: x = %d, y = %d n", x, y); x = 5; y = 7; printf(" nbefore call-by-pointer: x = %d, y = %d n", x, y); swap_call_by_pointer(&x, &y); printf("after call-by-pointer: x = %d, y = %d n", x, y); x = 25; y = 50; printf(" nbefore call-by-reference: x = %d, y = %d n", x, y); swap_call_by_reference(x, y); printf("after call-by-reference: x = %d, y = %d n", x, y); printf(" n"); void swap_call_by_value(int a, int b) int temp; temp = a; a = b; b = temp; void swap_call_by_pointer(int *pa, int *pb) int temp; temp = *pa; *pa = *pb; *pb = temp; void swap_call_by_reference(int &a, int &b) int temp; temp = a; a = b; b = temp; 7-45

scanf() 함수 변수에값을저장하기위하여변수의주소를받는다. 7-46

2 개이상의결과를반환 #include <stdio.h> // 기울기와 y절편을계산 int get_line_parameter(int x1, int y1, int x2, int y2, float *slope, float *yintercept) if( x1 == x2 ) 기울기와 Y절편을인수로전달 return -1; else *slope = (float)(y2 - y1)/(float)(x2 - x1); *yintercept = y1 - (*slope)*x1; return 0; int main(void) float s, y; if( get_line_parameter(3,3,6,6,&s,&y) == -1 ) printf(" 에러 n"); 기울기는 1.000000, y절편은 0.000000 else printf(" 기울기는 %f, y절편은 %f n", s, y); return 0; 7-47

일반변수 vs 배열 배열이함수인수인경우 // 매개변수 x에기억장소가할당 void sub(int x)... // b[] 에기억장소가할당되지않는다. void sub(int b[], int n)... 배열의경우, 크기가큰경우에복사하려면많은시간소모 배열의경우, 배열의주소를전달 7-48

예제 #include <stdio.h> void sub(int b[], int n); int main(void) int a[3] = 1,2,3 ; 1 2 3 4 5 6 a[0] a[1] a[2] printf("%d %d %d\n", a[0], a[1], a[2]); sub(a, 3); printf("%d %d %d\n", a[0], a[1], a[2]); return 0; void sub(int b[], int n) b[0] = 4; b[1] = 5; b[2] = 6; 1 2 3 4 5 6 7-49

포인터를반환할때주의점 함수가종료되더라도남아있는변수의주소를반환하여야한다. 지역변수의주소를반환하면, 함수가종료되면사라지기때문에오류 int *add(int x, int y) int result; result = x + y; return &result; 지역변수 result 는함수가종료되면소멸되므로그주소를반환하면안된다! 7-50

이중포인터 (double pointer) 이중포인터 (double pointer) : 포인터를가리키는포인터 int i = 10; int *p = &i; int **q = &p; // i 는 int 형변수 // p 는 i 를가리키는포인터 // q 는포인터 p 를가리키는이중포인터 7-51

이중포인터 이중포인터의해석 7-52

이중포인터 // 이중포인터프로그램 #include <stdio.h> *q int main(void) int i = 100; int *p = &i; int **q = &p; **q 100 200 300 p 포인터 *p = 200; printf("i=%d *p=%d **q=%d n", i, *p, **q); i 변수 i q 이중포인터 **q = 300; printf("i=%d *p=%d **q=%d n", i, *p, **q); return 0; **q == *(*q) i=200 *p=200 **q=200 i=300 *p=300 result **q=300 7-53

예제 #2 #include <stdio.h> void set_pointer(char **q); char *proverb="all that glisters is not gold."; "All that glisters is not gold." int main(void) char *p="zzz"; set_pointer(&p); printf("%s \n", p); return 0; p *q q void set_pointer(char **q) *q = proverb; All that glisters is not gold. result 7-54

포인터배열 (array of pointers) 포인터배열 (array of pointers): 포인터를모아서배열로만든것 7-55

정수형포인터배열 int a = 10, b = 20, c = 30, d = 40, e = 50; int *pa[5] = &a, &b, &c, &d, &e ; 7-56

2 차원배열에문자열을저장 char fruits[4 ][10] = "apple", "blueberry", "orange", melon" ; a p p l e \0 b l u e b e r r y \0 2 차원배열을사용하면낭비되는공간이생성되죠. o r a n g e \0 낭비되는공간! m e l o n \0 7-57

문자형포인터배열 char *fruits[ ] = "apple", "blueberry", "orange", melon" ; a p p l e \0 fruits[0] fruits[1] fruits[2] fruits[3] b l u e b e r r y \0 o r a n g e \0 m e l o n \0 7-58

예제 // 문자열배열 #include <stdio.h> 각각의문자열의길이가달라도메모리의낭비가발생하지않는다. int main(void) int i, n; char *fruits[ ] = "apple", "blueberry", "orange", "melon" ; fruits[0] fruits[1] fruits[2] fruits[3] a p p l e \0 b l u e b e o r a n g m e l o n \0 r e \0 r y \0 // 배열원소개수계산 n = sizeof(fruits)/sizeof(fruits[0]); for(i = 0; i < n; i++) printf("%s \n", fruits[i]); apple result blueberry orange melon return 0; 7-59

배열포인터 배열포인터 (a pointer to an array) 는배열을가리키는포인터 7-60

예제 #include <stdio.h> int main(void) int a[5] = 1, 2, 3, 4, 5 ; int (*pa)[5]; int i; pa = &a; for(i=0 ; i<5 ; i++) printf("%d n", (*pa)[i]); return 0; 1 2 3 4 5 result 7-61

다차원배열과포인터 2차원배열 int m[3][3] 1행->2행->3행->... 순으로메모리에저장 ( 행우선방법 ) 하나의열 m m[0][0] m[0][0] m[0][1] m[0][1] 1 행 m[0] 하나의행 m[0][2] m[0][2] m[1][0] m[1][0] m[1] m[0][0] m[0][0] m[0][1] m[0][1] m[0][2] m[0][2] m[1][1] m[1][1] 2 행 열 (column) m[1][0] m[1][0] 행m[2][0] m[2][0] (row) m[1][1] m[1][1] m[2][1] m[2][1] m[1][2] m[1][2] m[2][2] m[2][2] m[1][2] m[1][2] m[2][0] m[2][0] m[2] m[2][1] m[2][1] 3 행 7-62 m[2][2] m[2][2]

배열이름 m은 &m[0][0] m[0] 는 1행의시작주소 m[1] 은 2행의시작주소... 2 차원배열과포인터 m m[0] m[0] m[0][0] m[0][0] m[0][1] m[0][1] m[0][2] m[0][2] m[1] m[1] m[1][0] m[1][0] m[1][1] m[1][1] m[1][2] m[1][2] m[2] m[2] m[2][0] m[2][0] m[2][1] m[2][1] m[2][2] m[2][2] 7-63

2 차원배열의해석 m 은세개의원소를가지는배열이다. int m[3][3]; 해석의방향 그원소들은다시세개의원소로되어있다. 7-64

multi_array.c // 다차원배열과포인터 #include <stdio.h> int main(void) int m[3][3] = 10, 20, 30, 40, 50, 60, 70, 80, 9 0 ; printf("m = %p\n", m); printf("m[0] = %p\n", m[0]); printf("m[1] = %p\n", m[1]); printf("m[2] = %p\n", m[2]); printf("&m[0][0] = %p\n", &m[0][0]); printf("&m[1][0] = %p\n", &m[1][0]); printf("&m[2][0] = %p\n", &m[2][0]); return 0; m m[0] m[1] m[2] m = 1245020 m[0] = 1245020 m[1] = 1245032 m[2] = 1245044 &m[0][0] = 1245020 &m[1][0] = 1245032 &m[2][0] = 1245044 10 20 30 m[0][0] m[0][1] m[0][2] 40 50 60 m[1][0] m[1][1] m[1][2] 70 80 90 m[2][0] m[2][1] m[2][2] result 7-65

Multidimensional Dynamic Arrays 2-dimensional Dynamic Array of double type (1) double DA[ROWS][COLS]; ppda step-2: one-dimensional array of COLS double elements this element can be accessed as ppda[0][0] step-1: one-dimensional array of ROWS pointers to 4 rows (4 one-dimensional array) this element can be accessed as ppda[3][2] can be considered as four rows of one dimensional array: DA[i][0..4] each row is pointed by a pointer to 1-dimension array: Array of pointers to the four 1-dimension arrays of pointers double **ppda = (double **)malloc(sizeof(double *) * ROWS); To make the 2-dimensional array ppda[i] = (double *)malloc(sizeof(double) * COLS); 7-66

Multidimensional Dynamic Arrays Multi-dimensional array is "arrays of arrays" Type definitions help "see it": #define NUM_ROWS 3 #define NUM_COLS 4 int **ma; ma = (int **)malloc(sizeof(int *) * NUM_ROWS); // Creates array of three pointers // We can make each m[i] to point an dynamically allocated array of 4 integers for (int i = 0; i < NUM_ROWS; i++) ma[i] = (int *)malloc(sizeof(int) * NUM_COLS); // Results in 3 x 4 dynamic array! 7-67

2-dimensional Dynamic Array of double type (2) double **ppda = (double **)malloc (sizeof(double*) * NUM_ROW); for (int i=0; i<num_row; i++) ppda[i] = (double *) malloc (sizeof(double) * NUM_COLUMN); ppda[2][3] = 1.0; typedef double* DblPtr DblPtr *ppdb = (DblPtr *)malloc(sizeof(dblptr) * NUM_ROW); for (int i=0; i<num_row; i++) ppdb[i] = (DblPtr) malloc (sizeof (double) * NUM_COLUMN); ppdb[2][3] = 1.0; 7-68

2 차원배열과포인터연산 2 차원배열 m[][] 에서 m 에 1 을더하거나빼면어떤의미일까? 7-69

포인터를이용한배열원소방문 행의평균을구하는경우 double get_row_avg(int m[][cols], int r) int *p, *endp; double sum = 0.0; m[0][0] m[0][0] m[0][1] m[0][1 ] m[0][2] m[0][2] p = &m[r][0]; endp = &m[r][cols]; while( p < endp ) sum += *p++; 열 (column) m[1][0] m[1 ][0] 행m[2][0] m[2][0] (row) m[3][0] m[3][0] m[1][1] m[1 ][1 ] m[2][1] m[2][1 ] m[3][1] m[3][1 ] m[1][2] m[1][2] m[2][2] m[2][2] m[3][2] m[3][2] sum /= COLS; return sum; p endp endp 7-70

포인터를이용한배열원소방문 전체원소의평균을구하는경우 double get_total_avg(int m[][cols]) int *p, *endp; double sum = 0.0; m[0][0] m[0][0] m[0][1 m[0][1 ] ] m[0][2] m[0][2] p = &m[0][0]; endp = &m[rows-1][cols]; m[1][0] m[1][0] m[1][1 m[1 ][1 ] ] m[1][2] m[1][2] while( p < endp ) sum += *p++; sum /= ROWS * COLS; return sum; p m[2][0] m[2][0] m[3][0] m[3][0] m[2][1 m[2][1 ] ] m[3][1] m[3][1] 열 (column) 행(row) m[2][2] m[2][2] m[3][2] m[3][2] endp endp 7-71

const 포인터 const 를붙이는위치에따라서의미가달라진다. p 가가리키는내용이변경되지않음을나타낸다. 포인터 p 가변경되지않음을나타낸다. const char *p; char * const p; 7-72

예제 #include <stdio.h> int main(void) char s[] = "Barking dogs seldom bite."; char t[] = "A bad workman blames his tools"; const char * p=s; char * const q=s; //p[3] = 'a'; p 가가리키는곳의내용을변경할수없다. p = t; q[3] = 'a ; 하지만 p 는변경이가능하다. q 가가리키는곳의내용은변경할수있다. //q = t; 하지만 q 는변경이불가능하다. return 0; 7-73

main() 함수의인수 지금까지의 main() 함수형태 int main(void).. 외부로부터입력을받는 main() 함수형태 int main(int argc, char *argv[]).. 7-74

인수전달방법 C: \cprogram> mycopy src dst m y c c o o p y \0 \0 argv[0] s s r r c c \0 \0 argv[1] d s s t t \0 \0 3 3 argv[2] argc argv 배열 7-75

비주얼 C++ 프로그램인수입력방법 Project -> <YourProjectName> Properties -> Configuration Properties -> Debugging -> Command Arguments (Visual Studio 2015) 7-76

/* Power.cpp */ power.c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) char mode; if (argc < 4) printf("usage: >power r (or i) base exponent"); exit(-1); printf("argc: %d n", argc); for (int i = 0; i < argc; i++) printf("argv[%d] : %s n", i, argv[i]); if (*argv[1] == 'r') printf("power(base, exponent) calculation with recursive mode n"); else if (*argv[1] == 'i') printf("power(base, exponent) calculation with recursive mode n"); 7-77

main 함수로 arguments 전달프로그램실행예제 (1) 7-78

main 함수로 arguments 전달프로그램실행예제 (2) 7-79