일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 명령어
- 코로나바이러스
- 동시접속
- 다음메일
- JMeter
- 리눅스
- 韓国
- 5G
- 일본대학원
- 스마트시티
- 4차산업
- 200-301
- gbd-200
- 환경정보
- 성능측정
- ios
- ads.txt
- 사용자100명
- certification
- DevNet
- 부자아빠가난한아빠
- 일본유학
- 사양
- QA
- 정보처리기사
- 스펙정보
- 한국판뉴딜
- 사양정보
- 韓国ヒップホップ
- move앱
- Today
- Total
IT 컴퓨터공학 자료실
중급편 4. 더블 포인터 ** argv 사용 본문
포인터 토대가 된 책
더블 포인터 ** argv 사용
이러한 다중 배열을 사용한기구는 C 언어 프로그램에서 많이 사용된다. 대표적인 사례가 명령 줄 인수를 취득하기위한 argc, argv기구이다. 프로그램을 실행할 때,
% ls -l -F -a / usr / usr / lib
같이 명령 줄에서 시작한다. 이때 ls 프로그램으로 명령 줄에서 지정된 인수를 프로그램 내부에 들어갈 필요가있다. 이를위한기구로서 argc, argv기구가 준비되어있다.
전형적인 C 언어의 main 함수의 정의는 다음이다.
int main (int argc, char ** argv) { }
이때 main 함수의 2 개의 인수를 argc, argv라는 이름으로 부르는 것이 상식으로되어있다. (argc = argment count, argv = argment variable)
이기구는 다차원 배열의 응용이다. 즉, argv는 문자열의 시작 주소를 나타내는 10 개의 char *의 배열을 가리키는 포인터이다. 그리고 첫 번째 문자열의 시작 주소를 나타내는 argv [0]은 첫 번째 문자열에 대한 포인터이고, * argv [0]은 첫 번째 문자열의 첫 번째 문자를 나타낸다. 는 것은 ** argv도 첫 번째 문자열의 첫 번째 문자를 나타내고있는 것이다.
그리고 명령 줄 인수의 수가 5 개의 경우는 argv [5] == NULL이되고, 명령 라인 인수의 끝을 나타낸다. 즉, 명령 라인 인수의 개수의 끝을 나타 내기 위해 NULL 포인터가 사용되고있다.
그래서 전형적인 명령 줄 인수 처리는 다음과 같다. argv [0]은 명령어 자체 ( "ls")이 들어있어 통상의 처리에 관심이없는 것에주의.
int main (int argc, char ** argv) { while (* + argv! = NULL) { if (** argv == '-') { switch (* (* argv + 1)) { case 'l': / * -l 옵션 처리 * / ......... } } else { break; } } while (* argv! = NULL) { 현재 * argv는 처리 대상이되는 파일 이름을 표시 있다. 그들이 차례로 처리되어 간다. argv ++; } }
첫 번째 while 루프에서 먼저 포인터를 증가하고 처리하고 있으며, 후 while 루프에서 처리하고 증가하고있다. 이것은 제 0 인수는 명령 이름이며,이 경우는 관심이 없기 때문에 argv [0]의 처리를 날려 때문이다. 그러나 argv [4]이 옵션 문자열이 아닌 (`- '로 시작하지 않는) 때로는 break 문으로 첫 번째 루프를 빠져 두 번째 while 루프에 들어간다. 옵션 문자열이 아니라는 것은 그것이 처리해야 할 파일 이름 인 것이기 때문에 이때에는 미리 포인터를 증가하면 그 파일 이름 처리가 날아가 버리는. 그래서, 처리가 끝난 후 argv를 증가한다.
그리고 다소 이해하기 어려운 것은 switch (* (* argv + 1))이다. 이것은 냉정하게 생각하면 좋을 것이다.
- argv는 현재 처리해야 할 문자열에 대한 포인터이다.
- * argv는 현재 처리해야 할 문자열 (포인터)이다.
- ** argv는 현재 처리해야 할 문자열의 첫 글자이다.
- * argv + 1은 현재 처리해야 할 문자열의 2 자 눈에 대한 포인터이다. & argv [0] [1]과 같다.
- 그래서 현재 처리해야 할 문자열의 2 자 눈은 * (* argv + 1)이다.
이런 생각을 가면 argv만을 취급도 제대로 처리하고 갈 수있다. argc는 사용해도 사용하지 않아도 좋지만, 일반적으로 사용하는 경우가 많다.
이처럼 더블 포인터를 사용한 문자열 배열 처리는 C 언어에서 자주 나타나기 때문에, 부디이 기회가되면하는 것이 바람직하다.
과제
- 적당한 명령의 인수 작업을 생각하고, 실제로 argc, argv를 사용하여 처리를 해 보는 것. 처리가 될 때까지 반복해야한다.
'컴퓨터공학 > 포인터' 카테고리의 다른 글
중급편 6. 함수 포인터의 사용법 (0) | 2015.06.30 |
---|---|
중급편 5. malloc () 된 포인터 사용 (0) | 2015.06.30 |
중급편 3. 다차원 배열의 실현 (0) | 2015.06.30 |
중급편 2. extern 선언의 함정 - 배열과 포인터의 차이점 (0) | 2015.06.30 |
중급편 1. 초기화 문자열, 2개의 정의 (0) | 2015.06.30 |