배열을 함수에게 전달해주는 방법

배열에 데이터가 많을때, 이를 여러가지 함수에서 사용하는 경우를 생각해보자. 이 경우 각각 함수에서 이 배열을 복사해서 쓴다면, 실행시간이 오래걸릴 것임. 이때는 배열 전체를 복사하는게 아니라 차라리 배열의 첫 주소만 알려주는게 나을 것이다.

오해의 여지가 있으니 코딩하며 함께 보겠다.

예제 코드를 보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	double arr1[5] = { 10,13,12,7,8 };
	double arr2[5] = { 1.8, -0.2, 6.3, 13.9, 20.5 };
	
	printf("Address = %p\\n", arr1);
	printf("Size = %zd\\n", sizeof(arr1));

	double avg = 0.0;
	for (int i = 0; i < 5; ++i)
	{
		avg += arr1[i];
	}
	avg /= (double)5;

	printf("Avg = %f\\n", avg);

	return 0;
}

arr1의 값들, 주소, 평균값 등을 출력하는 코드이다. 이를 더 일반화해서 함수로 사용해보자.

배열의 이름은 포인터와 유사하다. 함수에서는 배열을 통째로 가져오는게 아니라, 파라미터로 받은 배열을 포인터처럼 사용한다. 그래서 함수 내에서 파라미터로 받은 (자료형 double)배열의 크기를 출력해보면, x86에서는 무조건 크기가 4byte, x64에서는 크기가 8byte이 나온다. why?

이는 포인터변수의 주소의 사이즈이다. 그래서 x86과 x64에서 고정된 4,8이라는 값이 나오는 것임.

이를 보면 파라미터로 받은 배열의 변수명이 아예 포인터변수로 동작하는 것을 알 수 있다.

그래서 배열 변수이름에서 squere brakit에 어떤 숫자를 넣어도 의미가 없다. 다만 배열인걸 명시해주려고 빈 brakit을 적어주긴 한다. 중요..

또는 그냥 다음과 같이 쓴다.

double average(double *, int n);

double average(double [], int n);

둘다 그냥 배열처럼 기능한다. 둘 중 어떤걸 주로 쓰냐 하면… asterisk를 이용한 첫번째 표기를 고전적 C프로그래밍에선 더 자주 사용했다.

Untitled