728x90

데이터 유형에 따른 사용

  • 상수(constants) : 고정된 값을 사용
  • 변수(variable) : 모든 데이터를 각각 독립적으로 사용
  • 배열(array) : 동일한 데이터 타입의 변수를 묶어서 사용
  • 구조체(struct) : 서로 다른 데이터 타입의 변수를 묶어 사용
  • 포인터(pointer) : 메모리에 직접 접근하여 사용

 

배열(Array)

: 같은 타입의 변수들로 이루어진 유한 집합

 

  • 선언 형식에 따라 n차원 배열 구성 가능

int score[5]; //1차원 배열
int score[3][5]; //2차원 배열
int score[2][3][5] //3차원 배열

  • 요소(element) : 배열을 구성하는 각각의 값 (=원소)
  • 인덱스(index) : 배열에서의 위치를 가리키는 값

💡 배열의 인덱스는 0부터 시작하며 범위는 0을 포함한 양의 정수이다.

 

배열의 필요성

동일한 범주로 데이터를 사용할 때 무분별한 변수의 선언 및 사용을 방지하기 위해 사용한다.

 

배열 선언

int score[10]; //자료형 배열 이름[요소의 개수]
// 인덱스 범위 : 0 ~ 9

💡 요소의 개수는 맨 마지막 인덱스 값 + 1 이다!

 

배열 요소의 접근

score[5] = 80;
score[1] = score[1];
score[i] = 100; // 인덱스 값을 변수로 사용 가능
score[i+2] = 100; // 인덱스 값으로 수식 사용 가능
score[index[3]] = 100; // 인덱스 값으로 다른 배열의 값 사용 가능

🌟 인덱스 값이 배열의 크기를 벗어나게 되면 오류가 발생한다.
인덱스 범위 내에서만 원소 값에 접근할 수 있도록 유의해야 한다.

 

Ex1. 각각 지정하여 배열 원소 저장하기
score[5] = 80;
score[1] = score[1];
score[i] = 100; // 인덱스 값을 변수로 사용 가능
score[i+2] = 100; // 인덱스 값으로 수식 사용 가능
score[index[3]] = 100; // 인덱스 값으로 다른 배열의 값 사용 가능

 

Ex2. 반복문 사용하여 배열 원소 저장하기
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int score[5];

	for (int i = 0; i < sizeof(score) / sizeof(int); i++)
		score[i] = rand() % 100; // 난수 값 원소로 저장

	for (int i = 0; i < sizeof(score) / sizeof(int); i++)
		printf("score[%d] = %d\n", i, score[i]);
	
	return 0;
}

 

Ex3. 사용자 입력 값 받아 배열 원소 저장하기
#include <stdio.h>

int main(void)
{
	int score[5];

	for (int i = 0; i < sizeof(score) / sizeof(int); i++){
		printf("%d번 학생의 성적을 입력하시오.\n", i + 1);
		scanf("%d", &score[i]);
	}

	for (int i = 0; i < sizeof(score) / 4; i++)
		printf("score[%d] = %d\n", i, score[i]);
	
	return 0;
}

 

배열의 초기화

  • 배열 원소 각각 초기화
int score[5] = {10, 20, 30, 40, 50};
#include <stdio.h>

int main(void)
{
	int score[5] = {10, 20, 30, 40, 50};

	for (int i = 0; i < sizeof(score) / sizeof(int); i++)
		printf("score[%d] = %d\n", i, score[i]);
	
	return 0;
}

  • 배열 원소 일부만 초기화
int score[5] = {10, 20, 30}; 
// 일부만 초기화하게 되면 나머지 원소들은 0으로 자동 초기화 됨
#include <stdio.h>

int main(void)
{
	int score[5] = {10, 20, 30};

	for (int i = 0; i < sizeof(score) / sizeof(int); i++)
		printf("score[%d] = %d\n", i, score[i]);
	
	return 0;
}

  • 배열 크기 미지정
int score[] = {10, 20, 30, 40, 50};
// 배열의 크기를 지정해주지 않으면 초기값의 개수가 배열의 크기가 됨
#include <stdio.h>

int main(void)
{
	int score[] = {10, 20, 30, 40, 50};

	for (int i = 0; i < sizeof(score) / sizeof(int); i++)
		printf("score[%d] = %d\n", i, score[i]);
	
	return 0;
}

 

배열의 복사와 비교

  • 원소값 하나하나에 대해 일일히 비교해야 한다.
    └ 배열 통째로 복사나 비교 불가능

 

Ex4. 배열의 복사
#include <stdio.h>

int main(void)
{
	int i;
	int score1[5] = {10, 20, 30, 40, 50};
	int score2[5];

	for (i = 0; i < sizeof(score1) / sizeof(int); i++)
		score2[i] = score1[i];

	for (i = 0; i < sizeof(score1) / sizeof(int); i++)
		printf("score1[%d] = %d\n", i, score1[i]);
	
	for (i = 0; i < sizeof(score1) / sizeof(int); i++)
		printf("score2[%d] = %d\n", i, score2[i]);
	
	return 0;
}

 

Ex5. 배열의 비교
#include <stdio.h>

int main(void)
{
	int score1[5] = {10, 20, 30, 40, 50};
	int score2[5] = {50, 60, 70, 80, 90};

	for (int i = 0; i < sizeof(score1) / sizeof(int); i++){
		if (score1[i] != score2[i]){
			printf("배열 score1과 배열 score2는 같지 않습니다.\n");
			return 0;
		}
	}

	printf("배열 score1과 배열 score2는 같습니다.\n");
	
	return 0;
}

 

Ex6. 난수 배열의 최소값, 최대값 찾기 (범위 1~100)
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int Number[10], MIN, MAX;

	for (int i = 0; i < sizeof(Number) / sizeof(int); i++){
		Number[i] = (rand() % 100) + 1;
		// rand() 범위가 0부터 시작하므로 1을 더해줌
		printf("Number[%d] = %d\n", i, Number[i]);
	}
	
	MIN = MAX = Number[0];
	
	for (int i = 0; i < sizeof(Number) / sizeof(int); i++) {
		MIN = Number[i] < MIN ? Number[i] : MIN;
		MAX = Number[i] > MAX ? Number[i] : MAX;
	}

	printf("Number's MIN : %d\n", MIN);
	printf("Number's MAX : %d\n", MAX);
	
	return 0;
}

 

Ex7. 난수 배열 정렬하기 (범위 1~100)
#include <stdio.h>
#include <stdlib.h>

void Sorting_Array(int *array, int array_size){
	int temp;
	for (int i = 0; i < array_size; i++){
		for (int j = i + 1; j < array_size; j++){
			if (array[i] > array[j]){
				temp = array[i];
				array[i] = array[j];
				array[j] = temp;
			}
		}
	}
}

int main(void)
{
	int Number[10], sum = 0;

	printf("[정렬 전 배열 값]\n");
	for (int i = 0; i < sizeof(Number) / sizeof(int); i++){
		Number[i] = (rand() % 100) + 1; 
		printf("Number[%d] = %d\n", i, Number[i]);
		sum += Number[i];
	}

	Sorting_Array(Number, sizeof(Number) / sizeof(int));

	printf("\n[정렬 후 배열 값]\n");
	for (int i = 0; i < sizeof(Number) / sizeof(int); i++){
		printf("Number[%d] = %d\n", i, Number[i]);
	}
	printf("배열 Number의 합계 : %d\n", sum);
	printf("배열 Number의 평균 : %d\n", sum / (sizeof(Number) / sizeof(int)));
	
	return 0;
}

💡 매개 변수로 배열 사용 시, 값이 아닌 주소값이 전달된다.
(Call by reference)

원본 배열의 변경을 금지하는 방법(Const)
const 키워드를 사용한다.

void Edit_Array (const int a[])
{
    ...
    a[0] = 100; // 컴파일 오류 발생
}

 

 

 

💡 함수의 매개 변수로 배열을 넘겨주었을 때, 함수에서 sizeof() 를 이용하여 배열을 크기를 구하면 배열을 포인터형 변수로 취급하여 무조건 포인터의 크기(4바이트)로 반환한다.

∴ 배열의 크기도 매개 변수로 넘겨주는 방식을 사용한다!
└ (위의 코드에선 array_size 로 구현함)

728x90

 

 

 

 


 

 

 

 

배열

데이터 유형에 따른 사용

www.notion.so

 

아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

 

C 언어 이론 정리

조건문, 반복문 사용 시 중괄호로 명령문들 묶어주기 - 명령문 1개일 때 포함 (코드 수정 시 오류 방지)

www.notion.so

 


 

개발 환경

Visual Studio 2019
Visual Studio Code

작성 플랫폼

Notion

 

728x90

'🧑‍💻 Language > C·C++' 카테고리의 다른 글

[C 이론] 12. 포인터(2)  (0) 2021.06.01
[C 이론] 11. 포인터(1)  (0) 2021.06.01
[C 이론] 9. 함수와 변수  (0) 2021.05.13
[C 이론] 8. 함수  (0) 2021.05.06
[C 이론] 7. 반복문  (0) 2021.05.03