C Language 포인터응용 Doo-ok Seo clickseo@gmail.com http://
목 차 다양한포인터 2 차원배열과포인터 동적메모리할당 main() 함수의인자활용 2
다양한포인터 다양한포인터 포인터의포인터 포인터배열 함수포인터 2차원배열과포인터 동적메모리할당 main() 함수의인자활용 3
포인터의포인터 포인터에대한포인터 다루는대상체가포인터인포인터형변수 ppi 0x0012FF70 0x0012FF70 0x0012FF64 pi 0x0012FF7C 0x0012FF7C 0x0012FF70 i 100 100 0x0012FF7C int i; int *pi; int **ppi; i = 100; pi = &i; ppi = π printf( %3d, a); printf( %3d, *pi); printf( %3d, **ppi); 4
포인터의포인터 (cont d) 프로그램예제 : 다중포인터의연산 #include <stdio.h> int main() int i; int *pi; int **ppi; i = 100; pi = &i; ppi = π printf("i : %d, pi : %p, ppi : %p \n", i, pi, ppi); printf("i+1 : %d, pi+1 : %p, ppi+1 : %p \n", i+1, pi+1, ppi+1); return 0; 5
포인터의포인터 (cont d) 프로그램예제 : 다중포인터를이용한간접접근 (1/2) #include <stdio.h> int main (void) int a; int *p; int **q; int ***r; p = &a; q = &p; r = &q; printf(" 임의의정수입력 : "); scanf ("%d", &a); printf("a : %d \n\n", a); 6
포인터의포인터 (cont d) 프로그램예제 : 다중포인터를이용한간접접근 (1/2) printf(" 임의의정수입력 : "); scanf ("%d", p); printf("a : %d, *p : %d \n\n", a, *p); printf(" 임의의정수입력 : "); scanf ("%d", *q); printf("a : %d, **q : %d \n\n", a, **q); printf(" 임의의정수입력 : "); scanf ("%d", **r); printf("a : %d, ***r : %d \n\n", a, ***r); return 0; 7
포인터배열 포인터배열 가변길이배열 (ragged array) [ 여러문자열을가리키는포인터 ] 8
프로그램예제 : 요일출력 #include <stdio.h> int main (void) char *pdays[7]; char **plast, **pwalker; 포인터배열 (cont d) pdays[0] = "Sunday"; pdays[1] = "Monday"; pdays[2] = "Tuesday"; pdays[3] = "Wednesday"; pdays[4] = "Thursday"; pdays[5] = "Friday"; pdays[6] = "Saturday"; printf("the days of the week\n"); plast = pdays + 6; for (pwalker = pdays; pwalker <= plast; pwalker++) printf( %s \n", *pwalker); return 0; 9
포인터배열 (cont d) 다음프로그램의실행결과는무엇인가? #include <stdio.h> int main(void) char char *temp[] = Clickseo", 12345", ABCDE", test"; **p = temp; printf(" [ %c ] ", *temp[3]); printf(" [ %s ] ", *temp); printf(" [ %s ]\n ", *++p); return 0; 10
함수포인터 함수포인터 함수를가리킬수있는포인터 자주사용되는함수의주소를배열에저장해두고호출하면속도가빨라진다. 잘쓰이지는않지만, 수치해석이나그래픽같은분야에서사용 11
함수포인터 (cont d) 함수포인터 (cont d) 함수이름의포인터타입을결정짓는요소 반환형 전달인자 함수포인터의선언형식 return_type (*func_pointer_var) (arg1,, argn); int (*fp) ( ); // 함수포인터변수의선언 fpt = functionname; // function_name 은함수명 fp(); // 실제로 function_name() 을호출한것과같고, (*fp)( ) 와같다. 12
프로그램예제 : 간단한함수포인터 #include <stdio.h> 함수포인터 (cont d) int ADD(int, int); // 함수의원형 int main() int (*fp)(int, int) = NULL ; int a = 10, b = 20, sum = 0; // 함수포인터의선언 fp = ADD; // add() 함수의시작주소를할당한다. sum = fp(a, b); printf("%d + %d = %d \n", a, b, sum); return 0; int ADD(int a, int b) return a + b; 13
함수포인터 (cont d) 프로그램예제 : 함수포인터배열 (1/3) #include <stdio.h> int ADD(int, int); int SUB(int, int); int MUL(int, int); int DIV(int, int); int main() int (*fp[4])(int, int); int a, b, res, num; // 함수포인터배열의선언 fp[0] = ADD; fp[1] = SUB; fp[2] = MUL; fp[3] = DIV; // ADD() 함수의시작주소저장 // SUB() 함수의시작주소저장 // MUL() 함수의시작주소저장 // DIV() 함수의시작주소저장 14
함수포인터 (cont d) 프로그램예제 : 함수포인터배열 (2/3) while(1) printf("1. 뎃셈, 2. 뺄셈, 3. 곱셈, 4. 나눗셈, 5. 종료 : "); scanf("%d%*c", &num); if (num == 5) break; printf("\n 두정수를입력하시오 : "); scanf("%d %d", &a, &b); res = fp[num - 1](a, b); // 함수포인터배열을이용한함수호출 printf("\n 결과 : %d \n\n", res); return 0; 15
함수포인터 (cont d) 프로그램예제 : 함수포인터배열 (3/3) int ADD(int a, int b) return a + b; int SUB(int a, int b) return a - b; int MUL(int a, int b) return a * b; int DIV(int a, int b) return a / b; 16
다양한포인터 2 차원배열과포인터 2차원배열과포인터 2 차원배열의개념 2 차원배열과포인터 2 차원배열과함수 동적메모리할당 main() 함수의인자활용 17
2 차원배열의개념 2차원배열의개념 행과열로구성된테이블의형태 [0] First dimension (rows) [1] [2] [3] [0] [1] [2] [3] Second dimension (columns) 18
2차원배열의개념 (cont d) 2 차원배열의개념 (cont d) table table[0] table[0][0] table[0][1] table[0][2] table[0][3] table[0] table[1] table[1][0] table[1][1] table[1][2] table[1][3] table[1] 1 차원배열의배열 table[2] table[3] table[2][0] table[2][1] table[2][2] table[2][3] table[2] table[3][0] table[3][1] table[3][2] table[3][3] table[3] table 19
2차원배열의개념 (cont d) 2 차원배열의선언과정의 선언과정의는컴파일러에게배열의이름, 각원소의형식, 각차원의크기를알려준다. int table[2][3]; // 2 차원배열의선언 첫번째차원은배열의행 (row) 수를나타낸다. 두번째차원은각행의열 (column) 을나타낸다. int a[2][3]; 행 열 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 0 행 ( 첫번째 1 차원배열 ) 1 행 ( 두번째 1 차원배열 ) 20
2차원배열의개념 (cont d) 2 차원배열의선언과정의 (cont d) 2 차원배열의물리적구조 4 byte 배열크기 = 요소개수 * 데이터형크기 12 bytes = 2 * 3 * sizeof (int) 1000 1004 1008 1012 1016 1020 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] int a[2][3]; a[0] (0 번행 ) a[1] (1 번행 ) 요소개수 1 차원배열의수 요소개수가 3 개인 1 차원배열 2 개 21
2차원배열의개념 (cont d) 2 차원배열의초기화 2 차원배열의선언과초기화 10 20 30 40 50 60 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] int a[2][3] = 10, 20, 30, 40, 50, 60 ; 0 행 1 행 같은표현 를사용하여행단위로묶어서초기화한다 int a[2][3] = 10, 20, 30, 40, 50, 60 ; 사실상 2 차원배열은 1 차원배열의연속이므로위와같이초기치값을콤마 (,) 에의해순서대로나열하기만해도된다. 22
2차원배열의개념 (cont d) 2 차원배열의초기화 (cont d) 초기화 1차원배열의초기화조건을따르지만행과열개수와초기화값의개수가일치하지않으면논리적에러를유발할수있으므로주의해야한다. int a[2][3] = 10, 20, 30, 40 ; int a[2][3] = 10, 20, 30, 40 ; 10 20 0 30 40 0 10 20 30 40 0 0 0 으로자동초기화되는위치가다르다!!! 23
2차원배열의개념 (cont d) 2 차원배열의초기화 (cont d) int table[5][4] = 0,1,2,3,10,11,12,13,20,21,23,30,31,32,33,40,41,42,43; int table[5][4] = ; 0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43, 권장!!! 24
2차원배열의개념 (cont d) 2 차원배열의초기화 (cont d) int table[ ][4] = ; 0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43, 2 차원배열의행의개수인맨앞의첨자는생략가능 int table[5][4] = 0; // 모든배열의값을 0 으로초기화 25
2차원배열의개념 (cont d) 프로그램예제 : 2 차원배열의순차표현에서논리적순서와물리적순서 #include <stdio.h> int main() int i, j; int table[2][4] = 165, 188, 145, 130, 159, 219, 255, 315; printf(" &table : %p table = %p \n", &table, table); for(i=0; i<2; i++) for(j=0; j<4; j++) printf("\n &table[%d][%d]:%p table[%d][%d] = %d", i, j, &table[i][j], i, j, table[i][j]); printf("\n"); return 0; 26
2차원배열의개념 (cont d) 프로그램예제 : 2 차원배열의선언및초기화 #include <stdio.h> int main(void) int table[][4] = 50, 80, 0, 2,, 121, 0, 0, 1, 2; int i, j, size; size = sizeof(table) / sizeof(int) / 4; for(i=0; i<size; i++) for(j=0; j<4; j++) printf("table[%d][%d] = %d \n", i, j, table[i][j] ); printf("\n"); return 0; 27
2차원배열의개념 (cont d) 프로그램예제 : 3 4 배열에정수값을입력하고출력 #include <stdio.h> #define ROW 3 #define COL 4 void main(void) int i, j, array[row][col]; printf("\n ### 배열원소입력 ### \n\n"); for(i = 0; i < ROW; i++) printf("%3d 행 : ", i); for(j = 0; j < COL; j++) scanf("%d", &array[i][j] ); printf("\n\n ### 배열원소출력 ### \n\n"); for(i = 0; i < ROW; i++) for(j = 0; j < COL; j++) printf("%5d", array[i][j] ); printf("\n"); printf("\n"); 28
2 차원포인터 2차원배열과포인터 table table[0][0] table[0][1] table[0][2] table[0][3] table[0] 또는 *(table + 0) table + 1 table[1][0] table[1][1] table[1][2] table[1][3] table[1] 또는 *(table + 1) table + 2 table[2][0] table[2][1] table[2][2] table[2][3] for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) printf( %6d, *(*(table + i) + j) ); printf( n ); table[2] 또는 *(table + 2) table[3][4] 29
2차원배열과포인터 (cont d) 배열포인터정의 int *p; // 1 차원배열포인터 int (*p2)[3]; // 2 차원배열포인터 int (*p3)[2][3] // 3 차원배열포인터... p p2 p3???... 0x8047c20 0x8047c24 0x8047c28 [ 2 차원포인터변수메모리할당 ] 30
2차원배열과포인터 (cont d) 2 차원배열포인터 int table[2][3]; int (*p)[3]; // 2 차원배열포인터변수 p = table; p 0x8047c00 0x8047c24 table[0][0] table[0][1] table[0][2] table[1][0] table[1][1] table[1][2]...?????? 0x8047c00 0x8047c04 0x8047c08 0x8047c0c 0x8047c10 0x8047c14... 31
2차원배열과포인터 (cont d) 2 차원배열포인터 (cont d) #include <stdio.h> #include <stdio.h> void main() void main() int array[2]; int table[2][3]; int *p; int (*p2)[3]; p = array; p2 = table; printf( %d n, sizeof(array)); printf( %d n, sizeof(table)); printf( %d n, sizeof(p)); printf( %d n, sizeof(p2)); printf( %d n, sizeof(*p)); printf( %d n, sizeof(*p2)); sizeof(*p) 는 p 가가리키는대상의크기 32
2차원배열과포인터 (cont d) 2 차원배열포인터 (cont d) #include <stdio.h> void main() table *table **table int table[3][2] = 3,5,12,54,534,923; int (*p)[2]; p = table; p = table[0]; p = &table[0][0]; table == table[0] == &table[0][0]??? 33
2차원배열과포인터 (cont d) 2 차원배열포인터 (cont d) #include <stdio.h> void main() int table[3][2] = 3,5,12,54,534,923; int (*p)[2]; 1) p 2) *p = *(p + 0) 3) p + 1 4) *(p + i) + j 5) *(*(p + i) + j) 6) **p p = table; printf( %d n, *( *(p + 0) + 0)); // 3 printf( %d n, *( *(p + 0) + 1)); // 5 printf( %d n, *( *(p + 1) + 0)); // 12 printf( %d n, *( *(p + 1) + 1)); // 54 printf( %d n, *( *(p + 2) + 0)); // 534 printf( %d n, *( *(p + 2) + 1)); // 923 p[0] p[1] p[2] 34
2차원배열과포인터 (cont d) 2 차원배열포인터 (cont d) #include <stdio.h> void main() int table[3][2] = 3,5,12,54,534,923; int (*p)[2]; p = table; p[i][j] == *(*(p + i) + j) // for 문을이용하면좀더간략하게출력할수있다. for (i = 0; i < 3; i++) // 행의길이를표시 for (j = 0; j < 2; j++) // 열의길이를표시 printf( %d n, *(p[i] + j)); 35
2차원배열과포인터 (cont d) int (*p)[2], int *temp[2] 의차이 int table[3][2] = 3, 5, 12, 54, 534, 923 int (*p)[2]; int *temp[2]; (*p)[2] 2차원배열을가리킬수있는 2차원배열포인터변수 *temp[2] 주소를저장할수있는두개의공간 table[0][0] table[0][1] table[0][2] table[1][0] table[1][1] table[1][2] p temp[0] temp[1]... 3 5 12 54 534 923...?...??... 36
2차원배열과포인터 (cont d) int (*imsip)[2], int *temp[2] 의차이 (cont d) #include <stdio.h> void main() int table[3][2] = 3,5,12,54,534,923; int (*p)[2]; int *temp[3]; p = table; p = &table[0][0]; // 거짓 temp[0] = table; // 거짓 temp[0] = table[0]; temp[1] = table[1]; temp[2] = table[2]; temp[0] = *(table + 0); temp[1] = *(table + 1); temp[2] = *(table + 2); *temp = table[0]; *(temp + 0) = table[0]; *(temp + 1) = table[1]; *(temp + 2) = table[2]; *temp = *table; *(temp + 0) = *(table + 0); *(temp + 1) = *(table + 1); *(temp + 2) = *(table + 2); 37
2 차원배열을함수에전달 1. 각각의원소들을전달한다. 2. 배열의한행을전달한다. 2차원배열과함수 배열이름을한행번호로만색인함으로써한행전체를전달한다. 3. 전체배열을전달한다. 배열이름을실인수 (actual parameter) 로사용한다. 행의수를정의할필요가없다는사실을주의하라. 하지만, 두번째차원의크기는반드시정의되어야한다. void PRINT (int table[ ][COL]) void PRINT (int (*table)[col]) 38
2차원배열과함수 (cont d) 한행씩전달 table[row] void PRINT (int x[]) int i; 0 1 2 10 11 12 20 21 22 30 31 32 40 41 42 table x for (i = 0; i < COL; i++) printf( %3d, x[i] ); printf( \n ); return; 3 13 23 33 43 #include <stdio.h> #define ROW 5 #define COL 4 void PRINT (int x[]); int main(void) int row; int table[row][col] = 00, 01, 02, 03, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43 ; for (row = 0; row < ROW; row++) PRINT (table[row]); return 0; 39
2차원배열과함수 (cont d) 전체배열전달 table void PRINT (int x[][col]) int i, j; 0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43 table x for (i = 0; i < ROW; i++) for (j = 0; j < COL; j++) printf( %3d, x[i][j]); printf( \n ); return; #include <stdio.h> #define ROW 5 #define COL 4 void PRINT (int [][COL]); int main(void) int table[row][col] = 00, 01, 02, 03, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43 ; PRINT(table); return 0; 40
다양한포인터 2 차원배열과포인터 동적메모리할당 메모리할당 : malloc 인접메모리할당 : calloc 메모리재할당 : realloc 메모리해제 : free main() 함수의인자활용 동적메모리할당 41
동적메모리할당 메모리할당 정적메모리할당 메모리선언과정의가프로그램소스에서전부정의되며, 할당된바이트수는실행시간에변할수없다. 동적메모리할당 프로그램이실행되는동안미리정의된동적메모리할당함수를사용하여데이터를위한메모리를할당하고해제할수있다. 42
메모리사용 동적메모리할당 (cont d) 동적메모리관리에쓰이는 4 가지함수 표준라이브러리헤더파일 <stdlib.h> 에서찾을수있다. 메모리할당 : malloc, calloc, realloc 메모리해제 : free Memory Management malloc calloc realloc free 43
동적메모리할당 (cont d) 개념적인관념에서의메모리 프로그램메모리 main() 함수및기타다른기능을담당하는함수들을저장한다. 데이터메모리 전역데이터같은영구적인정의와상수, 지역데이터정의, 동적메모리데이터로구성된다. main() 은항상메모리내에존재한다. main() 이외에각호출된함수들은그함수들이활성화될때만메모리내에존재해야한다. 실질적으로대부분의시스템은프로그램이실행되는동안에는메모리내에모든함수를유지한다. 하나의함수가여러번동시에활성화될수있다.» 비록함수는하나일지라도각각의지역변수복사본을할당받는다. 힙 (heap) 은메모리할당함수에의해서메모리할당이요구될때요구된메모리를배정하기위한사용되는공간이다. 44
동적메모리할당 (cont d) 메모리할당 : malloc malloc() 함수는매개변수로필요한메모리의바이트의수를가지며, 그바이트수를수용할수있는크기의메모리블록을할당한다. 할당된메모리의첫번째바이트를 void 포인터로되돌린다. 할당된메모리는초기화되어있지않다 ( 쓰레기값 ). void * malloc(size_t size); int *p; p = (int *) malloc(sizeof (int)); p = (int *) malloc(sizeof (int) ) if (p == NULL) printf( 메모리할당실패!!! n ); exit(100); p 4 bytes 45
동적메모리할당 (cont d) 인접메모리할당 : calloc 일반적으로배열을위한메모리할당에쓰인다. calloc() 은특정크기요소들의배열을담을수있을만큼크고, 연속적인메모리블록을할당한다. calloc() 은할당된배열의첫번째요소를가리키는포인터를반환한다. calloc() 은메모리를초기화한다 ( 즉, 할당된메모리의각요소값을 0 으로설정한다 ). void * calloc(size_t element-count, size_t element-size); p = (int *) calloc(200, sizeof (int) ) if (p == NULL) printf( 메모리할당실패!!! n ); exit(100); p... 800 bytes 46
동적메모리할당 (cont d) 메모리재할당 : realloc 메모리재할당에쓰인다. 이전에할당된메모리블록에대한포인터가있다면, realloc() 은이블록끝부분의메모리를제거하거나확장함으로써블록의크기를변화시킨다. 만약다른할당블록때문에메모리가확장될수없다면 realloc() 은이미할당된메모리를새로할당된메모리블록에복사하고, 이전에할당된메모리를삭제한다. void * realloc(void *p, size_t new_size); p 18 55 33 12 64 1 90 31 5 77 10 integers p p = (int *)realloc(p, 15 * sizeof(int)); 18 55 33 12 64 1 90 31 5 77????? 15 integers 47
동적메모리할당 (cont d) 메모리해제 : free malloc, calloc, realloc에의해할당된메모리가더이상필요없을때는 free 함수를사용하여해제한다. calloc() 함수에의해할당된메모리배열을해제하기위해서는오직한번만첫번째포인터를사용하여해제해야한다. ( 각요소를개별적으로해제하려고하는것은오류이다.) 메모리를해제하는것은포인터내의값을바꾸는것은아니다. 메모리해제된후에도포인터는여전히힙에속한주소를가리키고있다. 메모리를해제한후에즉시그포인터에 NULL을대입하여이포인터가사용되고있지않음을표시해놓는다. 프로그램의종료시에는메모리를반드시지울필요는없다. 이때는운영체제가모든메모리를해제한다. 48
동적메모리할당 (cont d) 메모리해제 : free (cont d) free() 함수호출전... free() 함수호출후... p p 4 bytes free (p) ; 4 bytes p... 800 bytes p... 800 bytes free (p) ; 49
프로그램예제 : 동적메모리할당 -- malloc 와 free 함수 #include <stdio.h> #include <stdlib.h> 동적메모리할당 (cont d) int main (void) // char name[10]; char *name = NULL; name = (char *)malloc(10); if(name == NULL) printf(" 메모리할당실패!!! \n"); exit(100); printf(" 이름입력 : "); gets(name); printf("\n 당신의이름은 \" %s \" 입니다. \" \n", name); free(name); return 0; 50
프로그램예제 : 1 차원동적배열 -- calloc 함수 (1/2) #include <stdio.h> #include <stdlib.h> 동적메모리할당 (cont d) #define SIZE 10 int main (void) int i, *array = NULL; // int array[size]; // (int *)malloc(size * sizeof(int)); array = (int *)calloc(size, sizeof(int)); if(array == NULL) puts(" 메모리할당에실패!!! "); exit(100); 51
동적메모리할당 (cont d) 프로그램예제 : 1 차원동적배열 -- calloc 함수 (2/2) // 1차원동적배열에데이터 ( 정수 ) 입력... printf("%d 개의정수를입력하시오... \n\n", SIZE); for(i = 0; i < SIZE; i++) scanf("%d", array + i ); // 1차원동적배열데이터 ( 정수 ) 출력.. printf("\n ### 입력된배열원소 ### \n"); for(i = 0; i < SIZE; i++) printf("%3d", *(array + i) ); printf("\n"); free(array); return 0; 52
프로그램예제 : 2 차원동적배열 -- calloc 함수 (1/2) #include <stdio.h> #include <stdlib.h> 동적메모리할당 (cont d) #define ROW 5 #define COL 3 int main() int **table = NULL; // int table[row][col]; int i, j; // 2차원동적배열메모리할당!!! table = (int **)calloc(row, sizeof(int)); for(i = 0; i < ROW; i++) table[i] = (int *)calloc(col, sizeof(int)); 53
동적메모리할당 (cont d) 프로그램예제 : 2 차원동적배열 -- calloc 함수 (2/2) // 2차원동적배열출력 for(i=0; i<row; i++) for(j=0; j<col; j++) printf("%3d", table[i][j] + i ); printf("\n"); // 2차원동적배열메모리해제!!! for(i = 0; i < ROW; i++) free(table[i]); free(table); return 0; 54
ragged 배열 울퉁불퉁한, 멋대로자란배열 ragged 배열 2 차원배열에서각행의오른쪽부분의요소가비어있는배열 많은메모리낭비 32 18 12 24 16 11 16 12 42 19 22 13 13 14 11 18 55
ragged 배열 (cont d) ragged 배열 (cont d) table = (int **)calloc(rownum + 1, sizeof(int *)); table[0] = (int *)calloc(4, sizeof(int)); table[1] = (int *)calloc(7, sizeof(int)); table[2] = (int *)calloc(1, sizeof(int)); table[3] = (int *)calloc(3, sizeof(int)); table[4] = (int *)calloc(2, sizeof(int)); table[5] = NULL; 56
main() 함수의인자활용 다양한포인터 2 차원배열과포인터 동적메모리할당 main() 함수의인자활용 57
명령행인자 main() 함수의인자활용 int main(int argc, char *argv[], char **env) int main(int argc, char **argv, char **env) argc : 명령행인자의개수 **argv : 명령행인자가있는메모리주소를담은목록 **env : 현재시스템에설정되어있는환경을출력해준다. 58
main() 함수의인자활용 (cont d) 명령행인자 (cont d) 예를들어, 다음과같은프로그램이실행된다고하자. C: > mycopy a.txt b.txt 명령행인자의출력 for (i=0; i<argc; i++) printf( %s n, argv[i]); argc 3 3000 b. t x t \0 argv[2] argv[1] argv[0] 3000 2000 1000 2000 1000 a. t x t \0 m y c o p y \0 59
main() 함수의인자활용 (cont d) 명령행인자 (cont d) argv[n][n] 의의미 1000 Null 문자포함 7byte 문자열 argv[0] 1000 m y c o p y \0 argv[0][0] argv[0][1] argv[0][6] argv[n] : 명령행인자의문자열 argv[n][n] : argv[n] 인자의 n 번째문자상수 60
main() 함수의인자활용 (cont d) 명령행인자 (cont d) **env : 현재시스템에설정되어있는환경출력 #include <stdio.h> void main(int argc, char **argv, char **env) for( ; *env; env++) puts(*env); *envp[] envp envp[0] 1000 1000 PWD=/home/clickseo envp[1]... 2000... 2000 SHELL=/bin/bash envp[n-1] 9000 NULL 9000 USER=clickseo 61
main() 함수의인자활용 (cont d) 프로그램예제 : 명령행인자를이용한간단한산술계산기 (1/2) #include <stdio.h> #include <stdlib.h> // atoi() 의사용을위해포함 int main(int argc, char *argv[]) // 명령행인자를받아들인다 int v1, v2, ans; char op; // 파일명포함인자의개수는적어도 4개이상이어야한다. if (argc < 4) printf(" 프로그램사용법 : cal 2 + 3 \n"); exit(1); 62
main() 함수의인자활용 (cont d) 프로그램예제 : 명령행인자를이용한간단한산술계산기 (2/2) v1 = atoi(argv[1]); v2 = atoi(argv[3]); op = argv[2][0]; // 문자열을정수로변환해서기억 // 널문자를제외하고연산자만추출 switch (op) case '+': ans = v1 + v2; break; case '-': ans = v1 - v2; break; case '*': ans = v1 * v2; break; case '/': ans = v1 / v2; break; case '%': ans = v1 % v2; break; printf("%d\n", ans); // 결과출력 return 0; 63
참고문헌 [1] 김일광, C 프로그래밍입문, 한빛미디어, pp. 203 223. 270-282. [2] 윤성우, 열혈강의 C 프로그래밍, 프리렉, pp. 421 480. [3] 김진외 7 인공역, 구조적프로그래밍기법을위한 C, 인터비젼, pp. 616 694. [4] 정재은, 다시체계적으로배우는 C 언어포인터, 정보문화사, pp. 92 116. 224-228. [5] Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language 2/e, 대영사, 125 169. 64