배열을 입출력하는 함수
- 배열명을 꼭 포인터에 넣는 방식으로 배열을 처리할 필요가 없다
- 하지만 함수로 배열을 처리하려면 포인터가 필요하다
- ary 배열에서 배열명 ary는 첫 번째 배열 요소의 주소이다
- 이 주소 값을 함수의 인수로 주면, 함수는 이 값을 받아 주소 계산을 통해 모든 배열 요소를 사용할 수 있다
- 이때 배열명을 받을 함수의 매개변수 자리에 포인터가 필요하다
배열의 값을 출력하는 함수
==> 배열을 처리하는 함수에 필요한 것은 배열의 주소이다
배열을 처리하는 함수
#include <stdio.h>
void print_ary(int* pa); // 함수 선언
int main(void)
{
int ary[5] = { 10, 20, 30, 40, 50 };
print_ary(ary); // 배열명을 주고 함수 호출
return 0;
}
void print_ary(int* pa) // 매개변수로 포인터 선언
{
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", pa[i]); // pa로 배열 요소 표현식 사용
}
}
표현방법
print_ary 함수에서 배열명 ary를 직접 사용할 수 없을까?
함수 안에 선언된 변수나 배열의 이름은 사용 범위가 중괄호 블록({})으로 제한되므로 함수 안에서만 사용할 수 있다.
따라서 print_ary 함수에서는 main 함수에 있는 배열명 ary를 직접 사용할 수 없다.
이런 제한 때문에 2개 이상의 함수에서 같은 이름의 변수나 배열을 독립적으로 사용할 수 있다. 각 함수 안에 사용한 변수나 배열의 이름은 사용 범위가 다르므로 다른 함수에 있는 같은 이름의 변수나 배열과 서로 충돌하지 않는다.
배열 요소의 개수가 다른 배열도 출력하는 함수
배열의 값을 출력하는 함수는 첫 번째 배열 요소의 주소만 알면 되므로 배열 요소의 개수가 달라도 함수의 구현 방법은 같다. 다만 배열 요소의 개수가 바뀌면 출력문의 반복 횟수가 달라지므로 함수의 수정이 불가피하다
#include <iostream>
void print_ary(int* pa, int size); // 함수 선언, 매개변수 2개
int main(void)
{
int ary1[5] = { 10,20,30,40,50 }; // 배열 요소의 개수가 5개인 배열
int ary2[7] = { 10,20,30,40,50,60,70 }; // 요소의 개수가 7개인 배열
print_ary(ary1, 5); // ary1 배열 출력, 배열 요소의 개수 전달
printf("\n");
print_ary(ary2, 7); // ary2 배열 출력, 배열 요소의 개수 전달
return 0;
}
void print_ary(int* pa, int size) // 배열명과 배열 요소의 개수를 받는 매개변수 선언
{
int i;
for (i = 0; i < size; i++) // size의 값에 따라 반복 회수 결정
{
printf("%d ", pa[i]);
}
}
Q. print_ary 함수 안에서 sizeof 연산자로 배열의 크기를 알 수 있을까?
A. 불가능하다. sizeof 연산자를 배열명에 사용하면 배열 전체 크기를 구하지만 포인터에 사용하면 포인터 자체의 크기만을 계산한다. 포인터가 배열명을 저장한 경우라도 마찬가지다. 따라서 다음과 같은 연산은 배열 요소의 개수를 알 수 없으므로 무의미하다.
sizeof(pa) / sizeof(pa[0]) => 포인터의 크기 / 첫 번째 배열 요소의 크기 => 4 / 4
배열에 값을 입력하는 함수
배열에 값을 입력하는 함수도 배열의 값을 출력하는 함수와 구현 방법은 같다.
다만 입력 함수는 데이터를 저장할 배열의 위치가 필요하므로 함수 안에서 포인터를 직접 사용한다
#include <iostream>
void input_ary(double* pa, int size);
double find_max(double* pa, int size);
int main(void)
{
double ary[5];
double max;
int size = sizeof(ary) / sizeof(ary[0]);
input_ary(ary, size); // 배열에 값 입력
max = find_max(ary, size); // 배열에 최댓값 반환
printf("배열의 최댓값 : %lf\n", max);
return 0;
}
void input_ary(double* pa, int size) // double 포인터를 매개변수로 선언
{
int i;
printf("%d개의 실수값 입력 : ", size);
for (i = 0; i < size; i++) // size의 값에 따라 반복 횟수 결정
{
scanf("%lf", pa + i); // &pa[i]도 가능, 입력할 배열 요소의 주소를 전달
}
}
double find_max(double* pa, int size)
{
double max;
int i;
max = pa[0]; // 첫 번째 배열 요소의 값을 최댓값으로 설정
for (i = 0; i < size; i++) // 두 번째 배열 요소부터 max와 비교
{
if (pa[i] > max) max = pa[i]; // 새로운 배열 요소의 값이 max보다 크면 대입
}
return max; // 최댓값 반환
}
함수의 매개변수 자리에 배열을 선언하는 경우
함수의 매개변수 자리에 배열을 선언하면 배열의 저장 공간이 할당되지 않으며, 배열명은 컴파일 과정에서 첫 번째 배열 요소를 가리키는 포인터로 바뀐다
'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
이중 포인터와 배열 포인터 (0) | 2023.04.25 |
---|---|
배열을 처리하는 함수 (2) (0) | 2023.01.26 |
배열과 포인터의 관계 (2) (0) | 2023.01.26 |
배열과 포인터의 관계 (1) (0) | 2023.01.26 |
전처리 지사자 (2) (0) | 2023.01.11 |