1. main 함수의 새로운 유형
지금까지는 main 함수의 매개변수 형을 void로 선언하였다. 그러나 프로그램 실행 시 인자를
전달받을 수 있는 형태로 main 함수를 선언할 수 있으며, 실제로 인자를 전달하는 것도 가능하다.
main함수의 매개변수에 char * argv[ ]가 선언되었는데 먼저 이를 알아보자
1 2 3 4 5 6 | int main(int argc, char * argv[]) { .... return 0; } | cs |
2. char * argv[ ] 선언에 대한 복습
위와 같은 main 함수의 유형을 이해하기 위해서는
char * argv[ ] 선언이 의미하는 바를 이해해야한다.
char * argv[ ] 대해서는 이미 살펴보았다. 아래 링크를 참고하자.
https://cg-developer.tistory.com/207?category=765535
그리고 예제를 추가적으로 더 봐보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> void ShowString(char * argv[], int strNum); int main(void) { char* strPtrAry[3]={ "AAA", "BBB", "CCC" }; char** strPtr=strPtrAry; ShowString(strPtr, 3); return 0; } void ShowString(char * argv[], int strNum) { int i; for(i=0; i<strNum; i++) printf("%s \n", argv[i]); } | cs |
1 2 3 | AAA BBB CCC | cs |
- 18행 : 1차원 char형 포인터 배열의 주소 값이 첫 번째 인자로 전달됨을 매개변수의 선언을 통해 알 수 있다.
- 13행 : strPtr이 char형 이중 포인터로 선언되었다. 그렇다면 7행에 선언된 배열의 이름
strPtrAry는 char형 포인터의 주소 값을 담고 있다는 뜻이 된다.
- 7행과, 13행의 메모리 구조는 다음과 같다
배열 이름 strPtrAry에는 배열의 첫 번째 요소의 주소 값이 담겨 있으므로, 결국은 char형 포인터를
가리키고 있는 셈이다. 따라서 위 예제 13행에서 보여주듯이, strPtrAry에 담겨 있는 값의 저장을 위
해서는 char형 이중 포인터를 선언해야 한다.
3. main 함수로의 문자열 전달
main 함수가 다음과 같은 형태로 선언되면, main 함수로 문자열을 전달할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> int main(int argc, char * argv[]) { int idx=0; /* argc에 저장된 값 조회 */ printf("argc: %d \n", argc); /* argv가 참조하는 문자열들 출력 */ while(argv[idx] != NULL) { printf("argv[%d]: %s \n", idx, argv[idx]); idx++; } return 0; } | cs |
main 함수의 첫 번째 전달인자로는 입력된 문자열의 개수 정보가(문자열은 공백을 기준으로 구분
이 된다), 두 번째 전달인자로는 문자열의 주소 정보를 담고 있는 char형 포인터 배열의 주소 값이
전달된다. 나는 Dev C++ 상에서 main 함수에 전달할 문자열을 구성하였는데,
메뉴에서 “실행一매개변수들”을 선택하면 문자열을 입력할 수 있는 창이 뜬다.
실행파일의 이름은 첫 번째 문자열로 자동 입력이 되고, 나머지 문자열은 공백을 기준으로 구분해
서 입력하면 된다.
다음과 같이 입력하였다.
아래는 출력.
1 2 3 4 5 | argc: 4 argv[0]: 26-7.exe argv[1]: AAA argv[2]: BBB argv[3]: CCC | cs |
아래는 전달된 문자열 배열의 구성과 인자의 전달 과정을 보여준다.
'BackEnd > C' 카테고리의 다른 글
버블 정렬 (Bubble Sort)의 이해와 함수 포인터 기반의 함수 정의 (0) | 2019.03.18 |
---|---|
함수 포인터(Function Pointer) (0) | 2019.03.18 |
메모리 컨트롤 함수 (0) | 2019.03.16 |
volatile 과 restict (0) | 2019.03.15 |
포인터의 const 선언 (0) | 2019.03.14 |