먼저, 다음과 같은 사실을 인식할 수 있어야 한다.
- char ** arr과 같은 char arr[] 은 char 형 더블 포인터이다.
void SimpleFunc(char **arr) { ... }
void SimpleFunc(char * arr[]) { . . . }
- 인자로써 1차원배열의 이름이 전달되고, 그 인자는 캐릭터터형 포인터 변수로 이루어진 배열이다.
매개변수 선언에서는 int *arr 은 inr arr[] 이렇게 표현될 수 있었다는 것을 기억하자. 그 이유는 배열의 이름이 인자로 전달 된다는 것을 강하게 어필하기 위해서 이다.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void ShowAllString(int argc, char * argv[])
{
int i;
for (i = 0; i < argc; i++) {
printf("%s \n", argv[i]);
}
}
int main()
{
// 포인터형 char** + 인자는 1차원 배열의 이름
char * str[3] = {
"C programming",
// 실제 전달되는 주소값은 0번 인덱스('C')의 주소값
"C++ programming",
"Java programming"
};
ShowAllString(3, str);
// (문자열의 수, 문자열을 담고 있는 배열의 주소값)
return 0;
}
c:\> ArgcArgv I like you
문자열 1 "ArgcArgv"
문자열 2 "I"
문자열 3 "like"
문자열 4 "you"
strArr[0] = ArgcArgv\0
strArr[1] = I\0
strArr[2] = like\0
strArr[3] = you\0
strArr[4] = NULL
널문자(\0) 는 문자열의 끝을 의미한다.
그리고 맨 마지막 배열은 NULL 문자를 저장해준다.
프로그램은 NULL문자의 위치에 따라서 문자열이 끝난다는 것은 인식한다.
main(4, strArr[5]);
매개변수 int argc 를 참조해서 문자열의 길이를,
char * argv[]를 통해서 문자열 배열에 접근을 할 수 있다.
다음 소스를 이해하며 읽어보자.
int main(int argc, char *argv[])
{
int i = 0;
printf("전달된 문자열의 수: %d \n", argc);
while(argv[i]!=null)
{
printf("%d번째 문자열 : %s \n", i+1, argv[i]);
i++
}
return 0 ;
}
C : \> ArgvEndNULL "I love you"
전달된 문자열의 수: 2
1번째 문자열: ArgvEndNULL
2번째 문자열: I love you
//"" 사이의 문자열만을 문자열로 취급한다.