배열

강효림·2022년 8월 15일
0

혼공C

목록 보기
7/8

알면 쉬운데 모르면 죽을만큼 어렵다는 배열을 오늘 도전해봅니다~~

배열이란

같은 형태의 많은 데이터를 반복문으로 처리하기 위해서 메모리에 연속적으로 저장하고 사용하는 방법

배열은 선언을 통해서 저장공간을 확보합니다.
저장공간의 개수와 관계없이 이름은 단 하나입니다.

배열선언하는 법

  1. 요소의 자료형에 이름을 붙인다.
  2. 필요한 요소의 개수를 대괄호안에 표시한다.

자료형 배열명[요소개수]

변수와 배열의 차이점

변수는 각각 선언하고 각각 초기화한다.
배열은 하나의 이름으로 선언하고 선언과 동시에 {} 중괄호 안에 초기화를 해준다.
한 번 초기화 후에는 값을 하나씩 바꿔주어야한다.

첨자란

배열의 나누어진 조각이다.
첨자는 0부터 시작하며 마지막 null값을 포함하여 적는다.

배열의 초기화

선언후에 최초 할당된 저장공간에는 쓰레기값이 저장되어있기 때문에 선언과 동시에 초기화 해주어야한다.
{} 중괄호로 묶어서 초기화를 해준다.

기본 초기화 방법

int ary[3] = {1,2,3};

초깃값이 배열요소보다 적은 경우

int ary[3] = {1};

왼쪽부터 초기화 후 남은 배열요소에는 0으로 채운다.

자동초기화 기능을 사용하는 경우

int ary[384810] = {1};

배열요소가 아무리 많아도 모든 요소를 1로 초기화할 수 있다.

배열요소 개수가 생략된 경우

int ary[] = {1,2};

컴파일러가 알아서 초깃값 개수만큼 배열 요소 개수를 정하고 저장공간에 할당한다.

double과 char형 배열을 선언 후 초기화하는 경우

double ary[3] = {1.3, 5.7, 2.9};
char ary1[4] = {'l', 'o', 'v', 'e'};

배열과 반복문

배열은 같은 유형의 변수가 많이 필요할 때 사용하기 때문에 반복문과 연관이 깊다.

for(int i = 0; i <5; i++)
{
scanf("%d", &score[i]);
}

제어변수 i가 0부터 하나씩 증가하는 값을 첨자로 쓴다면 반복과정에서 모든 배열 요소에 값을 입력할 수 있다.

데이터수가 늘어나도 반복 횟수만 수정하면 그만이기 때문에 아주 간편하다.

sizeof를 사용한 배열 처리

배열은 반복문 사용이 필수적이다. 그래서 배열이 바뀌면 배열을 처리하는 반복문을 모두 수정해야하는데 이 경우 배열 요소의 개수를 계산하여 반복문에 사용하는 방법도 있다.

sizeof(배열명) / sizeof(배열 요소)

배열요소의 개수를 반복문의 반복횟수로 사용하면 나중에 요소개수가 바뀌더라도 나머지 요소들을 수정할 필요가 없다.

char형 배열 선언과 초기화

저장할 문자열의 길이보다 하나 이상 크게 배열을 선언하는 것을 반드시 기억해야 한다.
널문자(\0)를 저장하기 위해서 이다.

char일뿐 다른 자료형과 다를게 없지만 중괄호없이 문자열 상수로 직접 초기화하는것을 선호한다.

char str[90] = "peachpie";

null문자란

문자열의 끝을 표시하며 널문자가 없으면 값이 없는 나머지 부분들도 출력해 버린다.
만약 scanf를 사용해 입력을 받았을 때 scanf함수가 자동으로 알아서 문자열의 끝을 표시해준다.

char배열 선언시 주의할 점

  • 배열의 크기는 넉넉하게 선언해야한다.
    길이가 일정하지 않은 경우에 가장 긴 문자열도 저장할 수 있도록 해야하기 때문이다.
  • 배열 요소 개수는 최소 '문자열 길이 + 1' 이어야 한다.
    널문자가 마지막을 표시하기 때문에 자리를 남겨둬야 한다.

문자열 대입

char형 배열 안에서 문자열을 대입할 때는 strcpy함수를 사용한다.

strcpy함수

strcpy함수란 char형 배열에 새로운 문자열을 저장하는 함수이다.
저장할 문자열의 길이를 파악해 딱 그 길이만큼만 복사한다.
문자열 끝에 널문자도 알아서 붙여준다.

기본사용법

strcpy(저장할 배열명, 저장할 문자열);

문자열을 배열명에 저장해준다.
저장할 배열명은 상수와 같은 개념이기 때문에 문자열 상수를 넣을 수 없다.

gets와 puts

문자열을 대입하는 일은 strcpy함수가 하고 입출력은 gets, puts가 수행한다.
입출력함수 scanf도 있긴 하지만 빈칸을 포함해서 출력하지 않기 때문에 불편함이 있다.
gets와 puts는 빈칸을 포함하여 입력받고 출력한다. 이 둘의 차이점은 하나다.

gets

입력받은 배열의 크기를 검사하지 않으므로 배열을 벗어난 메모리 영역을 침범할 가능성이 있다. 그래서 항상 배열의 크기를 고려해야한다.

puts

문자열을 출력한 후에 줄바꿈을 한다.

0개의 댓글