Chapter 6

GraGrass·2024년 2월 7일

배열

1차원 배열

1. 배열 초기화

배열 선언과 동시에 초기화

int main(void){
	int arr1[5]={1,2,3,4,5};
    int arr2[]={1,2,3,4,5};
    int arr3[5]={1,2};
}

지정 초기화(C99)

int arr[6]={[5]=212}; 
// int arr[6]={0,0,0,0,0,212};
int arr[12]={31,28,[4]=31,30,31,[10]=29};
// int arr[12]={31,28,0,0,31,30,31,0,0,0,29,0};
int arr[]={1, [6]=23};
// int arr[7]={1,0,0,0,0,0,23};
  • 전통적인 초기화 문법에서는, 마지막 원소 앞에 있는 모든 원소들도 초기화됨
  • 초기화하지 않은 나머지 원소들은 0으로 설정됨
  • 배열 크기 지정 X 시 초기화 값에 맞게 크기 결정

2. 문자 배열과 문자열

문자열(string)은 문자(char)의 배열

  • 배열은 크기를 알 수 없음
  • 문자열의 크기를 지정하는 방법으로 null 문자 사용
  • 숨어있는 마지막 원소는 null이며, '\0' 또는 '\x0'로 나타냄

초기화

char arr1[] = "abc" ; // char arr1[]={'a','b','c','\0'}
char arr2[100] = "xyz"; // char arr2[100] ={'x','y','z','\0'}
char arr3[] = arr1; // C는 배열로 배열 초기화 불가 -> 오류!!
  • 문자열 배열은 문자열 상수로 초기화 가능
  • string이 아닌 문자열 배열로 초기화할 경우, 오류 발생

크기

  • string의 크기 = char 배열의 크기
  • string의 길이 = char 배열의 null을 제외한 크기 (strlen 함수 사용)

다차원 배열

1. 2차원 배열

개요

int main(void){
	int arr1[4];
    int arr2[3][4];
}
  • 다차원 배열이라도 메모리에는 일직선 상으로 저장

초기화 (배열 크기 O)

// case 1: 행 담위로 모든 요소들 초기화

int arr[3][3]={
	{1,2,3},
    {4,5,6},
    {7,8,9}
};

// case 2: 행 단위로 일부 요소들만 초기화 
// 부족한 부분은 0으로 초기화됨

int arr[3][3]={
	{1},
    {4,6},
    {7,8,9}
};

/* 
int arr[3][3]={
	{1,0,0},
    {4,6,0},
    {7,8,9}
}; 
*/

// case3: 1차원 배열 초기화 형태
// arr[0][0] 부터 arr[2][2]까지 순서대로 초기화

int arr[3][3]={1,2,3,4,5,6,7};

/* 
int arr[3][3]={
	{1,2,3},
    {4,5,6},
    {7,0,0}
}; 
*/

초기화 (배열 크기 X)

int arr1[][4]={1,2,3,4,5,6,7,8};
int arr2[][2]={1,2,3,4,5,6,7,8};

/*
int arr1[2][4]={
	{1,2,3,4},
    {5,6,7,8}
};

int arr2[4][2]={
	{1,2},
    {3,4},
    {5,6},
    {7,8}
};
*/
  • 초기화가 함께 이루어진다면 크기를 명시하지 않아도 됨
  • 단, 두 개의 인덱스 중 두 번째 인덱스 필수 지정

2. 3차원 그 이상의 배열

  • 명시적으로는 다차원 배열이지만, 메모리 상에는 1차원 배열로 저장

인자와 매개 변수

1. 배열 인자

배열 인자는 복사해서 보내지 않음

  • 배열은 무척 커질 수 있음
  • call by value 형식일 경우 효율, 실행시간, 메모리 부족 등 문제 발생

call by reference

  • 값을 보내지 않고 변수의 위치(포인터)를 보냄
  • 배열의 위치는 첫번재 요소의 메모리 주소

문자열도 배열이므로 call by reference로 보냄

  • 일반적으로 상수는 메모리에 위치하지 X
  • 예외적으로 string은 읽기 전용 메모리에 저장하여 보호
  • string도 메모리 주소를 가짐

다차원 배열은 각 차원의 크기가 같아야 함

  • 크기가 가변적인 다차원 배열은 VLA(C99) 방식으로 저장

2. 배열 매개변수

배열을 매개변수로 받으면 크기를 알 수 없음

int a[10];
a[100]=1; a[-10]=1; // 문법적으로는 오류 X

void f(int a[10]){
	a[100]=1; a[-10]=1; // 문법적으로는 오류 X
};
  • 배열 자체에는 크기를 지정하는 기능이 없음
  • 배열의 크기를 알 수 있는 지역변수의 경우에도 유효 여부 점검 X

배열을 매개변수로 받으려면 크기도 같이 받아야 함

  • 문자열 매개변수는 null의 존재로 크기를 알 수 있음 -> 크기 별도로 받지 않음
  • 크기가 가변적인 다차원 배열은 VLA(C99) 방식을 사용하여 받을 수 있음

다차원 배열 매개변수(C99)

void f(int n, double a[][n]);
void g(int m, int n, double a[m][n]);
  • 가변 길이 배열 사용 시 다차원 배열도 매개변수로 쉽게 사요 ㅇ가능
  • n의 값을 정확하게 지정하는 것은 caller의 책임
profile
올해는 진짜 갓생 산다

0개의 댓글