본문 바로가기
C/코딩도장

[코딩도장] Unit 64. 함수에서 배열 매개변수 사용하기

by 단월໒꒱ 2021. 8. 26.

1. 배열 매개변수 사용하기

함수에서 배열 매개변수를 사용하려면 형식은 아래와 같다.

 

반환값자료형 함수이름(자료형 매개변수[ ]) {

}

 

또는

 

반환값자료형 함수이름(자료형 *매개변수) {

}

 

아래는 위의 내용을 적용한 예시 코드이다.

 

 

 

함수에서 배열 매개변수를 사용할 때 매개변수 이름 뒤에 대괄호만 붙이면 되는데, 이때 대괄호 안에 크기를 지정하더라도 무시된다.

여기서 arr[]은 배열의 메모리 주소를 담고 있는 포인터이고 배열의 실제 크기는 알 수 없으므로 다른 매개변수를 통해 배열의 크기를 받아야 한다.

 

위의 코드에서 함수 printArray를 사용할 때 요소의 개수를 넣어주었는데, 요소의 개수를 구하는 방법은 17번째 줄처럼 배열의 크기를 자료형의 크기로 나누면 된다.

배열의 크기를 정수로 넣어줘도 되지만 위의 코드처럼 sizeof로 크기를 구해주면 나중에 배열의 크기가 바뀌었을 때 추가적으로 코드를 수정할 필요가 없다.

 

위의 상황에서는 대괄호를 이용해서 배열 매개변수를 사용했는데, 앞에서 적어놓은대로 포인터를 이용할 수도 있다.

그렇게되면 3번째 줄의 코드를 void printArray(int *arr, int count)라 적어도 같은 내용을 나타낸다.

 

2. 2차원 배열 매개변수 사용하기

2차원 배열을 매개변수로 사용할 수도 있는데, 형식은 아래와 같다.

 

반환값자료형 함수이름(자료형 매개변수[][가로크기]) {

}

 

또는 

 

반환값자료형 함수이름(자료형 (*매개변수)[가로크기]) {

}

 

아래는 위의 내용을 적용한 예시 코드이다.

 

 

 

함수에서 2차원 배열을 매개변수로 사용할 때 매개변수 이름 뒤에 대괄호를 두 개 붙이고 두번째 대괄호 안에는 가로 크기를 넣어줘야하는데, 이 때 첫 번째 대괄호 안에 세로 크기를 넣어주더라고 무시된다.

 

위의 코드에서 함수 print2DArray를 사용할 때 가로와 세로의 크기를 넣어줬는데, 여기서 가로 크기를 구할 때는 23번째 줄처럼 가로 한 줄을 요소(자료형) 크기로 나누면 되고, 세로 크기를 구할 때는 25번째 줄처럼 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠주면 된다.

 

여기서는 대괄호만을 이용해서 배열을 매개변수로 사용했는데, 앞서 적어놓은대로 포인터와 대괄호를 사용할 수도 있다.

그렇게 되면 위의 사진에서 3번째 줄의 코드를 void print2DArray(int (*arr)[5], int col, int row) 로 바꿔서 써도 같은 내용이다.

 

3. 복합 리터럴 사용하기 (배열)

함수에 배열을 넘겨줄 때 복합 리터럴을 사용하면 배열을 따로 선언하지 않아도 된다.

 

1차원 배열일 때 사용하는 형식은 아래와 같다

(자료형[]) {값1, 값2, 값3...}

(자료형[]) {값1, 값2, 값3...}

 

다음은 2차원 배열일 때 복합 리터럴 사용하는 형식이다.

(자료형)[][가로크기] {{값1, 값2, 값3}, {값4, 값5, 값6}}

(자료형)[세로크기][가로크기] {{값1, 값2, 값3}, {값4, 값5, 값6}}

 

4. 함수의 배열 매개변수에서 요소의 최소 개수 지정하기

반환값자료형 함수이름(자료형 매개변수[static 최소개수]) {

      코드

}

 

위와 같이 함수의 배열 매개변수에 static과 숫자를 넣어주면 배열의 요소의 최소 개수를 지정할 수 있다.

이렇게 할 경우, 매개변수로 들어온 배열의 요소 개수가 지정된 개수보다 작을 때 경고가 발생한다.

 

 

# 퀴즈

1. printArray 함수에서 int 배열을 매개변수로 사용하려고 합니다. 올바른 코드를 모두 고르세요.

  답  ->  a. void printArray(int *arr, int count);

              c. void printArray(int arr[], int count);

 

2. print2DArray 함수에서 int형 2차원 배열을 매개변수로 사용하려고 합니다(배열의 가로 크기는 4입니다). 올바른 코드를 고르세요.

 답  ->  d. void print2DArray(int arr[][4], int col, int row);

 

3. 다음 2차원 배열의 가로 크기를 구하는 방법으로 올바른 것을 고르세요.

 답  ->  b. sizeof(numArr[0]) / sizeof(int)

 

4. 다음 소스 코드의 실행 결과로 올바른 것을 고르세요.

 답  ->  c. 500 8

 

 

# 연습문제 1 : 배열 매개변수 사용하기

[문제]

 

[코드 및 결과]

 

 

[설명]

주어진 코드를 보면 함수를 정의하는 부분에서 매개변수 부분이 비어있다.

아래의 코드를 보면 배열이 float 형이므로 매겨변수를 float arr[]로 지정해주고 count도 int형으로 지정해준다.

float arr[] 대신 float *arr로 매개변수를 지정해도 같은 뜻이므로 둘 중 어느 걸로 해도 상관없다.

 

 

# 연습문제 2 : 단위행렬 만들기

[문제]

 

[코드 및 결과]

 

 

[설명]

주어진 코드를 보면 함수를 정의하는 부분이 비어있기 때문에 함수 setIdentityMatrix를 정의하도록 한다.

여기서 matrix는 가로 크기가 4인 2차원 배열이므로 2차원 배열을 매개변수로 지정해주고 행렬의 크기 n도 지정해준다.

문제에서 말한 단위행렬의 정의를 보고 for문을 사용해서 행과 열이 같은 경우 값을 1로 설정해준다. 

 

 

# 심사문제 1 : 배열 매개변수 사용하기

[문제]

 

[코드 및 결과]

 

 

[설명]

일단 배열과 요소의 개수를 int형으로 지정해준다.

문제에서 반대 순서대로 입력하라고 해서 입력된 배열의 값을 순서를 바꿔서 역순으로 만드는 방법을 생각했지만 그 방법을 쓰기엔 주어진 빈칸에 비해 너무 길어지기 때문에 다른 쉬운 방법이 없나 생각해보았다.

그렇게 떠오른 게 아예 역순으로 출력하는 방법으로, for문을 이용해서 맨 뒤에서부터 배열에 입력된 값을 출력해준다.

 

 

# 심사문제 2 : 전치행렬 만들기

[문제]

 

[코드 및 결과]

 

 

[설명]

문제에서 제시된 전치행렬은 가로가 4인 행렬이므로 매개변수로 int arr[][4]를 지정해주고 카운트값 n도 지정해준다.

전치행렬은 대각선을 기준으로 값이 뒤집히는 것이므로 for문을 통해 하나하나 접근해가면서 i가 j보다 작을 경우 임의의 temp 변수를 이용해서 arr[i][j] 값과 arr[j][i] 값을 서로 바꾸어준다.

처음에는 if문의 조건식에 i != j로 했었는데 이렇게 하면 또 처음 한번 바뀌고 뒤에서 또 바뀌어서 원래 입력한 초기값대로 나온다.

 

 

 

댓글