C 함수 매개변수 배열 - sonkoni/Koni-Wiki GitHub Wiki
컴파일러 내부에서는 매개변수로 받는 배열형태가 포인터형태로 바뀐다. 그래서 둘 다 똑같다. 그냥 편의상 배열이라고 표시하기 위해 배열형식을 쓰는 것이다.
#include <stdio.h>
// 배열 매개변수에 배열 넣기. 갯수도 함께 받아야 함.
void printArray(int arr[], int count) {
for (int i = 0; i < count; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 포인터 매개변수에 배열 넣기. 갯수도 함께 받아야 함.
void printArrPtr(int *arr, int count) {
for (int i = 0; i < count; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main(int argc, char *argv[]) {
int numArr[] = {1, 2, 3, 4, 5};
int count = sizeof(numArr) / sizeof(int);
printArray(numArr, count);
printArrPtr(numArr, count);
return 0;
}
// 1 2 3 4 5
// 1 2 3 4 5#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 argc, char *argv[]) {
int numArr[] = {1, 2, 3, 4, 5};
printArray((int[]){1, 2, 3, 4, 5}, 5);
// ====================== ==
// 리터럴배열 갯수
return 0;
}
// 1 2 3 4 5매개변수로 받은 배열을 변경하면 원본도 변경된다.
#include <stdio.h>
void setElement(int arr[]) {
arr[0] *= 10;
arr[1] *= 20;
}
int main(int argc, char *argv[]) {
int numArr[] = {1, 2, 3, 4, 5};
setElement(numArr);
printf("%d %d\n", numArr[0], numArr[1]);
return 0;
}
// 10 40#include <stdio.h>
void swapElement(int arr[], int firstIdx, int secondIdx) {
int temp = arr[firstIdx];
arr[firstIdx] = arr[secondIdx];
arr[secondIdx] = temp;
}
int main(int argc, char *argv[]) {
int numArr[] = {1, 2, 3, 4, 5};
int count = sizeof(numArr) / sizeof(int);
swapElement(numArr, 1, 2); // 1번 인덱스와 2번 인덱스 값을 서로 바꾸겠다.
for (int i = 0; i < count; i++) {
printf("%d ", numArr[i]);
}
return 0;
}배열 매개변수 선언에서 static 으로 갯수를 지정한다. 만약 이보다 적으면 컴파일러 경고가 뜬다.
자료형 배열이름[static 최소갯수]
#include <stdio.h>
void printArray(int arr[static 5], int count) {
for (int i = 0; i < count; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main(int argc, char *argv[]) {
int numArr[] = {1, 2, 3, 4};
int count = sizeof(numArr) / sizeof(int);
printArray(numArr, count); // 컴파일러 경고 발생. 함수에서 최소 5개 이상의 배열을 요구하기 때문.
return 0;
}매개변수로 2차원 배열을 쓰려면 아래처럼 하면 된다. 세로 갯수는 쓰더라도 무시한다.
2차원 배열읠 실제 크기를 알 수 없으므로, 다른 매개변수로 배열의 가로와 세로 크기를 받아야 한다.
자료형 배열이름[][가로갯수]
자료형 (배열포인터)[가로갯수]
예시
void printArray(int arr[][4], int col, int row) {...}
void printArrPtr(int (*arr)[4], int col, int row) {...}
#include <stdio.h>
void printArray(int arr[][4], int col, int row) {
// ============
for (int i = 0; i < row; i++) {
printf("a: => ");
for (int j = 0; j < col; j++) {
printf("%2d ", arr[i][j]);
}
printf("\n");
}
}
void printArrPtr(int (*arr)[4], int col, int row) {
// =============
for (int i = 0; i < row; i++) {
printf("b: => ");
for (int j = 0; j < col; j++) {
printf("%2d ", arr[i][j]);
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
int numArr[2][4] = {{1, 2, 3, 4},
{11, 22, 33, 44}};
int colCount = sizeof(numArr[0]) / sizeof(int); // 가로 한줄을 자료형 크기로 나누면 칼럼 갯수가 나옴
int rowCount = sizeof(numArr) / sizeof(numArr[0]); // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눔
printArray(numArr, colCount, rowCount);
printArrPtr(numArr, colCount, rowCount);
return 0;
}
// a: => 1 2 3 4
// a: => 11 22 33 44
// b: => 1 2 3 4
// b: => 11 22 33 44 (자료형[][가로]){{값, 값}, {값, 값}}
(자료형[세로][가로]){{값, 값}, {값, 값}}
#include <stdio.h>
void printArray(int arr[][4], int col, int row) {
for (int i = 0; i < row; i++) {
printf("a: => ");
for (int j = 0; j < col; j++) {
printf("%2d ", arr[i][j]);
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
printArray((int[][4]){{1, 2, 3, 4}, {5, 6 ,7, 8}}, 4, 2);
return 0;
}
// a: => 1 2 3 4
// a: => 5 6 7 8