함수에 배열 전달하기
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 29번째.
C 언어에서 배열을 함수로 전달할 때, 배후에서 흥미로운 일이 일어납니다. 배열 자체가 실제로 함수로 복사되는 것은 아닙니다. 대신, 배열의 첫 번째 요소에 대한 포인터가 전달됩니다.
이는 int arr[] 또는 int *arr와 같이 함수 매개변수를 작성할 때, 두 가지가 모두 동일하다는 것을 의미합니다. 즉, 두 표현 모두 배열의 첫 번째 요소를 가리키는 포인터를 나타냅니다. 함수는 배열이 시작되는 메모리 주소를 전달받으며, 이를 통해 원본 배열의 데이터에 직접 접근할 수 있게 됩니다.
void printArray(int arr[], int size) {
// arr은 실제로 첫 번째 요소를 가리키는 포인터입니다
// 함수는 원본 배열에 접근하고 수정할 수 있습니다
}함수가 복사본이 아닌 원본 배열의 메모리 위치를 직접 다루기 때문에, 함수 내부에서 발생한 모든 변경 사항은 원본 배열에 영향을 미칩니다. 이는 복사본을 생성하는 개별 변수를 전달하는 방식과는 다릅니다.
또한 함수가 포인터만으로는 배열의 길이를 결정할 수 없기 때문에, 배열의 크기를 별도의 매개변수로 전달해야 한다는 점을 알게 될 것입니다.
챌린지
쉬움온도 데이터를 처리하는 함수를 생성하여 배열을 함수에 전달하는 방법을 보여주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 정수 배열과 그 크기를 매개변수로 받는
analyzeTemperatures라는 이름의 함수를 생성합니다. analyzeTemperatures함수 내부에서, 평균 온도를 계산하고 소수점 첫째 자리까지Average temperature: [value]형식으로 출력합니다.analyzeTemperatures함수 내부에서, 최고 온도를 찾아Highest temperature: [value]형식으로 출력합니다.analyzeTemperatures함수 내부에서, 25도보다 높은 온도가 몇 개인지 세고 그 수를Days above 25 degrees: [count]형식으로 출력합니다.main함수에서, 온도 측정 횟수를 나타내는 정수n을 읽습니다.n개의 온도 값을 읽어 정수 배열에 저장합니다.- 배열과 그 크기를 전달하여
analyzeTemperatures함수를 호출합니다.
프로그램은 온도 데이터를 처리하고 분석 결과를 표시해야 합니다. 예를 들어, 입력이 다음과 같다면:
5
20 28 15 32 26출력은 다음과 같아야 합니다:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3이 챌린지는 배열이 첫 번째 요소에 대한 포인터로서 함수에 전달되는 방식을 보여주며, 이를 통해 함수가 복사본을 생성하지 않고도 원본 배열의 모든 요소에 접근하고 처리할 수 있음을 보여줍니다.
치트 시트
C 언어에서 배열을 함수에 전달할 때, 배열 자체가 복사되지는 않습니다. 대신, 첫 번째 요소에 대한 포인터가 전달됩니다.
int arr[]와 int *arr는 모두 동일한 함수 매개변수입니다. 이들은 첫 번째 요소에 대한 포인터를 나타냅니다:
void printArray(int arr[], int size) {
// arr은 실제로 첫 번째 요소에 대한 포인터입니다
// 함수는 원본 배열에 접근하고 수정할 수 있습니다
}주요 사항:
- 함수는 배열이 시작되는 메모리 주소를 받습니다
- 함수 내부에서 이루어진 변경 사항은 원본 배열에 영향을 미칩니다
- 함수는 포인터만으로는 길이를 결정할 수 없으므로 배열 크기를 별도의 매개변수로 전달해야 합니다
직접 해보기
#include <stdio.h>
// TODO: 여기에 analyzeTemperatures 함수를 생성하세요
int main() {
// 온도 측정값의 개수를 읽습니다
int n;
scanf("%d", &n);
// 온도를 저장할 배열을 선언합니다
int temperatures[n];
// 온도 값을 읽습니다
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// TODO: 여기에 analyzeTemperatures 함수를 호출하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.