기본적으로 함수 호출 시에 "값에 의한 호출(call by value)"이 이루어진다.
"값에 의한 호출"이란 함수 호출할 때, 인수의 값이 매개변수로 전달하면서 원본이 전달되는 것이 아니라 복사본이 전달된다.
하지만 배열의 경우에는 함수 호출 시에 인수가 배열이라면 "값에 의한 호출"이 아니라 "참조에 의한 호출(call by reference)"을 한다.
이는 복사본이 전달되는것이 아니라, 원본이 전달된다고 알아두면 된다.(자세한 내용은 포인터를 학습해야 한다)
요약 : 기본적으로 값에 의한 호출, 인수가 배열이면 참조에 의한 호출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include<stdio.h>
#define STUDENT 5
int get_avg(int score[], int n);
int main(void)
{
int grade[STUDENT] = {10, 20, 30, 40, 50};
int avg;
avg = get_avg(grade, STUDENT);
printf("평균은 %d\n", avg);
return 0;
}
int get_avg(int score[], int n)
{
int i;
int sum = 0;
for(i=0; i<n; i++){
sum = sum + score[i];
}
return sum / n;
}
|
cs |
이 코드에서 get_avg함수를 살펴보자.
get_avg함수의 매개 변수가 score[]이라는 배열이다. 인수로 grade배열이 전달된다.
위에서 말했듯이 배열이 함수로 인수로 전달되는 경우이다. 이 경우는 '참조에 의한 호출' 즉, 원본이 전달된다고 보면된다.
원본배열의 변경
이 경우에 만약 get_avg함수에서 매개 변수 score을 이용하여 배열 원소의 값을 변경한다면 원본 배열인 grade를 변형시키는 결과를 가져오니 주의하도록 하자. why? '참조에 의한 호출'은 배열이 저장되어있는 메모리상 주소를 가르키기 때문이다.
핵심 -> 원본 전달 = 참조에 의한 호출(call by reference) = 메모리상의 주소를 가르킨다
전부같은 얘기임.
메모리상의 주소를 가르키기 때문에 수정 할때 그 메모리로 가서 수정을 하기 때문에 원본 배열을 수정할 수 있는것!
원본 배열의 변경 금지
프로그래밍 실수로 인하여, 의도하지 않았음에도 배열 원소의 값이 변경되는 경우가 가끔 발생한다.
이는 심각한 오류가 발생되기도 하는데, 그렇다면 어떻게 원본 배열이 변경되는것을 방지할까?
const지정자를 사용한다.
1
2
3
4
|
void print_arr(const int a[], int size)
{
a[0] = 100;
}
|
cs |
배열 a의 첫번째 원소를 변경하려 하지만 변경되지 않는다.
const지정자를 배열 매개 변수 a앞에 const지정자를 붙였기 때문이다.
'C프로그래밍 > 개인 공부' 카테고리의 다른 글
C언어 - 쉽게 풀어쓴 C언어 express 10장 배열 실습문제(짝수번) (0) | 2022.07.13 |
---|---|
C언어 - 정렬 (0) | 2022.07.06 |
C언어 - 배열의 복사, 비교 (0) | 2022.07.04 |
C언어 - 배열요소의 개수 계산(sizeof) (0) | 2022.07.04 |
C언어 - 포인터1, 선언과 초기화 (1) | 2022.05.25 |