IoT Embeded 강의

1차원 배열

rtmstm 2022. 2. 14. 11:55

#배열

변수 선언을 하면 메모리 안에는 자료형에 맞게 메모리 공간이 잡히게 됩니다(메모리 할당). int a;라고 선언하면 메모리 안에는 a라는 이름을 가진 4byte의 메모리 공간이 지정되고 이제 여기에 데이터들을 넣을 수 있게 됩니다. 변수 여러개를 다뤄야 한다면 변수를 여러번 선언해도 되지만 배열을 이용해 한번에 메모리 공간을 지정할 수 있습니다. 만약 배열에 5개의 정수를 담고 싶다면 메모리는 4byte x 5 인 20byte의 메모리 공간을 할당할 수 있으며 배열에 번호를 매겨 5개의 공간에 각각 데이터를 담을 수 있습니다. 정리하자면 배열은 메모리의 연속된 공간에 동일한 데이터 타입의 변수가 정해진 개수만큼 연속해 있는것입니다.

 

배열의 선언은 다음과 같습니다.

int array [5] = {1,2,3,4,5};

int  라는 것은 각 원소가 int형 자료형을 가진다는 의미입니다. array는 배열 이름이며 이 단어는 배열의 주소를 의미합니다. 브래킷(Bracket)[] 안에는 배열의 길이, 크기, 사이즈를 입력합니다. 원소가 5개면 배열의 크기는 5 입니다. 현재 array라는 배열 안에는 1,2,3,4,5 라는 데이터가 각각 들어가 있습니다. 기억해야할 점은 배열의 크기는 한번 선언하면 프로그램 동작 중 바꿀 수 없다는 점입니다.

 

배열을 메모리 공간 위에서 그려보겠습니다. 다음은 int형 변수와 배열을 각각 선언한 것입니다.

int a =2;

int Array1[4] = {1,2,3,4};

int Array2[4] = {1,2,3,4};

메모리 공간 위에 int형 배열 선언 시 int형 메모리 공간이 배열의 크기(원소의 개수)만큼 할당됩니다. 그림과 같이 메모리에 연속적으로 4byte가 여러개 할당됩니다. 여기서 배열의 첫번째 주소(Add)부터 다음 원소까지 주소가 커지는 것을 보면 자료형의 크기만큼 커지는 것을 알 수 있습니다.(Add : 1000 , 1004, 1008...) 각 원소에는 정수형, 실수형 외에도 문자형을 넣어 하나의 단어가 되도록 '문자열'을 만들 수 있습니다.

 

변수의 선언 방법은 여러가지가 있습니다.

 

1) int array[5] = {1,2,3,4,5};

배열 사이즈를 직접 작성해주는 방법

 

2) int array[] = {1,2,3,4,5};

배열의 사이즈를 작성하지 않으면 초기화하는 원소의 개수만큼 배열 사이즈가 지정됩니다.

 

3) int array[5] = {1,2};

배열의 사이즈보다 원소의 개수가 작으면 나머지 공간에는 '0'이 대입됩니다.

 

4) int array[5] = {0};
모든 배열의 원소에 '0'을 대입합니다.

 

5) int array[SIZE] = {1,2,3,4,5};

SIZE 라는 기호상수를 정의한 후 그것을 브래킷 안에 작성

 

여기서 주의할 점은 배열의 크기보다 많은 데이터를 넣지 않아야 한다는 것입니다. 배열의 크기는 '3'이라 하면 위와 같이 정수는 3개가 들어갈 수 있습니다. 만일 그 이상으로 초기값을 입력하면 '이니셜라이저가 너무 많습니다.','이니셜라이저 값이 너무 많습니다.' 라는 컴파일 오류 메세지가 나옵니다.

#for 반복문을 이용한 배열 원소 출력 및 입력

배열은 원소가 순차적으로 있기 때문에 반복분을 이용하여 배열을 효율적으로 다룰 수 있습니다. 아래 예제들을 통해 알아보겠습니다.

 

1. 배열의 원소 출력과 합계, 평균 출력

 

void main()
{
int a[5] = { 1,2,3,4,5};
int b[] = { 10,20,30,40,50 };
int sum = 0;
int sum2 = 0;
double ave = 0;
double ave2 = 0;
for (int i = 0; i < 5; i++) //배열의 원소를 반복문을 이용해 출력, 합계에 더해가는 과정
{
printf("a[%d] = %d\n", i, a[i]); // 원소 번호는 i, 원소 값은 a[i]: a[0]은 배열의 첫번째 원소 a[1]은 두번째 원소를 의미합니다.
sum += a[i];
}
ave = (double)sum/5; // 평균값 계산 ,더블형으로 캐스트
printf("\n");
for (int i = 0; i < 5; i++)//배열의 원소를 반복문을 이용해 출력, 합계에 더해가는 과정
{
printf("b[%d] = %d\n", i, b[i]); // 원소 번호는 i, 원소 값은 b[i]
sum2 += b[i];
}
ave2 = (double)sum2 / 5;// 평균값 계산 ,더블형으로 캐스트 해주기!
printf("\n");

printf("a:합계 = %d, 평균 =  %0.2f \n", sum, ave);
printf("b:합계 = %d, 평균 =  %0.2f \n", sum2, ave2);

 

}

2. 2개 배열의 합계

void main()

{

int arr1[SIZE] = { 12, 32 ,76 ,51 ,49 };
int arr2[SIZE] = {34,56,29,54,21};
int arr3[SIZE] = {0};
printf("arr1 \t+\tarr2\t=\tarr3\n");
printf("--------------------------------------\n");
for (int i = 0; i < SIZE; i++)
{
arr3[i] = arr1[i] + arr2[i];
printf("%d\t+\t%d\t=\t%d\n", arr1[i], arr2[i], arr3[i]);
}

}

 

3. 입력받은 값에서 짝수와 홀수를 구분하여 합계를 계산하고 0을 입력하면 종료

 

void main()

{

int total[2] = { 0 };
int input;
do
{
printf("숫자입력:");
scanf_s("%d", &input);

total[input % 2] += input;

} while (input != 0); //입력값이 0 이면 break;
printf("짝수의 합 = %d, 홀수의 합= %d", total[0], total[1]);
}