본문 바로가기
SW사관학교 정글/C언어와 친구들

[C언어와 친구들] int argc와 char *argv[]란?

by 대범하게 2022. 11. 9.
반응형

WEEK07에서 tiny server가 실행되는 main 함수가 int main(int argc, char **argv){} 다음과 같이 구성되어있었다.

정확히 argc와 argv가 어떤 인자인지 알기 위해 쓰는 글이다. main함수를 포함한 모든 함수에는 인수(파라미터)를 지정할 수 있다. main 함수의 매개변수는 보통 아무것도 사용하지 않지만 다음 모양과 같은 모양으로 쓰일 수 있다.

int main(void){
	// 중략
}

or

int main(int argc, char *argv[]){
	// 중략
}

int main(int argc, char *argv[]) 함수에서는 윈도우나 리눅스 같은 OS 명령 프롬포트를 이용해 인자를 전달해서 작동할 수 있도록 한다. c언어에서 main 함수는 프로그램이 최초로 실행되는 곳이다. 또한 매개변수는 함수를 호출할 때 전달되는 데이터를 의미하는데 우리는 main()함수의 매개변수를 넘겨줌으로써 원하는 실행결과를 도출하고자 한다 . 

1. int argc

- argc = argument count

- argc는 운영체제가 이 프로그램을 실행했을 때 전달되는 인수의 갯수이다. 

- 즉, main()함수에 전달되는 데이터의 갯수를 의미한다.

 

2. char *argv[]

- argv = argument variable

- char *argv[]: 문자열의 주소를 저장하는 포인터 배열

- argv[0]은 프로그램의 실행경로이다. 

- argv[1], argv[2] ... 에는 순서대로 사용자가 입력한 argument가 저장된다. 

 

예를 들어, int main(int argc, char *argv[])에 ./tiny 8000 aaa이라는 입력을 준다면,

argc2개일 것이고, argv[0]에는 실행경로인 ./tiny가 들어가고, argv[1]에는 8000이 들어가고, argv[2]에는 aaa가 들어갈 것이다. 

=> argv의 각 인자는 띄어쓰기로 구분된다. 

 

3. int main(int argc, char *argv[]) VS int main(int argc, char **argv)

위 함수의 차이점은 무엇인가? ? !

결론부터 말하면 두 함수는 똑같다. 

 

기본적으로 char *argv[]char 포인터 배열을 의미하고, char **argvchar 포인터에 대한 포인터를 의미한다. 

📌 더블 포인터(포인터의 포인터)는 포인터 변수를 가리키는 또 다른 포인터 변수를 의미한다.

 

다시 예를 들어 int main(int argc, char **argv)에 ./tiny 8000 aaa를 인자로 넣어줬다고 가정하면,

여기서 argv는 문자열의 시작 주소를 나타내는 3개(argc)의 char*의 배열을 가리키는 포인터이다. 

첫번째 문자열의 시작 주소를 나타내는 argv[0]은 첫 번째 문자열에 대한 포인터이고, *argv[0]은 첫 번재 문자열의 첫 번째 문자를 나타낸다. 그렇기에 **argv도 첫 번째 문자열의 첫 번째 문자를 나타낸다.

 

1. argv는 현재 처리해야할 문자열에 대한 포인터이다.

2. *argv는 현재 처리해야 할 문자열이다.

3. **argv는 현재 처리해야 할 문자열의 첫 글자이다. 

4. *argv + 1은 현재 처리해야할 문자열의 두 번째 문자에 대한 포인터이다. &argv[0][1]과 같다.

 

 

결론)

main()함수의 argument는 여러가지 파라미터에 따른 시뮬레이션을 해야할 경우에 유용하게 사용된다.

입력이 여러 개 있을 경우(예: 8000 aaa bbbb...)에는 문자열들이 여러개 있기 때문에 더블(2) 포인터가 필요하다. 

 

Reference)

https://m.blog.naver.com/jsky10503/221203136166

https://iamaman.tistory.com/364

반응형