반응형
함수의 인자 전달
인자 전달의 기본 방식은 값의 복사(Call-by-value) 입니다.
값의 복사는 원본의 값이 함수 전/후로 변경되지 않습니다.
배열 원소도 마찬가지인데, 배열 원소 전부를 전달하는 방법은 없습니다.
대신, 주소값 전달(Call-by-reference)합니다.
그리고 주소값을 전달하는 경우에는 원본의 값이 전/후로 변경이 됩니다.
#include <stdio.h>
// 함수내에서 param의 크기는 배열의 크기가 아닌 포인터의 크기를 의미
// 따라서 배열의 크기를 별도 함수의 인자로 같이 전달받습니다.
void testFunc(int * param, int len) {
for (int i = 0; i < len; i++) {
param[i] *= 10;
}
}
int main(void) {
int arr[] = { 1, 2, 3 };
int len = sizeof(arr) / sizeof(int);
testFunc(arr, len);
for (int i = 0; i < len; i++) {
printf("%d \n", arr[i]);
}
}
모든 요소들이 10배로 변경된 것을 확인할 수 있습니다.
배열 인자를 보내줄 때는 int * param과 int param[]은 동일한 의미를 가지고 있습니다.
void testFunc(int param[], int len) {...}
void testFunc(int * param, int len) {...}
배열이기 때문에 param[]이 좀 더 직관적입니다.
하지만 동일시 되는 경우는 함수 인자전달 선언시로 제한됩니다.
main 함수 내에서 아래의 경우는 성립되지 않습니다.
int main(void){
int arr[3] = {1, 2, 3};
// int ptr[] = arr 대체 불가능
// 배열은 배열 선언 및 초기화할 때 사용
int * ptr = arr;
}
swap 함수, 참조에 의한 전달
#include <stdio.h>
void swap(int * x, int * y) {
// 주소에 저장된 실제값들을 교환
int temp = *x;
*x = *y;
*y = temp;
}
int main(void) {
int a = 10, b = 20;
printf("%d %d \n", a, b);
// 참조하는 주소값을 전달
swap(&a, &b);
printf("%d %d \n", a, b);
}
add 함수, 값에 의한 전달
#include <stdio.h>
void add(int a, int b){
a = a + b;
}
int main(void){
int a = 7;
add(a, 10);
printf("%d\n", a);
}
add 함수, 참조에 의한 전달
#include <stdio.h>
void add(int *a){
*a = (*a) + 10;
}
int main(void){
int a = 7;
add(&a);
printf("%d\n", a);
}
반응형
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 포인터 변수 개념 (0) | 2021.03.20 |
---|---|
[C] 다차원 배열과 포인터 관계 (0) | 2021.03.20 |
[C] 포인터와 배열의 관계 (0) | 2021.03.20 |
[C] 동적 할당 필요성 (0) | 2021.03.20 |
[C] [전처리기] #ifdef (0) | 2021.03.20 |
댓글