본문 바로가기

Programming/C, C++

배열

1차원 배열을 함수의 인자로 넘기는 방법

 

int average(int a[], int n)    // = int average(int *a, int n)

{

     int sum = 0;

     int i;

     for(i = 0; i < n; i++)

          sum += a[i];

     return (sum/n);

}

 

C에서 배열의 크기는 메모리 공간을 할당할 때만 필요하지 실행시에는 배열의 크기에 대해서 컴파일러가 신경써주지 않는다.

 

그래서 함수가 배열을 인자로 받을 때 그 배열이 몇 개의 쇼고를 가지는지는 전혀 알 방법이 없다.

 

이런 이유로 average() 함수는 n이라는 배열의 크기를 인자로 따로 받는다.

 

그리고 인자로 받는 배열 a에도 []로 배열 표시만 했지 크기를 명시하지 않았다.  

 

 물론 배열 자체에 배열의 끝을 나타내는 요소가 있으면 배열의 크기를 넘길 필요가 없다.

 

 가장 전형적인 예가 C에서 문자열을 다루는 방식이다.

 

C에서 문자열은 char형의 배열로 구현하는데 특별히 문자열의 크기에 신경을 쓰지 않는다.

 

그것은 배열의 끝을 나타내는 NULL문자가 문자열의 끝에 붙어있기 때문이다.

 

배열을 읽어가다가 NULL을 만나면 배열의 끝임을 알게 되는 것이다.

 

배열에 한계를 주는 방법은 이렇게 두가지가 있지만 그 선택은 프로그래머의 손에 달려있다.

 

 

2차원 배열을 함수의 인자로 넘기는 방법

 

void input_matrix(int m[][2], int n)

{

     int i, j;

 

     printf("Input %d by %d Matrix in row order : \n", n, n);

     for(i = 0; i < n; i++)

          for(j = 0; j < n; j++)

               scanf("%d", &m[i][j]);

}

 

int main(void)
{
      int mat[2][2];
      input_matrix(mat, 2);
      return 0;
}

 

m을 포인터라고 보았을 때, int m[][2]의 표현은 m이 두 개의 int형의 공간을 가리키는 포인터이다.

 

즉, int m[][2]의 표현은 배열의 크기를 나타낸 것이 아니라 m이 어떤 형의 데이터를 가리키는 포인터인지 나타내는 것이다.

 

 즉 m이 두개의 int형 공간을 가리킨다는 것은 알려졌지만 두 개의 int형의 공간이 몇개나 있는지는 알려져 있지 않다.

 

결국은 배열의 크기를 명시하지 않은 것이다.

 

(실습)

사용자로부터 2차 행렬 2개를 입력받아 행렬의 곱을 구하는 프로그램을 만들어보자.

사용자로 부터 행렬을 입력받는 함수와 행렬의 곱을 수행하는 함수, 결과값을 출력하는 함수를 만들어야 한다.

main함수에서는 각각의 함수를 호출한다. 

'Programming > C, C++' 카테고리의 다른 글

Floating Point (C++ Source Example)  (1) 2018.09.10
Floating Point  (0) 2018.09.10
데이터형에 관계없는 swap() 함수  (0) 2017.12.11
void포인터, 함수 포인터  (0) 2017.12.11
포인터의 포인터  (0) 2017.12.11