C

배열에 대하여!

오군_ 2023. 5. 12. 13:20
반응형
배열이란

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

 

배열에 데이터를 저장한다.

 

같은 데이터 타입을 가진 변수들이 여러개 필요할때 사용된다.

 

배열의 길이를 설정하면 수정이 불가하다.

 

인덱스로 배열의 요소(변수)들을 구분한다.

인덱스는 배열에 저장된 데이터를 참조한다.

인덱스로 배열의 변수들에 접근이 가능하다.

 

배열을 쓰는 이유

같은 타입의 이름만 다른 변수가 많이 필요할때

변수의 개수가 너무 많아져서 코드가 길어져서 가독성이 떨어지고

변수 이름이 많아지면 해당 변수를 추적하기도 쉽지 않다.

 

배열은 컴파일 타임에 메모리 사이즈가 정해진다.

 

배열의 구조

(데이터 타입) (배열명)[배열의 길이]

// int형 타입 배열, 길이는 30
int student[30];

배열은 인덱스로 요소(변수)에 접근할 수 있다. 

아래의 코드에서

1. char형 cArr[5] 배열은 char형 크기의 연속된 메모리 공간을 5byte를 할당

2. int형 iArr[5] 배열은 int형 크기의 연속된 메모리 공간을 20byte를 할당

char cArr[5]; //char 타입의 변수 5개 집합
int iArr[5]; // int 타입의 변수 5개 집합

printf("%d\n", sizeof(arr));		// 5바이트(5x1바이트)
printf("%d\n", sizeof(iArr));		// 20바이트(5x4바이트)

 

인덱스는 무조건 0부터 시작! 인덱스의 끝은 (배열의 길이 - 1)!!!!

 

선언에서 int st[5]이기에

틀린 예시 ) st[5] = 120;

인덱스가 5인 것까지 초기화 해줘야 할 것같지만

선언부에 5는 길이가 5인것을 뜻하기에 인덱스가 0~4까지의

공간까지에만 변수를 초기화할 수 있습니다.

int st[5];	// 선언하고

// 초기화
st[0] = 90;
st[1] = 10;
st[2] = 20;
st[3] = 50;
st[4] = 100;

printf("st[0]번째에 저장되어 있는 값 : %d\n", st[0]);		//결과값 : 90 출력
printf("st[1]번째에 저장되어 있는 값 : %d\n", st[1]);		//결과값 : 10 출력
printf("st[2]번째에 저장되어 있는 값 : %d\n", st[2]);		//결과값 : 20 출력
printf("st[3]번째에 저장되어 있는 값 : %d\n", st[3]);		//결과값 : 50 출력
printf("st[4]번째에 저장되어 있는 값 : %d\n", st[4]);		//결과값 : 100 출력

 

 

 

변수 선언, 초기화

아래의 방법에서는 배열의 길이를 넣지 않지만

내가 데이터의 길이를 알고 있다면 명시적으로 표현해주는게 좋다!

 

  • 배열 선언
  • 선언과 동시에 초기화
  • 길이정보 생략
  • 길이만큼 변수들을 초기화 하지 않는다 => 초기화 하지 않은 변수들은 0으로 초기화
int arr[5];	// 5개의 인덱스에 전부 쓰레기 값이 들어간다.

// 선언과 동시에 초기화
int iSt[5] = {1,2,3,4,5};


// 길이를 생략하고 초기화 하는 방법
int arrNum[] = {1,2,3};   // 길이는 자동으로 3이 된다.

// 길이만큼 변수들을 초기화하지 않으면 자동으로 0으로 초기화된다
int arrNum[5] = {1,2};

 

 

 

for문으로 배열의 변수에 접근하여 출력할 수 있다.

범위를 벗어나는 인덱스에 접근하면 쓰레기 값이 나온다.

int st[5];

st[0] = 10;
st[1] = 20;
st[2] = 30;
st[3] = 40;
st[4] = 50;

for(int i = 0; i < 5; i++)
	printf("%d\n, st[i]);		// 10, 20, 30, 40, 50 의 값이 순차적으로 출력된다.

for(int i = 0; i < 10; i++)
	printf("%d\n, st[i]);		// 10, 20, 30, 40, 50, 쓰레기값, ... , 쓰레기 값

 

인덱스의 값을 비교한다

int num[2] = {1,2};
int num1[2] = {1,3};

if(num[0] == num[1])
{
	printf("둘은 같다");
}

 

 

 

배열의 길이 구하는법

밑에 코드에서 arrLen은 5가 나온다.

sizeof(arr)은 배열요소들의 메모리크기의 합을 구해주고

sizeof(int)는 arr인덱스 하나의 메모리크기이다.

이 둘을 나누면 인덱스의 길이가 나오게 된다.

int arr[5] = {1, 2, 3, 4, 5}
int arrLen = 0;

// sizeof(arr) = 4byte x 5(인덱스의 길이) = 20
// sizeof(int) = 4byte
arrLen = sizeof(arr) / sizeof(int);		// arrLen = 5

 

 

 

배열 복잡도

O(n)(상수)     / 작을수록 좋다

.

반응형

 

반응형