관리 메뉴

IT 컴퓨터공학 자료실

중급편 4. 더블 포인터 ** argv 사용 본문

컴퓨터공학/포인터

중급편 4. 더블 포인터 ** argv 사용

윤맨1 2015. 6. 30. 11:18

                                         포인터 토대가 된 책

                                      더블 포인터 ** 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))이다. 이것은 냉정하게 생각하면 좋을 것이다.

  1. argv는 현재 처리해야 할 문자열에 대한 포인터이다.
  2. * argv는 현재 처리해야 할 문자열 (포인터)이다.
  3. ** argv는 현재 처리해야 할 문자열의 첫 글자이다.
  4. * argv + 1은 현재 처리해야 할 문자열의 2 자 눈에 대한 포인터이다. & argv [0] [1]과 같다.
  5. 그래서 현재 처리해야 할 문자열의 2 자 눈은 * (* argv + 1)이다.

이런 생각을 가면 argv만을 취급도 제대로 처리하고 갈 수있다. argc는 사용해도 사용하지 않아도 좋지만, 일반적으로 사용하는 경우가 많다.

이처럼 더블 포인터를 사용한 문자열 배열 처리는 C 언어에서 자주 나타나기 때문에, 부디이 기회가되면하는 것이 바람직하다.

과제

  1. 적당한 명령의 인수 작업을 생각하고, 실제로 argc, argv를 사용하여 처리를 해 보는 것. 처리가 될 때까지 반복해야한다.