배열의 선언과 사용
- 같은 형태의 자료형이 많이 필요할 때 배열을 사용하면 효과적이다.
배열의 선언
- 배열은 배열명과 변수의 개수, 변수의 자료형으로 선언한다.
-배열 ages-
int ages[5]; -> int int int int int
- 배열을 선언하면 변수의 개수만큼 연속된 기억공간을 할당한다.
- 기억공간의 구분자 - 배열의 이름 -> 기억공간의 시작주소
배열의 사용
- 배열의 기억공간을 사용할 때는 각 기억공간이 배열에서 차지하는 위치를 사용한다.
기억공간의 사용 -> 배열명 + 배열에서의 위치
- 배열을 구성하는 기억공간들을 배열의 요소라고 하며, 각 요소가 배열에서 차지하는 위치를 첨자라고 한다.
- 배열의 첨자는 0부터 시작한다.
배열명[첨자]
ages[0] ages[1] ages[2] ages[3] ages[4]
- ages배열의 세 번째 배열요소에 데이터를 저장하고 출력할 때
int ages[5];
ages[2] = 20;
printf("세 번째 배열요소에 저장된 값은 : %d\n", ages[2]);
- 배열요소에 값을 입력받을 때도 일반 변수와 같이 사용
scanf("%d", &ages[4]);
- 첨자는 0부터 시작하므로 배열요소의 개수가 5개라면 5를 첨자로 사용 불가능
ages[5] = 20; (X) -> 주의: 컴파일 에러가 발생하지 X
배열과 반복문
- 배열요소는 첨자로 구분되므로 반복문을 사용하면 모든 배열요소를 간단하게 참조할 수 있다.
-ages배열의 모든 요소에 값을 입력 받는 경우
for(i=0; i<5; i++){
scanf("%d", &ages[i]); //제어변수를 배열요소의 첨자로 사용
}
연습문제
- 가장 큰 배열요소 값 찾기
#참고
1~10사이 난수 생성하기
nums[i]=(rand()%10)+1;
배열의 초기화
int num[5];
int i, tot=0;
for(i=0; i<5; i++){
tot+=num[i];
}
printf("total: %d\n", tot);
- 배열은 기억공간의 수가 많으므로 중괄호를 사용하여 초기값을 나열한다.
배열의 초기화
int num[5] = {1, 3, 5, 7, 9};
배열의 초기화의 자동기능
- 배열요소의 수보다 초기화 값이 적으면 남는 기억공간은 0으로 채워진다.
int num[5] = {1, 3); -> 1 3 0 0 0
- 배열을 선언할 때 초기화하면 배열요소의 개수를 생략할 수 있다.
int num[] = {1, 3, 5, 7, 9}; -> 1 3 5 7 9
유연성 있게 배열 다루기
- 배열요소의 개수가 자동으로 계산되도록 프로그램을 작성하면 배열의 크기가 바뀌어도 프로그램을 수정할 필요가 없다.
int num[5]; -> int int int int int -> 전체 20바이트 -> int하나는 4바이트
배열요소의 개수 = sizeof(num) / sizeof(num[0]) -> 5 = 20/4
배열 전체의 크기 / 배열요소 하나의 크기
연습문제
- 배열에 임의의 숫자 초기화한 후 각 숫자들의 위치를 반대로 바꾸는 프로그램
문자열을 저장하는 문자배열
문자열의 선언과 사용
- 문자배열은 기본적으로 여러 개의 문자를 저장하기 위한 char형 배열이다.
-4개의 문자를 저장할 수 있는 문자배열의 선언
char word[4]; -> char char char char
- 배열요소 문자를 저장하면 문자열이 만들어진다.
word[0] = 'H';
word[1] = 'I';
문자열은 널문자가 완성한다.
- 문자배열의 마지막에 널문자('\0')가 없으면 저장된 문자열의 끝을 알 수 없다.
- 문자배열에 문자열을 저장할 때는 항상 마지막에 끝을 표시하는 널문자('\0')를 넣어줘야 한다.
char word[50];
word[0]='H';
word[1]='I';
word[2]='\0';
printf("%s", word);
scanf함수를 사용한 문자열의 입력
- 문자배열에 문자열을 입력 받을 때는 %s 변환문자열과 배열명을 scanf함수의 전달인자로 준다.
scanf("%s", word); -> 배열에 문자열을 입력한다.
- scanf함수로 문자열을 입력 받으면 널문자를 자동으로 채워준다.
-word배열에 hello를 입력 받은 경우
printf("문자열을 입력하세요 : ");
scanf("%s", word);
연습문제
- 영단어 반대로 출력하는 프로그램
scanf함수로 문자열을 입력할 때 주의할 점
- 배열의 크기보다 입력되는 문자열의 크기가 더 크면 할당되지 않은 기억공간을 침범하므로 주의해야 한다.
char word[2];
이웃한 메모리 영역을 침범하게 된다.
문자배열의 초기화
- 문자배열은 기본적으로 문자상수들로 초기화한다.
char str[10] = {'d', 'r', 'e', 'a', 'm', '\0'};
- 초기화하고 남는 배열요소는 0으로 채워진다.
-char형 배열요소에 0이 저장되면 널문자가 되므로 결국 남는 배열요소는 널문자로 채워지는 것이다.
- 문자배열은 문자열상수로 직접 초기화가 가능하다.
(단, 선언과 동시에 초기화하는 경우만 가능하다.)
char str[80] = "dream"; //배열 선언과 동시에 초기화(0)
str = "utopia"; //배열에 문자열을 바로 대입할 수 없다.(x)
연습문제
- 문자 복사 프로그램