반응형
[ 함수와 배열 ]
함수에서 배열을 매개변수로 사용하면 연속된 값을 전달할 수 있꼬, 전달한 배열의 요소를 함수 안에서 변경할 수 있다.
1차원배열 매개변수
- 함수에서 배열을 매개변수로 사용하려면
( )(괄호)
안에서 매개변수 이름 뒤에[ ](대괄호)
를 붙이거나 매개변수를 포인터로 지정해줍니다.
- 대괄호를 포인터로 지정하기
반환값자료형 함수이름(자료형 매개변수[]){
}
반환값자료형 함수이름(자료형 *매개변수){
}
#include <stdio.h>
void printArray(int arr[], int count){ // 배열의 포인터와 개수를 받음
for(int i=0; i<count; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
int main(){
int numArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printArray(numArr, sizeof(numArr) / sizeof(int)); // 배열과 요소의 개수를 넣음
return 0;
}
# 실행 결과
1 2 3 4 5 6 7 8 9 10
- 함수에서 배열을 매개변수로 사용할 때는 매개변수 이름 뒤에
[ ]
만 붙이면 된다.(대괄호 안에 크기를 지정하더라도 무시된다.) - 즉
arr[ ]
은 배열의 메모리 주소를 담고 있는 포인터이며 배열의 실제크기를 알 수 없으므로 다른 매개변수를 통해 배열의 크기를 받아야 한다. - 요소의 개수를 구할 때는
sizeof(배열)/sizeof(자료형)
이다. 배열의 크기인 10을 그대로 넣어도 되지만sizeof
로 크기를 구하면 배열의 크기가 바뀌었을 때 코드를 수정하지 않아도 된다. - 매개변수를
arr[ ]
과 같이 지정했다면 arr은 포인터이다. 따라서 다음과 같이 함수 안에서 매개변수로 받은 배열의 요소를 변경하면 함수 바깥에 있는 배열의 요소가 바뀌게 된다.
#include <stdio.h>
void setElement(int arr[]){ // 배열의 포인터를 받음
arr[2] = 300; // 매개변수로 받은 배열의 요소를 변경
}
int main(){
int numArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
setElement(numArr); // 배열을 넣어줌
printf("%d\n", numArr[2]); // 300 : setElement에서 변경한 값이 출력된다.
return 0;
}
# 실행 결과
300
- setElement 함수 안에서 arr[2]에 저장했음. 배열의 메모리 주소를 전달했기 때문에 실제로는 바깥에 있는 배열의 요소가 바뀌었다.
- 이번에는 대괄호 없이 매개변수로 포인터를 지정해보겠다.
#include <stdio.h>
void printArray(int *arr, int count){ // 매개변수를 포인터로 지정하여 배열을 받음
for(int i=0; i<count; i++){
printf("%d ", arr[i]);
}
}
int main(){
int numArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printArray(numArr, sizeof(numArr)/sizeof(int)); // 배열과 요소의 개수를 넣음
return 0;
}
# 실행 결과
1 2 3 4 5 6 7 8 9 10
- 1차원 배열은
int *arr
과 같이 int형 포인터로 받을 수 있다. 물론 포인터로는 배열의 크기를 알 수 없으므로 다른 매개변수를 통해 배열의 크기를 받는다. - 여기서도 arr은 포인터이므로 함수안에서 배열의 요소를 변경하면 함수 바깥에 있는 배열의 요소가 바뀌게 된다. 이러한 특성을 이용해 이번에는 배열에서 특정 요소의 값을 서로 바꿔보겠따.
#include <stdio.h>
void swapElement(int arr[], int first, int second){
int temp;
temp = arr[first];
arr[first] = arr[second];
arr[second] = temp;
}
int main(){
int numArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
swapElement(numArr, 0, 1); // 배열과 값을 서로 바꿀인덱스를 넣음
printf("%d %d\n", numArr[0], numArr[1]); // 2 1 : swapElement에 의해 배열 요소의 값이 서로 바뀜
return 0;
}
# 실행 결과
2 1
> 복합리터럴 사용하기
함수에 배열을 넘겨줄 때 복합 리터럴을 사용하면 배열을 따로 선언하지 않아도 된다.(복합리터럴은 C99에 추가된 기능)
(자료형[ ]) { val1, val2, val3 }
(자료형[크기]) { val1, val2, val3 }
#include <stdio.h>
void printArray(int arr[], int count){
for(int i=0; i<count; i++){
printf("%d ", arr[i]);
}
}
int main(){
// 복합 리터럴 방식으로 배열을 넘겨준디
printArray((int[]) {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 10);
return 0;
}
> 함수의 배열 매개변수에서 요소의 최소 개수 지정하기
함수에 배열 매개변수에 static과 숫자를 사용하면 요소의 최소 개수를 지정할 수 있다. 이렇게 하면 매개변수로 들어온 배열의 요소 개수가 지정된 개수보다 작을 때 경고가 발생한다.
VS2015
에서는 사용할수 없으며,GCC
,Clang
에서만 지원한다.
반환값자료형 함수이름 (자료형 매개변수[static 최소개수]){
}
#incldue <stdio.h>
void printArray(int arr[static 5], int count){ // 배열 요소의 최소 개수를 5개로 지정
for(int i=0; i<count; i++){
printf("%d ", arr[i]);
}
}
int main(){
int numArr1[5] = { 1, 2, 3, 4, 5 };
// 요소 개수가 5개이므로 OK
printArray(numArr1, sizeof(numArr1)/sizeof(int));
int numArr2[3] = { 1, 2, 3 };
// 요소 개수가 3개이므로 경고
printArray(numArr2, sizeof(numArr1)/sizeof(int));
return 0;
}
2차원배열 매개변수
- 함수에서 2차원배열을 매개변수로 사용하려면
( )(괄호)
안에서 매개변수 이름뒤에[ ][가로크기](대괄호)
를 두 개 붙이고 가로크기를 지정하거나 괄호로 묶은 포인터 뒤에[ ]
를 붙이고 가로크기를 지정한다.
반환값자료형 함수이름(자료형 매개변수[][가로크기]){
}
반환값자료형 함수이름(자료형 (*매개변수)[가로크기]){
}
#include <stdio.h>
void print2DArray(int arr[][5], int col, int row){
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main(){
int numArr[2][5] = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9 ,10 }
};
int col = sizeof(numArr[0])/sizeof(int); // 5 : 2차원 배열의 가로크기를 구할 때는 가로 한줄을 요소의 크기로 나눠줌
int row = sizeof(numArr)/sizeof(numArr[0]); // 2 : 2차원 배열의 세로크기를 구할 때는 배열이 차지하는 공간을 가로한줄의 크기로 나눠줌
print2DArray(numArr, col, row);
return 0;
}
# 실행 결과
1 2 3 4 5
6 7 8 9 10
- 함수에서 2차원배열을 매개변수로 사용때는 매개변수 이름 뒤에
[ ]
를 두 개 붙이고 두번째 대괄호에는 배열의 가로크기를 지정해야 한다. - 즉,
arr[5]
는 2차원 배열의 메모리 주소를 담고 있는 포인터이며 2차원 배열의 실제 크기를 알 수 없으므로 다른 매개변수로 배열의 가로, 세로 크기를 받아야 한다. - 여기서 가로 크기를 구할 때는 가로한주을 요소(자료형)의 크기로 나누면 되고, 세로 크기를 구할 때는 배열이 차지하는 공감을 가로 한줄의 크기로 나눠주면 된다.
- 1차원배열과 마찬가지로 대괄호 대신 포인터로 2차원배열을 지정할 수 도 있으며 복합리터럴 사용이 가능하다.
반응형
'프로그래밍 언어 > [ C ]' 카테고리의 다른 글
[ C ] 13. 함수 포인터 배열 활용하기 (0) | 2020.08.14 |
---|---|
[ C ] 12. 함수와 가변인자 (0) | 2020.08.14 |
[ C ] 10. 함수와 포인터 (1) | 2020.08.14 |
[ C ] 09. 전처리기 ( if, ifdef, elif, ifndef, define, endif ) (0) | 2020.08.14 |
[ C ] 08. 구조체 (0) | 2020.08.13 |