C++ 배열 기본

C++Beginner
지금 연습하기

소개

이 랩에서는 C++ 의 배열에 대해 배우게 됩니다. 배열을 정의하고 초기화하는 방법과 배열 함수를 사용하는 방법을 배우게 됩니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 고급 레벨의 실험이며 완료율은 42%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

콘텐츠 미리보기

배열은 동일한 유형의 데이터를 저장하는 데 일반적으로 사용됩니다. 배열은 효율적이고, 컴팩트하며, 접근하기 쉽습니다. 루프와 결합하면 배열 내 요소에 대한 연산이 매우 간단해집니다.

배열을 생성하려면 배열의 길이 (또는 크기) 를 미리 알고 그에 따라 할당해야 합니다. 배열이 생성되면 길이는 고정되며 변경할 수 없습니다.

image desc

배열 선언 및 사용법

30 명의 학생의 성적 평균을 구하고 싶다고 가정해 봅시다. mark1, mark2, ..., mark30과 같은 30 개의 변수를 생성하고 싶지는 않을 것입니다. 대신, 30 개의 요소를 가진 배열이라는 단일 변수를 사용할 수 있습니다.

배열은 대괄호 [ ]로 식별되는 동일한 유형의 요소 목록입니다. 배열을 사용하려면 이름, 유형차원(또는 크기 또는 길이) 의 3 가지로 배열을 선언해야 합니다. 배열에는 복수형 이름을 사용하는 것이 좋습니다. 예를 들어, marks, rows, numbers와 같습니다. 예를 들어,

int marks[5];        // 5 개의 요소를 가진 marks 라는 int 배열 선언
double numbers[10];  // 10 개의 요소로 구성된 double 배열 선언
const int SIZE = 9;
float temps[SIZE];   // const int 를 배열 길이로 사용

// 일부 컴파일러는 배열 길이로 변수를 지원합니다. 예를 들어,
int size;
cout << "Enter the length of the array: ";
cin >> size;
float values[size];

C++ 에서 선언 후 요소의 값은 정의되지 않음에 유의하십시오.

다음과 같이 쉼표로 구분된 값 목록으로 선언 중에 배열을 초기화할 수도 있습니다.

// 3 개의 요소로 구성된 int 배열을 선언하고 초기화합니다.
int numbers[3] = {11, 33, 44};
// 길이가 생략되면 컴파일러가 요소를 계산합니다.
int numbers[] = {11, 33, 44};
// 초기화의 요소 수는 길이보다 작거나 같아야 합니다.
int numbers[5] = {11, 33, 44};  // 나머지 요소는 0 입니다. 혼란스럽습니다! 이렇게 하지 마세요.
int numbers[2] = {11, 33, 44};  // ERROR: 너무 많은 초기화자

// {0} 또는 {}를 사용하여 모든 요소를 0 으로 초기화합니다.
int numbers[5] = {0};  // 첫 번째 요소는 0, 나머지도 0
int numbers[5] = {};   // 모든 요소도 0
/* Test local array initialization */
#include <iostream>
using namespace std;

int main() {
   int const SIZE = 5;

   int a1[SIZE];   // Uninitialized
   for (int i = 0; i < SIZE; ++i) cout << a1[i] << " ";
   cout << endl;   // ? ? ? ? ?

   int a2[SIZE] = {21, 22, 23, 24, 25}; // All elements initialized
   for (int i = 0; i < SIZE; ++i) cout << a2[i] << " ";
   cout << endl;   // 21 22 23 24 25

   int a3[] = {31, 32, 33, 34, 35};   // Size deduced from init values
   int a3Size = sizeof(a3)/sizeof(int);
   cout << "Size is " << a3Size << endl;   // 5
   for (int i = 0; i < a3Size; ++i) cout << a3[i] << " ";
   cout << endl;   // 31 32 33 34 35

   int a4[SIZE] = {41, 42};  // Leading elements initialized, the rests to 0
   for (int i = 0; i < SIZE; ++i) cout << a4[i] << " ";
   cout << endl;   // 41 42 0 0 0

   int a5[SIZE] = {0};  // First elements to 0, the rests to 0 too
   for (int i = 0; i < SIZE; ++i) cout << a5[i] << " ";
   cout << endl;   // 0 0 0 0 0

   int a6[SIZE] = {};   // All elements to 0 too
   for (int i = 0; i < SIZE; ++i) cout << a6[i] << " ";
   cout << endl;   // 0 0 0 0 0

   for (int i=0;i<5;i++){
       // assign a value for each element of the array, like this
       a6[i] = i;
       cout << a6[i] << " ";
   }
}

출력:

6299128 0 485160213 32595 0 ## some unexpected values
21 22 23 24 25
Size is 5
31 32 33 34 35
41 42 0 0 0
0 0 0 0 0
0 0 0 0 0
0 1 2 3 4
image desc

sizeof(arrayName)/sizeof(arrayName[0]) 표현식을 사용하여 배열 길이를 찾을 수 있습니다. 여기서 sizeof(arrayName)은 배열의 총 바이트 수를 반환하고 sizeof(arrayName[0])은 첫 번째 요소의 바이트 수를 반환합니다.

배열과 반복문

배열은 루프와 함께 사용됩니다. 루프를 통해 배열의 모든 요소를 처리할 수 있습니다. C++11 은 배열을 반복하기 위해 범위 기반 for 루프 (또는 for-each 루프) 를 도입했습니다. 예를 들어,

/* Testing For-each loop */
#include <iostream>
using namespace std;

int main() {
   int numbers[] = {11, 22, 33, 44, 55};

   // For each member called number of array numbers - read only
   for (int number : numbers) {
      cout << number << " ";
   }

   // To modify members, need to use reference (&)
   for (int &number : numbers) {
      number = 99;
   }

   for (int number : numbers) {
      cout << number << endl;
   }
   return 0;
}

출력:

11 22 33 44 55
99 99 99 99 99
image desc

다차원 배열

예를 들어,

int[2][3] = { {11, 22, 33}, {44, 55, 66} };
image desc
/* Test Multi-dimensional Array */
#include <iostream>
using namespace std;
void printArray(const int[][3], int);

int main() {
   int myArray[][3] = {{8, 2, 4}, {7, 5, 2}}; // 2x3 initialized
                 // Only the first index can be omitted and implied
   printArray(myArray, 2);
   return 0;
}

// Print the contents of rows-by-3 array (columns is fixed)
void printArray(const int array[][3], int rows) {
   for (int i = 0; i < rows; ++i) {
      for (int j = 0; j < 3; ++j) {
         cout << array[i][j] << " ";
      }
      cout << endl;
   }
}

출력:

8 2 4
7 5 2
image desc

문자 배열 (char 배열) 사용법

C 에서 문자열은 NULL 문자 '\0'(16 진수 코드 0) 로 종료되는 char 배열입니다. C++ 은 헤더 <string> 아래에 새로운 string 클래스를 제공합니다. C 의 원래 문자열은 C-String(또는 C 스타일 문자열 또는 문자열) 로 알려져 있습니다. 다음과 같이 C-string 을 할당할 수 있습니다.

char message[256];     // char 배열 선언
                       // '\0'으로 종료되는 최대 255 자리의 C-String 을 저장할 수 있습니다.
char str1[] = "Hello"; // "문자열 리터럴"로 선언 및 초기화합니다.
                       // 배열의 길이는 문자 수 + 1('\0'을 위해) 입니다.
char str1char[] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 위와 동일
char str2[256] = "Hello";  // 배열의 길이는 256 이며, 더 작은 문자열을 유지합니다.

초보자의 경우 C-string 을 피하십시오. 앞서 논의한 C++ string(헤더 <string>에 있음) 을 사용하십시오.

cincout을 사용하여 C-string 을 처리할 수 있습니다.

  • cin <<는 공백으로 구분된 문자열을 읽습니다.
  • cin.getline(*var*, *size*)var에 최대 size-1 길이의 문자열을 읽어 들여 줄 바꿈 문자를 버립니다 ('\0'로 대체). *size*는 일반적으로 C-string 배열의 길이에 해당합니다.
  • cin.get(*var*, *size*)는 줄 바꿈까지 문자열을 읽지만 입력 버퍼에 줄 바꿈 문자를 남겨둡니다.
  • 인수가 없는 cin.get()은 다음 문자를 읽습니다.
/* Test C-string */
#include <iostream>
using namespace std;

int main() {
   char msg[256]; // Hold a string of up to 255 characters (terminated by '\0')

   cout << "Enter a message (with space)" << endl;
   cin.getline(msg, 256);  // Read up to 255 characters into msg
   cout << msg << endl;

   // Access via null-terminated character array
   for (int i = 0; msg[i] != '\0'; ++i) {
      cout << msg[i];
   }
   cout << endl;

   cout << "Enter a word (without space)" << endl;
   cin >> msg;
   cout << msg << endl;

   // Access via null-terminated character array
   for (int i = 0; msg[i] != '\0'; ++i) {
      cout << msg[i];
   }
   cout << endl;
   return 0;
}

출력:

Enter a message (with space)
hello, how are you?
hello, how are you?
hello, how are you?
Enter a word (without space)
helloworld
helloworld
helloworld
image desc

요약

C/C++ 는 배열 인덱스 경계 검사를 수행하지 않습니다. 즉, 인덱스가 배열의 범위를 벗어나도 경고/오류를 발생시키지 않습니다. 그럼에도 불구하고 길이를 추정하고 상한을 할당해야 합니다. 이것이 아마도 배열을 사용하는 주요 단점일 것입니다. C++ 에는 동적으로 크기를 조정할 수 있는 배열을 지원하는 vector 템플릿 클래스가 있으며 (C++11 은 array 템플릿 클래스를 추가했습니다).