C언어 배열

Minimal_user·2024년 5월 10일

c언어

목록 보기
9/17

1. c언어 배열 특징

  • 다른 자료 구조에 비해 배열은 낭비되는 메모리가 없으며 배열 요소들이 연속적인 공간에 배치되어 있기 때문에 요소를 참조하는 속도가 대단히 빠르다. 하지만반드시 연속적이어야 하기 때문에, 새로운 요소를 삽입하거나 기존 요소를 삭제하는 속도는 무척 느리다는 것이 단점이다.
    • 참고 : 삽입 삭제가 빈번한 자료를 다룰 때는 배열 대신 연결 리스트를 많이 사용한다.
  • 배열을 선언할때 크기값은 반드시 상수로 주어야 한다.
  • C언어는 배열의 범위를 (컴파일할 때) 점검하지 않는다. 그래서 컴파일된 프로그램을 실행시 오작동 할 수도 있다.
    • 오작동이라고 함은 에러를 발생하면서 종료되거나, 의도치하지 않은 작동을 할 수 있다는 것이다.
    • 배열 요소를 참조할 때 첨자 번호를 기입할 때 변수를 기입할 수도 있기 때문에 (컴파일 할 때) 점검하지 않는다.
  • 배열명은 포인터 상수다. (포인터 변수가 아니라)
    • 배열명이 단독으로 사용되면 배열의 시작번지값을 가지는 포인터상수다.
      • 배열명은 포인터 상수이므로 배열 변수에 배열 변수를 대입할 수 없다. (이는 이 문장의 변수에 '상수'라는 말을 넣어서 다시 읽어보면 이해가 갈 것이다.)
    • 배열명은 시작 번지의 값을 나타내므로 배열의 첫 번재 요소의 주소값과 동일하다.
    • 만약 두 배열을 완전히 같게 만들고 싶다면 루프를 돌면서 한 배열의 요소를 다른 배열의 요소에 개별적으로 대입해야 한다.
      (또는 memcpy 같은 메모리 복사 함수를 사용하여 배열 요소를 통째로 복사할 수 있다.)
    • 배열명은 포인터 상수이지만 유일한 예외로 sizeof 연산자에 배열명을 전달했을 때 이 연산자는 배열명을 변수 취급한다.

2. 배열 초기화

int ar[5]={4, 8, 3, 69, -7};

  • 참고
    • '='는 구두점이나 대입 연산자로 사용될 수 있는데 아래의 표와 같이 사용 상황에 따라 다르다.
구두점대입연산자
int i=3;int i;
i=3;
이 경우 변수의 선언문과 초기값을 구분하는 구두점이다.이 경우 변수에 값을 대입하는 연산자다.
  • 따라서 아래와 같이 배열의 초기화에는 구두점을 이용한 선언을 해야하지, 대입 연산자를 사용할 수 없다.
    • 이는 구조체에도 동일하게 적용된다.
int ar[5];
ar={4, 8, 3, 69, -7}; // error!
  • 초기식
    • c언어는 초기값이 배열 크기보다 적을 경우 나버지 배열 요소들을 전부 0으로 초기화 한다.
      int arBig[1000]={1, 2, 3}; // 또는 {1, 2, 3, };
    • 배열 선언문이 초기식을 가질 대는 배열의 첨자 크기를 생략할 수 있다.
      int ar[]={4, 8, 3, 69, -7};
    • 2차 배열 초기화
      • 초기값 개수가 꼭 맞는 경우 배열의 총 크기에 맞게 초기식을 기술할 수 있다.
        int ar[2][3]={1, 2, 3, 4, 5, 6}
      • 또는 행별로 초기값을 따로 묶어줄 수 있다.
        int ar[2][3]={{1, 2, 3}, {4, 5, 6}}
      • 초기값이 모자랄 때는 행별로 중괄호를 구분했다면, 행별로 빈 뒷 부분을 0으로 초기화한다.
        행별로 중괄호호를 구분하지 않았다면 뒷 부분을 전부 0으로 초기환다.
      • 2차원 뿐만 아니라 n차원 배열의 초기식에서는 첫 번째 첨자 크기만 생략할 수 있다.

출처 : 혼자 연구하는 C/C++ 1 / 김상형 저 / 와우북스

profile
White book for everything I need.

0개의 댓글