다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열
배열은 선언 방식에 따라서 1차원 구조가 될 수도 있고, 2차원 구조가 될 수도 있다.
배열은 일반적인 변수와 달리 여러 개의 값을 저장할 수 있다.
int oneDimArr[4];
이러한 1차원 배열을 선언하면 int형 변수 4개가 int-int-int-int 처럼 나란히 선언되어 있는 것이다.
arr[idx]=20;
배열 arr의 idx+1번째 요소에 20을 저장한다는 뜻이다.
이렇듯 []연산자 사이에 배열의 위치정보를 명시(인덱스)한다. 배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0부터 시작한다.
또한 배열의 모든 요소는 반복문을 이용해서 순차적으로 접근하는 것이 가능
int main(void)
{
int arr[5];
int sum=0, i;
arr[0]=10, arr[1]=20, arr[2]=30, arr[3]=40, arr[4]=50;
for(i=0; i<5; i++)
sum += arr[i];
printf("배열 요소에 저장된 값의 핪: %d \n", sum);
return 0;
}
[실행결과]
배열요소에 저장된 값의 합: 150
배열의 길이가 3인 배열을 선언해놓고, 4번째 요소의 접근을 시도하면 문제가 발생한다. 하지만 컴파일러는 배열접근에 있어서 유효성 검사를 진행하지 않기 때문에 컴파일 에러가 발생하지 않는다. 따라서 주의를 해야한다.
int arr1[5]={1, 2, 3, 4, 5};
순차적으로 1, 2, 3, 4, 5로 초기화
중괄호로 묶은 부분을 가리켜 초기화 리스트라고 한다.
int arr2[ ]={1, 2, 3, 4, 5, 6, 7};
배열의 길이정보를 생략하면 컴파일러가 초기화 리스트의 수를 참조하여 길이정보를 채워준다.
int arr3[5]={1, 2};
배열의 길이를 다 채울 만큼의 초기 값이 선언되지 않으면 첫번째 요소부터 순차적으로 값을 채워나가되 채울 값이 존재하지 않는 요소들은 0으로 채워진다.
만약 배열의 이름을 대상으로 하는 sizeof 연산의 결과로는 '바이트 단위의 배열 크기'가 반환되기 때문에 sizeof(arr1) / sizeof(int)로 구성해야한다.
char형 배열을 이용하면 문자열의 저장뿐만 아니라 문자열의 변경이 가능
char str[ ]="Good morning!";
위의 선언을 통해 메모리 공간에는 char형 배열이 할당되지만, 배열의 길이가 14로 결정된다. 문자열의 끝에는 '\0'(널)이라는 특수문자(escape sequence)가 자동으로 삽입되어 있기 때문이다. 따라서 char형 배열을 선언할 경우네는 특수문자가 저장될 공간까지 고려해서 배열의 길이를 결정해야 한다.
널 문자를 정수형으로 출력하면 0, 문자형으로 출력하면 아무 출력도 발생하지 않는다.
int main()
{
char str[50];
int idx=0;
scanf("%s", str); //&연산자 뺌
printf("입력받은 문자열: %s \n", str);
}
int main()
{
char str[50];
int idx=0;
scanf("%s", str);
while(str[idx] != '\0') //문자 단위로 출력
{
printf("%c", str[idx]);
idx++;
}
printf("\n");
}
scanf 함수를 통해 입력 받은 문자열의 끝에도 널 문자가 삽입되어 있으며, 배열의 첫번째 요소부터 널 문자를 만날 때까지 순차적으로 출력을 진행한다. 이처럼 C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.
char arr1[] = {'H', 'i'};
이는 다만 문자가 저장된 배열이다.
char arr2[] = {'H', 'i', '\0'};
이는 문자열이 저장된 배열이다.
위의 문자 단위로 출력했던 예제처럼, 배열 요소에 일일이 접근하여 문자열 전부를 출력해야 할 때, 문자열의 끝을 나타내기 위한 도구가 마련되어 있지 않다면, 출력이 불가능하다.
또한 메모리상에서 문자열은 이진 데이터로 저장되기 때문에 문자열의 시작과 끝이 표시되어 있지 않다면 문자열을 구분하는 것은 불가능하다.
int main()
{
char str[ ] = "I like C programming";
printf("string: %s \n", str);
str[8]='\0'; // 널 문자 삽입
printf("string: %s \n", str);
}
[실행결과]
string: I like C programming
string: I like C
위 예제처럼 문자열의 중간에 널 문자를 삽입하여 문자열의 끝을 변경할 수도 있다.