C언어 배열 (1차원만 설명)

프로그래밍/C 2019.03.19 댓글 Plorence
배열

배열은 다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열입니다.
1
2
3
4
5
6
7
8
#include <stdio.h>
int main (void){
    
    int floor101,floor102,floor103,floor104; //배열 미사용시
    int floor201,floor202,floor203,floor204; //배열 미사용시
    int oneFloArr[4]; //배열 사용시
    int twoFloArr[4]; //배열 사용시
}
장점은 코드가 간결해지며,편리합니다.
만약 변수 1000개가 필요한다면 언제 1000개를 다만들까요? 아마 만들다가 그만둘겁니다.

1차원 배열 선언에 필요한 것
  • 배열이름
  • 자료형
  • 길이정보 (반드시 상수여야 함.)
선언시
1
자료형 배열이름[길이정보];
 로 선언합니다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main (void){
    int oneFloArr[4]; //배열 사용시
    /*
    자료형:int
    배열이름:oneFloArr
    길이정보:4
    */
}
자료형은 int,double,long 등 다른 자료형도 사용이 가능하고
구조체같은 사용자 정의 자료형도 배열로 만들 수 있습니다.

1
2
3
4
5
#include <stdio.h>
int main (void){
    int num1 = 5;
    int Arr[num1]; //에러
}
길이정보에 정수형 타입 값을 요구하니 정수형 변수가 되어야 합니다.
그리고 선언할때 반드시 상수여야 하므로 위의 소스 코드는 에러가 발생하게 됩니다.
C 표준으로 C99을 지원하는데, C++와 공통된 부분만 지원합니다.
visual studio 2017 최신 컴파일러 기준으로 가변 배열은 안됩니다.(가변 배열은 C99때 추가됨.)

1
2
3
4
5
#include <stdio.h>
int main (void){
    int Arr[5= {1,2,3,4,5}; //배열의 선언과 동시에 초기화가 가능
}
 
위의 예제를 보면 배열의 선언과 동시에 초기화를 하고있습니다.
초기화 할때 왼쪽부터 0,1,2순으로 들어가게 됩니다.

1
2
3
4
5
6
7
#include <stdio.h>
int main (void){
    int Arr[3];
    Arr[0]=1,Arr[1]=2,Arr[2]=3,Arr[3]=4;
    
    return 0;
}
위에 예제의 문제점은 선언된 길이는 3인데 4번째 요소의 접근을 시도하고 있습니다.
컴파일러는 배열의 유효성검사를 하지 않기 때문에 컴파일에는 문제가 없습니다.
위와 같은 경우 할당 하지 않은 메모리 공간을 침범하게 됩니다.
반응은 상황마다 다르고 문제가 발견되지 않을수도 있습니다. (대부분 침범시 런타임 에러 발생)

1
2
3
4
5
6
7
#include <stdio.h>
int main (void){
    int Arr[] = {1,2,3,4,5};
    int Arr[5= {1,2,3,4,5};
    
    return 0;
}
배열을 선언과 동시에 초기화 시켰을경우 길이는 생략이 가능합니다.
그이유는 초기화 리스트의 수를 참조하여 길이정보를 채워 주기 때문입니다. (중괄호로 묶인 부분을 초기화 리스트라고 함)

1
2
3
4
#include <stdio.h>
int main (void){
    int Arr[5= {1,2};
}
배열은 순차적으로 초기화시키므로 Arr[0],Arr[1]만 초기화 시킵니다.

결과는 
1
2
3
4
5
Arr[0= 1
Arr[1= 2
Arr[2= 0
Arr[3= 0
Arr[4= 0
 입니다.

문자열

문자열 끝에는 \0이 들어갑니다.
 Good morning! 으로 초기화시키면
G,o,o,d,(공백),m,o,r,n,i,n,g,!,\0 으로 배열의 길이는 14입니다.
자동으로 \0가 들어가는 특수문자를 널(null)문자라고 합니다.
문자 끝에 널문자가 없다면 그건 문자열이 아닙니다.
널문자가 필요한 이유는 문자열의 끝을 표시하기 위해 사용됩니다.

널문자와 공백문자는 출력했을때는 차이가없지만 정수로 출력해보면 다릅니다.
널문자의 아스키 코드는 0이고 공백문자는 32입니다.
1
2
3
4
5
6
7
8
#include <stdio.h>
int main (void){
    char null = '\0';
    char escape = ' ';
    printf("%d %d",null,escape);
    
    return 0;
}
이 코드를 실행해보면
가 출력됩니다.
1
0 32
추가로 scanf함수로 문자열을 입력받을때는 &를 입력하지 않습니다.
나머지 변수는 &를 써야하고 문자열을 입력받는 배열은 쓰지않습니다.
지금 간단하게 설명하자면 배열의 이름 그 자체는 첫번째 인덱스([0])의 주소를 가리키기 때문입니다.
scanf함수의 2번째 파라미터는 주소값을 요구합니다.
배열과 포인터의 관계는 다음장에서 다루도록 하겠습니다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main (void){
    char arr[] = "Hello world";
    printf("%s \n",arr);
    arr[6]='\0';
    printf("%s",arr);
    
    return 0;
}
출력결과는
1
2
Hello world
Hello
입니다.

문자열중간에 널문자를 삽입해서 문자열의 끝을 변경하고 있습니다.
scanf함수로 입력받을때 공백이 들어간 문자열을 입력하면
출력할때 공백이 널문자로 인식하면서 공백전에 문자열만 출력됩니다.
예를 들면 hello world를 입력받으면 "hello","world" 총 2개의 문자열이 입력한것으로 인식합니다.

1차원 배열이라고 하는이유는 1차원은 선이고,2차원은 면이고,3차원은 입체라고 합니다.
1차원 배열은 모두 일렬로 나열되는 배열이므로 선에 해당한다. 그래서 1차원 배열이라고 합니다.


댓글