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이라는 입력을 준다면,
argc는 2개일 것이고, 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 **argv는 char 포인터에 대한 포인터를 의미한다.
📌 더블 포인터(포인터의 포인터)는 포인터 변수를 가리키는 또 다른 포인터 변수를 의미한다.
다시 예를 들어 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)
'SW사관학교 정글 > C언어와 친구들' 카테고리의 다른 글
[C언어와 친구들] 이진 탐색 트리 (BST) (0) | 2022.10.24 |
---|---|
[C언어와 친구들] 구조체(Struct)의 멤버가 포인터일 때, 구조체 포인터 변수 선언(동적메모리할당) (1) | 2022.10.24 |
[C언어와 친구들] 구조체(Struct)와 연결리스트(Linked List) wow (4) | 2022.10.24 |
[C언어와 친구들] C언어의 *포인트는 포인터 (0) | 2022.10.24 |
[C언어와 친구들] 배열 .. 너 .. 포인터랑 뭐 있어? (0) | 2022.10.22 |