C언어에서 배열을 사용하는 방법에 대해서 알아보겠습니다.
int grade[100];
int : 요소 타입
grade : 배열 명
[100] : 요소 개수
배열의 개수가 100개일 때, 배열의 인덱스는 0에서 99까지의 값을 가집니다.(즉 인덱스는 1이 아닌 0부터 시작합니다.)
배열 요소의 주소
C언어에서 배열은 연속된 메모리 공간에 존재합니다.
즉 요소끼리 서로 붙어 있으며, 따라서 int형 배열의 특정 인덱스번째 요소의 주소는 다음과 같이 구할 수 있습니다.
&grade[i] = &grade[0] + sizeof(int) * i
배열의 초기화
배열을 초기화 하는 방법은 다음과 같습니다.
#include <stdio.h>
int main(){
int grade1[4] = {1,2,3,4};
int grade2[ ] = {1,2,3,4};//알아서 크기 계산 (4)
int grade3[4] = {1,2};//나머지는 0으로
int grade4[4] = {0};//모두 0으로
}
배열 요소의 개수
배열 요소의 개수를 구하는 방법은 다음과 같습니다.
#include <stdio.h>
int main(){
int grade[] = {1,2,3,4,5};
int size_grade = sizeof(grade);
int num = sizeof(grade) / sizeof(grade[0]);
printf("%d\n", size_grade);
printf("%d\n", num);
}
배열에 대한 sizeof는 배열 속에 존재하는 원소들의 수 * sizeof(자료형)의 결과입니다.
따라서 배열 요소의 개수는 다음과 같이 구합니다.
요소의 개수 = 배열 전체의 크기 / 첫 요소의 크기(혹은 자료형의 크기)
= sizeof(배열이름) / sizeof(배열이름[0])
= sizeof(배열이름) / sizeof(자료형)
함수의 배열은 사실 배열이 아니다.
이후 배울 것이지만, 함수는 배열을 받지 못합니다.
함수가 받는 것은 배열이 아닌 포인터입니다.
#include <stdio.h>
#include <stdlib.h>
int a;
void aa(int arr[100], int * ptr){
printf("배열 : %lu\n", sizeof(arr));
printf("포인터 : %lu\n", sizeof(ptr));
}
int main() {
int arr[100]={10};
int * ptr;
printf("배열 : %lu\n", sizeof(arr));
printf("포인터 : %lu\n", sizeof(ptr));
aa(arr, ptr);
}
결과가 예상되시나요?
다음과 같습니다.
배열 : 400
포인터 : 8 (32비트 운영체제일 경우 4)
배열 : 8
포인터 : 8
위와 같이 함수는 사실 포인터를 받는 것이지만, 배열을 사용하는 것은 좀 더 명확하고 간편하기에 자주 사용됩니다.
함수에서 배열을 사용하기 위해서는 다음과 같이 코드를 작성합니다.
#include <stdio.h>
void printArray(int arr[], int count);
int main(){
int grade[] = {1,2,3,4,5};
printArray(grade, sizeof(grade) / sizeof(grade[0]));
}
void printArray(int arr[], int count) // 배열의 포인터와 요소의 개수를 받음
{
for (int i = 0; i < count; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
함수에서는 배열의 크기를 확인할 수 있는 방법이 없기 때문에, 위와 같이 배열의 개수인 count를 같이 넘겨주는 식으로 코드를 작성합니다.
2차원 배열
2차원 배열은 배열은 다음과 같이 사용합니다.
int id_age[100][100];
자료형 배열이름[세로(row)크기][가로크기(column)];
자료형 배열이름[세로(row)크기][가로크기(column)] = {{값, 값, 값}, {값, 값, 값}};
int numArr[3][4] = {
{ 가로 요소 4개 },
{ 가로 요소 4개 },
{ 가로 요소 4개 }
}; // ↑ 세로 3줄
2차원 배열을 함수에서 사용
2차원 배열을 함수에서 사용하기 위해서는 2차원 배열의 가로크기와, row, column의 크기를 매개변수로 넘겨주어야 합니다.
다음은 사용 예시입니다.
#include <stdio.h>
void printArray(int arr[][5], int row, int col);
int main(){
int grade[2][5] = {{1,2,3,4,5} , {6,7,8,9,10}};
int col = sizeof(grade[0])/ sizeof(grade[0][0]);
//int col = sizeof(grade[0])/ sizeof(int);
int row = sizeof(grade)/ sizeof(grade[0]);
printArray(grade, row, col);
}
void printArray(int arr[][5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
}
printf("\n");
}
다차원 배열에서도 마찬가지로 함수에서는 배열을 포인터로 인식합니다.
#include <stdio.h>
void aa(int arr [10][100], int * ptr){
printf("배열 : %lu\n", sizeof(arr));
printf("포인터 : %lu\n", sizeof(ptr));
}
int main() {
int arr[10][100]={{10}};
int * ptr;
printf("배열 : %lu\n", sizeof(arr));
printf("포인터 : %lu\n", sizeof(ptr));
aa(arr, ptr);
}
위의 코드는 컴파일하면 다음과 같은 메세지를 띄워줍니다.
warning: sizeof on array function parameter will return size of 'int (*)[100]' instead of 'int [10][100]' [-Wsizeof-array-argument]
즉 함수는 int(*)[100]을 받아야 하는데, 전달한 것은 int[10][100]이라고 경고를 보내줍니다.
이때 등장한 int(*)[100]는 이후 배울 배열의 포인터입니다.
'c언어' 카테고리의 다른 글
[C언어] - 포인터 (0) | 2022.04.19 |
---|---|
[C언어] - 문자열 (0) | 2022.04.19 |
[C언어] - 재귀함수 (0) | 2022.04.19 |
[C언어] - register, volatile 키워드 (0) | 2022.04.19 |
[C언어] - 스택프레임 (0) | 2022.04.19 |