본문 바로가기

프로그래밍/C언어

[C언어] 포인터(10) - 배열과 매개변수

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.



배열과 매개변수


매개변수를 통해 배열을 전달하려고 할 때 매개변수의 타입을 배열로 하면 됩니다. 하지만 이는 성능상 문제가 있습니다. 왜냐하면 배열의 크기가 작으면 상관 없지만 배열의 크기가 클 경우에는 시간이 아주 오래 걸릴 수 있습니다. 그렇기 때문에 매개변수로 배열을 넘겨주는 것 보다 배열의 주소만 넘겨주게 되면 성능적으로 매우 효율적이고 메모리도 많이 절약 할 수 있습니다.  예를 들면 다음과 같이 할 수 있다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
 
int sumArr(int *pArr) {
    int sum = 0;
 
    return sum;
}
int main(void) {
    
    int arr[5];
    int add = sumArr(arr);
    return 0;
}
 
cs


위의 코드에서 보는 것 처럼 sumArr 함수를 호출하면서 배열의 주소를 넘겨 줄 수 있습니다. 그렇기 때문에 pArr에는 배열의 주소가 들어가기 때문에 sumArr함수에서도 main함수의 배열 arr을 이용할 수 있습니다.


*매개변수의 타입이 포인터인 경우에는 다음과 같이 '*' 기호 대신 []를 쓰는것이 가능합니다. 

ex) int sumArr(int *pArr){...} -> int sumArr(int pArr[]){...} 


매개 변수로 배열의 주소를 받았지만 배열의 길이는 어떻게 해야 할까요 ?

이전에 배열에서 배웠던 것처럼 sizeof(arr)/sizeof(arr[0]) 을 이용하여 배열의 길이를 구할 것이라고 생각할 수 있지만 여기서는 포인터의 크기를 반환합니다. 그렇기 때문에 매개 변수로 배열의 길이도 받아와야 합니다.

예제를 통해서 위에서 배운 것을 활용하여 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
 
int sumArr(int *pArr,int length) {
    int sum = 0;
    for (int i = 0; i < length; i++) {
        sum += *pArr++;
 
    }
    return sum;
}
int main(void) {
    
    int arr[5= { 1,2,3,4,5 };
    int length = sizeof(arr) / sizeof(arr[0]);
    int add = sumArr(arr,length);
    printf("add = %d\n", add);
    return 0;
}
 
cs


이상으로 배열과 매개변수에 대해서 알아 보았습니다.