배열의 초기화

Programming/C 2006. 10. 24. 20:21
1차원 배열

#include <stdio.h>
main() {
  int imsi[ 3];

  imsi[ 0 ] = 0;

  printf( "%d %d %d", imsi[ 0 ], imsi[ 1 ], imsi[ 2 ] );
}
// output
0 -541085696 -541125761

위 예를 보면 배열이 어떤 값을 저장할 수 있는지를 지정하는 타입이 있다.
배열의 첨자를 이용하여 배열의 개수도 지정한다.
배열의 첨자는 0부터 시작하므로 정의할 때 첨자 수와 사용할 때 첨자 수는 -1의 오차를 보인다.
imsi[ 1 ], imsi[ 2 ]는 초기화를 하지 않았으므로, 어떠한 값이 들어가 있을지 아무도 모른다.
다음의 두가지 방법은 imsi 배열을 초기화 시켜준다.

for ( i = 0; i < 3; i++ ) {
  imsi[ i ] = 0;
}

int imsi[ 3 ] = { 0 };

다음과 같이 첨자를 생략할 수도 있다.

int imsi[] = { 4, 3, 7, 4 };

위 문장을 만나는 순간 컴파일러는 초기치의 개수를 세고 이를 첨자에 반영한다.
imsi의 첨자는 자동을 4가 되고 16바이트가 할당된다.


다차원 배열

다차원 배열은 다음처럼 할 수 있다.

int imsi2[ 2 ][ 3 ];
int imsi3[ 2 ][ 3 ][ 4 ];
int imsi4[ 2 ][ 3 ][ 4 ][ 5 ];

#include <stdio.h>
main() {
  int imsi[ 2 ][ 3 ] = { 0 };

  printf( "%d %d %d %d %d %d", imsi[ 0 ][ 0 ], imsi[ 0 ][ 1 ], imsi[ 0 ][ 2 ], imsi[ 1 ][ 0 ], imsi[ 1 ][ 1 ], imsi[ 1 ][ 2 ] );
}
// output
0 0 0 0 0 0

다차원 배열의 초기화 방법

int imsi[ 2 ][ 3 ] = { { 1, 2, 8 }, { 34, 634, 7 } };
int imsi[ 2 ][ 3 ] = { 1, 2, 4, 2, 34, 634 };
// 빈공간은 0으로 초기화
int imsi[ 2 ][ 3 ] = { { 1, 2, 8 }, {} };
int imsi[ 2 ][ 3 ] = { 1, 2, 8 };
int imsi[ 2 ][ 3 ] = { {}, 4, 7, 3 };
int imsi[ 2 ][ 3 ] = { {}, { 4, 7, 3 } };


1차원 배열과 포인터

배열명은 배열의 첫번째 배열요소의 주소를 뜻한다.
배열명은 포인터 변수가 아니라 배열명 자체임을 명심하라.

#include <stdio.h>
main() {
  int imsi[ 3 ] = { 5, 3, 7 };
  int *imsip;

  imsip = imsi;

  printf( "%#010x %#010x %#010x\n", imsi, &imsi[ 0 ], imsip );
}
// output
0x8047d1c 0x8047d1c 0x8047d1c


포인터 + 정수

주소값 + 정수값 = 주소값이다.
포인터 변수에 정수값을 더할 때 정수 값 만큼의 바이트가 더해지는게 아니라 포인터 변수의 타입 크기만큼 증가한다.
그러므로 배열의 주소값에 + 정수값을 하면 다음 첨자 값을 얻을 수 있다.

#include <stdio.h>
main() {
  int imsi[ 3 ] = { 5, 3, 7 };
  int *imsip;

  imsip = imsi;

  // 더하기(+) 보다 역참조 연산자(*)의 우선순위가 높으므로 괄호를 사용
  printf( "%d, %d, %d", *( imsip + 0 ),  *( imsip + 1 ),  *( imsip + 2 ) );
}
// output
5 3 7

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret