본문 바로가기
Language&Framework&Etc/C

함수 포인터와 void 포인터(19-2) main 함수로의 인자 전달

by 머리올리자 2020. 12. 10.

main 함수를 통한 인자의 전달

우리가 지금까지 보아온 main 함수의 정의형태

int main(void){....}

main 함수는 다음과 같이 정의 가능

int main(int argc, char* argv[]){....}

프로그램 실행 시 main함수로 전달할 인저를 열거할 수 있으며(결정할 수 있으며), main 함수 역시 이러한 인자를 전달받을 수 있도록 제한된 형태의 매개변수 선언이 가능하다.

 

아래와 같이 코드를 작성

#include <stdio.h>

int main(int argc, char* argv[])
{
	
	printf("전달된 문자열의 수 : %d \n", argc);

	for (int i = 0; i < argc; i++)
		printf("%d번째 문자열: %s \n", i+1, argv[i]);

	return 0;
}

  • 솔루션 빌드 후 생긴 exe 파일을 c드라이브로 복사(사실 복사 안하고 exe 생성 디렉토리에서 바로 작업해도 된다)
  • c드라이브 작업 공간을 옮긴 후 터미널을 열어 명령문 실행(c_study.exe Hello Bye)
  • 아래와 같은 결과 확인 가능

프로그램 실행과정에서 입력한 내용이 프로그램 안으로 전달되어서 출력이 됨

 

char* argv[]

char* argv[]

이미 경험한바 있는 유형의 포인터 변수 선언.

앞서 매개변수 선언에서 다음 두 선언은 같은 선언임을 설명

 

void simplefunc(TYPE *arr) {....}
void simplefunc(TYPE arr[]) {....}

즉, TYPE형 1차원 배열의 이름(주소 값)을 인자로 전달받을 수 있는 매개변수의 선언이다.

그럼 이제 다음과 같이 TYPE을 char*로 바꿔보자.

그럼 char형 포인터 변수로 이뤄진 1차원 배열의 이름을 인자로 받을 수 있는 매개변수의 선언이 된다.

 

void simplefunc(TYPE **arr) {....}
void simplefunc(TYPE * arr[]) {....}

 

main 함수의 argv는 char형 더블 포인터 변수이고,

이는 char형 포인터 변수로 이뤄진 1차원 배열의 이름을 전달받을 수 있는 매개변수

 

아래를 참고하면 이전 내용이랑 크게 다르지 않다는 것을 알 수 있음

#include <stdio.h>

void showstring(int argc, char* argv[])
{
	for (int i = 0; i < argc; i++)
		printf("%s \n", argv[i]);
}

int main(int argc, char* argv[])
{

	char* str[3] = {
		"C programming",
		"C++ programming",
		"Python programming",
	};

	showstring(3, str);
	return 0;
}

인자의 형성 과정

c_study가 실행되면서 이의 main 함수로 다음과 같이 총 3개의 문자열 정보가 전달된다.

 

문자열 1 c_study.exe

문자열 2 Hello

문자열 3 Bye

 

공백이 문자열을 나누는 기준이 된다.

 

이리하여 총 3개의 문자열이 다음과 같이 하나의 배열에 묶여서 ,ain 함수의 두 번째 인자로 전달이 되며,

첫 번째 인자로는 문자열의 수가 전달된다.

 

즉, 위와 같은 배열이 구성된 다음에 main 함수는 다음의 형태로 호출된다.

main(3, strArr);

위의 그림처럼 배열의 마지막에 NULL이 삽입되는지 확인하기 위해서 예제

NULL이 잘 삽입된다는 특징을 이용해서 모든 문자열 출력

 

#include <stdio.h>


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;
}

큰 따옴표를 묶으면 공백을 포함하는 문자열을 생성해서 main함수의 인자로 전달하는 것이 가능

 

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.