자료실/C언어

C언어 - 배열

자료수집중 2020. 6. 23.
반응형

배열을 동일한 자료형의 데이터를 여러 개 저장할 수 있는 방법입니다.

보통의 변수는 1개의 값만 저장이 가능하기 때문에 다수의 데이터를 저장하기 위해서 배열이 필요합니다.

 

 

배열은 기본형은 

//자료형 이름[배열 크기]
//ex)
int array[10];  //10개의 정수를 저장할 수 있는 배열

자료형 이름[배열 크기]가 필요합니다. 배열 크기는 항상 상수를 사용해야 합니다.

 

배열도 초기화를 해야 합니다. 

// {}를 사용해서 초기화 
int array[10] = { 0 }; // 모두 0으로 초기화
int array[10] = { 1,2,3,4,5,6,7,8,9,10 }; // 배열을 크기 만큼 값을 입력하여 초기화

초기값도 다양한 방법으로 입력할 수 있습니다.

 

배열을 반복문에서 사용할 때 인덱스를 넘어가는 일이 발생하면 에러가 발생합니다.

int array[10]는 사용할 수 있는 인덱스의 범위가 0~9입니다. array [10] 사용할 수 없습니다.

그렇기 때문에 배열의 크기를 구할 수 있어야 합니다.

 

예제를 보면 for문을 사용할 때 만약 배열의 크기가 변한다면 변할 때마다 새롭게 for문의 조건을 변경해야 합니다. 왜냐하면 인덱스를 넘어갈 수도 있도 덜 사용할 수도 있기 때문입니다.

그래서 배열의 크기만 변경해도 자동으로 계산하거나 입력되게 변경해보겠습니다.

먼저 sizeof()를 이용하면

배열을 sizeof(배열 이름)하면 전체의 크기가 나옵니다. 그래서 배열이  sizeof(선언된 자료형)으로 나눠주거나 sizeof(배열 이름[0])만 사용해서 나눠줍니다. 그러면 배열의 크기가 나옵니다.

 

또는 전처리기에서 #define 매크로를 사용합니다.

#define 이름 값  // ;(세미콜론)을 붙이지 않습니다

#define도 전처리기중 하나로 컴파일 이전에 실행됩니다.

코드 내에 매크로 이름으로 적혀있는 걸 해당 값으로 전부 변경해줍니다.

만약 배열의 크기를 변경해야 한다면 매크로 값만 변경하면 되는 거죠.

 

지금까지 배열은 1차원의 배열이었습니다.

배열은 다차원이 가능합니다.

위에서의 배열들은 일열로 쭉 늘어선거라면 2차원 3차원~~~n차원은 다른 모형을 가집니다.

보통은 3차까지 정도의 배열을 많이 사용합니다.

2차 3차 배열의 초기화는

2차원은 행 열로 생각하면서 초기화를 구성하면 쉽습니다.

3차원은 면 -> 행 -> 열 처럼 생각하면 됩니다.

int main(void) {
    //2차
    int array_1[5][3] = { { 1,2,3 }, 
                          { 1,2,3 },
                          { 1,2,3 },
                          { 1,2,3 },
                          { 1,2,3 } };

    //3차
    int array2[4][5][3] = 
    {
    { { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
    { { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
    { { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } },
    { { 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 },{ 1,2,3 } }
    };	
}

for문을 이용해서도 가능합니다.

int array2[4][5][3];
for (int i = 0; i < 4; i++) {
	for (int j = 0; j < 5; j++) {
		for (int k = 0; k < 3; k++){
			array2[i][j][k] = 0;
        }
    }
}

 

배열도 함수의 매개변수로 받을 수 있습니다. 대신 일반 변수랑은 의미가 다릅니다.

원래 변수는 값 자체만 전달했지만, 배열은 원본이 넘어간다고 생각하면 됩니다.

원래 변수는 main()에서 인자로 넘겨주고 함수 내에서 매개변수에 아무리 값을 대입해도 main()의 변수는 값이 변하지 않습니다. 하지만 아래 코드의 결과를 보면

#include <stdio.h>

#define ARRAY_SIZE 10

void fun_1(int a[]);

int main(void) {
	int array[ARRAY_SIZE] = { 1,2,3,4,5,6,7,8,9,10 };

	fun_1(array);

	for (int i = 0; i < ARRAY_SIZE; i++) {
		printf("main 출력 : %d \n", array[i]);
	}
}

void fun_1(int a[]) {
	for (int i = 0; i < ARRAY_SIZE; i++) {
		a[i] = i + 10;
	}
	for (int i = 0; i < ARRAY_SIZE; i++) {
		printf("fun_1 함수 출력 : %d \n", a[i]);
	}
	printf("\n\n");
}

fun_1()에서 변경된 배열의 값이 main()에도 출력되는 모습을 볼 수 있습니다.

배열은 인자로 전달받은 함수가 값을 변경이 가능합니다. 포인터로 변수를 받던것과 비슷합니다.

그래서 배열도 포인터형식으로 받을 수 있습니다.

void fun_1(int* a[])

만약 변경이 안되게 하고 싶다면

void fun_1(const int a[])

const를 배열 매개변수 앞에 붙여주면 됩니다. const를 앞에 붙이게 되면 상수로 취급하게 됩니다.

const를 붙인 배열 매개변수를 해당 함수 내에서 수정하려 하면 에러가 발생합니다.

대신 포인터로 받은 매개변수에는 const가소용이 없습니다.

 

2차원과 3차원배열도 매개변수로 받을 수 있습니다.

2차원은 첫번째 크기는 [] 또는 포인터로 선언하지만 두번째는 받는 배열의 크기가 입력되야 합니다.

void fun_2(int a[][3])
void fun_1(int (*a)[3])

3차원도 마찬가지입니다.

첫번째 크기는 [] 또는 포인터로 선언하지만 나머지 크기는 받는 배열의 크기가 입력되야 합니다.

void fun_2(int a[][3][4])
void fun_1(int (*a)[3][4])

'자료실 > C언어' 카테고리의 다른 글

C언어 - 문자열  (0) 2020.06.29
C언어 - 구조체  (0) 2020.06.27
C언어 - 변수의 생존기간과 저장 유형 지정자  (0) 2020.06.22
C언어 - 지역변수, 전역변수  (0) 2020.06.22
C언어 - 함수(function)  (0) 2020.06.18

댓글