--> [C/C++] 포인터와 함수에 대한 이해

[C/C++] 포인터와 함수에 대한 이해

함수의 인자로 배열 전달하기


함수의 인자로 배열을 전달하는 방법에 대해서 살펴 보겠습니다.

 

■ 1. 함수의 인자 전달 방식


함수에서 인자 전달의 기본 방식은 값의 복사에 의한 전달 방식입니다.

 

 

함수 호출에서 값의 복사에 의하 인자 전달 방식입니다. 메인 함수에서 num을 인자로 하여 call_Method 함수를 호출 하고 있고 call_Method 함수에서는 같은 이름의 num을 매개변수로 하여 값을 받고 있습니다.

 

여기서 '복사'의 의미는 단순히 '10'이라고 하는 값이 복사 된 것입니다. 즉 메인 영역의 num변수와 call_Method 함수의 num은 서로 다른 변수이며 어느 한 영역에서 값이 변경 되도 다른 영역의 num 변수에는 영향을 주지 않습니다.

 

문제는 배열을 통째로 복사하여 인자로 넘겨주는 방식은 사용 할 수 없습니다. 그래서 대안으로 포인터를 사용하여 배열을 인자로 하여 매개변수로 넘겨 줄 수 있습니다.

 

■ 2. 배열을 함수의 인자로 전달


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void call_Method(int *num);
 
int main()
{
    int num[5] = { 1,2,3,4,5 };    //배열 선언 및 초기화
    call_Method(num);            //함수의 인자로 배열의 시작주소인 이름을 넘김
}
 
void call_Method(int *num)
{
    for (int i = 0; i < 5; i++)    //전달받은 배열의 시작주소를 이용하여 출력
    {
        printf("%d \n", *(num + i));
    }
}

 

6번 라인에서 인자로 배열의 시작 주소(배열의 이름)을 넘기고 있습니다. 매개변수의 int형 포인터를 통하여 전달 받게 됩니다. 즉 배열은 하나만 존재하지만 배열을 가르키고 있는 포인터가 두 개가 됩니다. 하나는 main 함수 내에 존재하고 또 다른 하나는 호출 받는 함수 내에 존재하게 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void call_Method(int *num);
 
int main()
{
    int num[5] = { 1,2,3,4,5 };    //배열 선언 및 초기화
    call_Method(num);            //함수의 인자로 배열의 시작주소인 이름을 넘김
    printf("%d \n", num[2]);    //3번째 인자 출력
}
 
void call_Method(int *num)
{
    num[2] = 100;                //3번째 인자의 값 100으로 변경
    
}

 

이번에는 호출 된 함수에서 넘겨받은 배열의 값을 변경하고 메인에서 출력 해보는 예제입니다. 인자를 넘겨 주는 방식이 복사에 의한 전달이 아니고 주소에 의한 전달이므로 call_Method 함수에서 변경 된 값이 그대로 적용이 됩니다.

 

3. 배열을 함수의 인자로 전달 2


 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void call_Method(int num[],int length);
 
int main()
{
    int num[5] = { 1,2,3,4,5 };
    call_Method(num, sizeof(num)/sizeof(int));    //배열의 시작주소와 배열의 크기를 인자로 넘김
}
 
void call_Method(int num[], int length)
{
    for (int i = 0; i < length; i++)    //배열의 내용 출력
    {
        printf("%d \n", num[i]);
    }
}

 

배열을 전달하는 다른 방식으로 매개 변수를 받는 자료 형식을 'int []변수명'으로 하는 것입니다.

선언 방식인 int num[]과 int *num은 완전히 같은 것이라고 생각하면 됩니다. int num[] 같은 경우 배열의 이름이 대입되므로 상수라고 생각되기 싶지만 실제로는 변수입니다.

댓글(1)

  • 시그윈
    2020.10.20 06:25

    혹시 c언어에 대한 질문 좀 해도 괜찮을까요...

Designed by JB FACTORY