본문 바로가기

Windows Developer/C

[C] main(int argc, char *argv[])에서 포인터를 쓰는 이유?


main(int argc, char *argv[])는 프로그램하면서 많이 쓰는 부분입니다.
argc는 파라미터 입력의 개수를 나타냅니다. 예를 들어 프로그램이

test_run이라고 가정하면
test_run하면 argc는 1이되고 test_run abc하면 argc는 2가 됩니다.
즉 파라미터 개수 +1이 됩니다.
이유는 파라미터를 입력하지 않더라도 자동적으로 하나의 파라미터가 들어가게 되어 있습니다.

char *argv[]는 1차원 포인터 배열 입니다.
포인터는 일반적으로 할당된 메모리 영역에 대해서 주소를 확보하기 위해서 사용욉니다.
 
예를 들어보겠습니다.

char a[] = "123";
char *p = a;

printf("%s\n", a);
printf("%s\n", p);

위에서 보면 printf의 결과는 동일 합니다.
이유는 *p가 할당된 메모리 a의 주소를 가지고 있기 때문입니다.
이런 식으로 포인터가 사용될 수도 있습니다.

그럼 다음의 예를 보겠습니다.

char *a;
a = (char*)malloc(1024);
위에서 char *a는 실제로 할당된 메모리 영역이 없습니다.
하지만 malloc에서 메모리는 1024 byte만큼 확보하게 됩니다.
이렇게 사용하는 이유는 프로그램이 실행되는 도중에 어떤 입력이 있을 경우에 그 입력이 정확히 몇 byte인지 모를 경우 동적으로 할당하기 위해서 사용하는 경우 입니다.

그럼 다음과 비교해 봅시다.

char a[10];

위의 예는 메모리는 10byte를 실행 할때 미리 확보하게 됩ㄴ다.
그러나 a에는 10byte 이상의 문자를 넣을 수 없습니다.

하지만

char *a;

a = (char*)malloc(크기);
와 같이 사용하면 그때 크기에 맞게 할당해서 사용 할 수 있습니다.

*argv[]는 이중포인터라고 생각하셔도 됩니다.
[]는 일반적으로 값이 자동으로 할달될 때 사용됩니다.

char a[] = "12345";
위와 같이 하면 뒤에 입력 크기에 맞게 자동으로 메모리를 할당하게 됩니다.

char a[6] = "12345";
와 똑같은 효과를 보게 됩니다. 끝에 NULL("\0")값이 들어가므로 6이 됩니다.

위에서 보는 바와 같이 하나의 문자열("ab2"와 같은)을 처리하는데는 1 포인터가 필요합니다(1차원 배열)

그러나 입력이 여러개 있을 경우(예 :abc 123b aaaa...)에는 문자열들이 여러개 있으므로 2 포인터가 필요합니다(2차원 배열)

'Windows Developer > C' 카테고리의 다른 글

[C] 재귀함수  (0) 2010.07.20
[C] 동적 메모리  (0) 2010.07.20
[C] call by value와 call by reference  (0) 2010.07.17
[C]포인터의 장점  (0) 2010.07.17