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
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
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 |