일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 |
29 | 30 | 31 |
- python
- nginx
- Double
- 42
- float
- phpmyadmin
- Class
- libft
- 구조체
- else if
- 42Seoul
- vs코드 단축키
- jupyter 단축키
- 42서울
- iF
- docker
- C언어
- cout
- 동적할당
- While
- 포인터
- list
- C++
- ft_server
- 패킹
- 함수
- 2차원배열
- 42cursus
- 자료형
- for
- Today
- Total
Developer
26.(C언어) 함수(2) 본문
이번에는 함수에서 배열을 매개변수로 사용해보자.
배열 매개변수
배열을 매개변수로 사용할 때에는 포인터를 사용하거나 변수뒤에 [](대괄호)를 붙혀주면된다.
#include<stdio.h>
void f(int* a) {
a[3] = 200;
}
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
f(arr);
printf("%d\n", arr[3]);
return 0;
}
코드1과 같이 배열의 이름은 배열의 첫 주소를 가리키는 포인터이므로 위와 같이 사용할 수 있다. 하지만 이렇게 작성하면 매개변수가 배열인지 함수만 봐서는 알기 어렵다는 단점이 있다.
#include<stdio.h>
void f(int a[]) {
a[3] = 200;
}
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
f(arr);
printf("%d\n", arr[3]);
return 0;
}
a[]은 배열의 메모리 주소를 담고 있는 포인터이다. 매개변수가 배열이라는 것을 명시적으로 나타낼 수 있다. 하지만 결국 이것도 포인터 이므로 함수에서 배열의 요소를 바꾸면 외부에 있는 배열의 요소가 바뀌는 것이다(call by reference).
두 가지 방법에서 주의할 점은 함수에서는 전달받은 배열의 크기를 알 수 없다. 그렇기 때문에 보통 배열의 크기를 전달받는 매개변수를 추가해서 사용한다.
매개변수를 아래의 코드와 같이 작성하면 되지 않겠느냐 생각할지도 모르겠지만
void f(int a[1]) {
a[3] = 200;
}
위와 같이 작성을 해도 [](대괄호) 내부의 숫자는 무시된다. 따라서 배열의 크기를 따로 전달해야한다.
2차원 배열 매개변수
2차원 배열은 열의 크기를 지정해 주어야한다.
#include<stdio.h>
void f(int a[][3],int col,int row) {
int i, j;
for(i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int main() {
int arr[5][3] = {
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12},
{13,14,15}
};
int col = sizeof(arr[0]) / sizeof(int);
int row = sizeof(arr) / sizeof(arr[0]);
f(arr,col,row);
return 0;
}
a[][3]은 2차원 배열의 주소를 담고 있는 포인터이다. 1차원 배열과 마찬가지로 배열의 크기를 알수 없으니 행과 열의 크기를 매개변수로 받아 배열을 출력하였다.
void f(int (*a)[3],int col,int row) {
int i, j;
for(i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
}
위와 같이 포인터를 사용할 수도 있다. 주의할점은 포인터를 괄호로 묶어 배열의 포인터라는 것을 표시해줘야 한다는 것이다.
재귀함수
재귀함수는 함수가 자기 자신을 호출하는 것을 말한다. 재귀함수에서 중요한 것은 함수의 종료 조건을 만들어 주어야한다는 것이다. 종료 조건이 없다면 계속 함수가 자기 자신을 호출해 종료되지 않기 때문이다.
팩토리얼을 계산하는 함수를 만들어보자. 팩토리얼은 1부터 n까지 숫자를 차례로 곱하는 값이다.
#include<stdio.h>
int fac(int n) {
if (n == 1)
return 1;
return n * fac(n - 1);
}
int main() {
printf("%d", fac(3));
return 0;
}
fac함수에서 다시 fac를 호출하는 것을 볼 수 있다. 바로 이렇게 함수 내부에서 자기 자신을 호출하는게 재귀호출이다.
위의 함수에서 if(n==1)이 종료 조건이다.
그럼 그림을 통해 재귀함수가 어떻게 동작되는지 알아보자.
재귀함수 호출(1)
처음 호출되었을 때 fac로 3이 전달된다.
이때 n은 1이 아니므로 return 3*fac(n-1)이 수행된다.
함수의 반환값은 자신을 호출한 함수로 반환된다.
'Programming Language > C' 카테고리의 다른 글
28.(C언어) 파일 입출력 (0) | 2020.08.01 |
---|---|
27.(C언어) 함수(3) (0) | 2020.08.01 |
25.(C언어) 함수(1) (0) | 2020.08.01 |
24.(C언어) 지역변수와 전역변수 (0) | 2020.08.01 |
23.(C언어) 공용체, 열거형 (0) | 2020.08.01 |