1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] 의 배열에 대해 얘기하자. 2 00:00:09,360 --> 00:00:12,780 그럼 왜 우리는 어느 배열을 사용하면 어떤 점이 좋습니까? 3 00:00:12,780 --> 00:00:17,210 자, 당신도 오 학생 ID를 저장하기 위해 필요한 프로그램을 말한다. 4 00:00:17,210 --> 00:00:21,270 은 5 별도의 변수를 가지고 합리적인 것 같습니다 수도 있습니다. 5 00:00:21,270 --> 00:00:24,240 우리가 잠시 표시됩니다 이유로, 우리는 0부터 카운트를 시작합니다. 6 00:00:24,240 --> 00:00:30,700 우리가해야 변수는 정수 id0, INT ID1 등 될 것입니다. 7 00:00:30,700 --> 00:00:34,870 우리는 학생 ID를 수행 할 모든 로직은 복사 붙여 넣기를해야합니다 8 00:00:34,870 --> 00:00:36,870 이 학생 ID의 각. 9 00:00:36,870 --> 00:00:39,710 우리는 학생들이 CS50에 있어야 발생하는 확인하려면 10 00:00:39,710 --> 00:00:43,910 우리가 처음 id0이 과정에서 학생을 나타냅니다 있는지 확인해야합니다. 11 00:00:43,910 --> 00:00:48,070 그런 다음 학생에게 동일한 작업을 수행하기 위해 id0의 코드를 복사 및 붙여 넣기해야합니다 12 00:00:48,070 --> 00:00:54,430 그리고 ID2, 3, 4 ID1과 등 id0의 모든 발생을 교체하십시오. 13 00:00:54,430 --> 00:00:57,560 >> 최대한 빨리 우리가 복사 및 붙여 넣기해야 소리로 14 00:00:57,560 --> 00:01:00,440 당신은 더 나은 솔루션이 있다는 생각을 시작해야합니다. 15 00:01:00,440 --> 00:01:05,360 이제 어떻게 당신이 5 학생 ID를 필요가 아니라 일곱하지 않는 걸 알게되면 어쩌죠? 16 00:01:05,360 --> 00:01:09,570 당신은 소스 코드로 돌아가 id5에 추가 id6이 필요 17 00:01:09,570 --> 00:01:14,260 ID는이 2 개의 새 ID에 대한 클래스에 속하는 경우와 확인에 대한 논리를 복사하여 붙여 넣습니다. 18 00:01:14,260 --> 00:01:19,600 함께 모든 ID를 연결 아무런 문제가 없어, 그래서 묻는 방법이 없습니다 19 00:01:19,600 --> 00:01:22,040 이 프로그램은 6을 통해 ID를 0이 작업을 수행합니다. 20 00:01:22,040 --> 00:01:26,120 자 이제 당신은 100 학생 ID가 알고 있습니다. 21 00:01:26,120 --> 00:01:30,770 그것은 따로 ID를 각각 선언해야 할 이상적인 이하 같다하기 시작 22 00:01:30,770 --> 00:01:33,760 이들 새로운 ID에 대한 논리를 복사하여 붙여 넣습니다. 23 00:01:33,760 --> 00:01:38,380 하지만, 우리는 결정하고, 우리는 모두 100 명에 대해 할 수 있습니다. 24 00:01:38,380 --> 00:01:42,240 당신이 모르는 경우 그러나 실제로 얼마나 많은 학생들이 무엇 있죠? 25 00:01:42,240 --> 00:01:47,320 몇 가지 N 학생들은 단지 귀하의 프로그램은 n은이라는 걸 어떻게 사용자를 부탁합니다. 26 00:01:47,320 --> 00:01:50,250 오 음. 이것은 매우 잘 작동하지 않을 수 있습니다. 27 00:01:50,250 --> 00:01:53,820 프로그램은 학생들의 일부 상수에 적용됩니다. 28 00:01:53,820 --> 00:01:57,520 >> 이러한 문제를 모두 해결하는 것은 배열의 아름다움입니다. 29 00:01:57,520 --> 00:01:59,930 따라서 배열은 무엇인가? 30 00:01:59,930 --> 00:02:04,480 일부 프로그래밍 언어에서 배열 형식은, 좀 더 많은 일을 할 수있을 것 31 00:02:04,480 --> 00:02:09,960 당신은 C.에서 볼 수 마찬가지로 그러나 여기서 우리는 기본 배열 데이터 구조에 초점을합니다 32 00:02:09,960 --> 00:02:14,030 배열은 메모리의 굉장한 블록입니다. 그게 전부 야. 33 00:02:14,030 --> 00:02:17,770 우리는 우리가 우리가 어떤 블록을 의미, 10 정수의 배열을 말할 때 34 00:02:17,770 --> 00:02:20,740 메모리가 그 10 별도의 정수를 개최 할 수있을만큼 큰 것입니다. 35 00:02:29,930 --> 00:02:33,410 정수는 4 바이트입니다 가정 할 때, 이는 10 정수의 배열 36 00:02:33,410 --> 00:02:37,180 메모리에 40 바이트의 연속 블록입니다. 37 00:02:42,660 --> 00:02:46,280 우리가 여기에 가지 않을거야 다차원 배열을 사용했을 때조차도 38 00:02:46,280 --> 00:02:49,200 그것은 여전히​​ 메모리의 굉장한 블록입니다. 39 00:02:49,200 --> 00:02:51,840 다차원 표현은 단지 편의를합니다. 40 00:02:51,840 --> 00:02:55,640 당신은 정수의 3 다차원 배열하여 3이있는 경우 41 00:02:55,640 --> 00:03:00,650 다음 프로그램은 단지 36 바이트의 큰 블록으로 취급합니다. 42 00:03:00,650 --> 00:03:05,460 정수의 총 수는 3 회 3, 각 정수는 4 바이트를 차지합니다. 43 00:03:05,460 --> 00:03:07,750 >> 가 기본 예를 살펴 보자. 44 00:03:07,750 --> 00:03:10,660 우리는 여기서 선언 배열의 2 가지 다른 방법을 볼 수 있습니다. 45 00:03:15,660 --> 00:03:18,580 우리는 컴파일하는 프로그램 중 1 주석해야합니다 46 00:03:18,580 --> 00:03:20,900 우리는 두 번 x를 선언 때문입니다. 47 00:03:20,900 --> 00:03:25,140 우리는 약간의 선언 이러한 2 가지 종류의 차이를 살펴됩니다. 48 00:03:25,140 --> 00:03:28,560 이 라인은 모두, 크기 N의 배열을 선언 49 00:03:28,560 --> 00:03:30,740 우리가 어디에 # 10로 N을 정의하고 있습니다. 50 00:03:30,740 --> 00:03:34,460 우리는 쉽게 양의 정수에 대한 사용자 요청 수 51 00:03:34,460 --> 00:03:37,250 와 배열의 구성 요소 수와 같은 그 정수를 사용했습니다. 52 00:03:37,250 --> 00:03:41,960 전에 학생 ID의 예를 좋아이 완전히 별도의 10 선언과 같은 가지입니다 53 00:03:41,960 --> 00:03:49,000 상상의 변수, X0, X1, X2 등 xN-1까지 있습니다. 54 00:03:57,270 --> 00:04:00,840 우리가 배열을 선언 할 곳 라인을 무시 대괄호가 손상 발견 55 00:04:00,840 --> 00:04:02,090 루프의 내부. 56 00:04:02,090 --> 00:04:09,660 우리는 X처럼 작성할 때 [3], 그 난 그냥, X 받침대 3으로 읽히 57 00:04:09,660 --> 00:04:13,090 당신은 상상의 X3를 요청 좋아라고 생각 할 수 있습니다. 58 00:04:13,090 --> 00:04:17,519 그 괄호 내부의 수, 크기, N, 의미의 배열과보다 주목 59 00:04:17,519 --> 00:04:22,630 우리가 색인에 전화 할게하는 0에서 N-1에 어떤 수 60 00:04:22,630 --> 00:04:25,660 이는 N의 인덱스의 총입니다. 61 00:04:25,660 --> 00:04:28,260 >> 이 실제로 작동하는 방법에 대해 생각 62 00:04:28,260 --> 00:04:31,260 배열 메모리의 큰 블록입니다 기억 해요. 63 00:04:31,260 --> 00:04:37,460 정수는 4 바이트입니다 가정, 전체 배열 x는 메모리의 40 바이트 블록입니다. 64 00:04:37,460 --> 00:04:41,360 그럼 X0는 블록의 첫 4 바이트를 의미합니다. 65 00:04:45,810 --> 00:04:49,230 X [1] 다음 4 바이트 등을 말합니다. 66 00:04:49,230 --> 00:04:53,760 이 X의 시작 적이를 추적 할 필요가있는 모든 프로그램을 의미합니다. 67 00:04:55,660 --> 00:04:59,840 당신은 X [400] 사용하려면 다음 프로그램이 동일합니다 것을 알고 68 00:04:59,840 --> 00:05:03,460 X의 시작 후 불과 1,600 바이트. 69 00:05:03,460 --> 00:05:08,780 우리가에서 1,600 바이트를 어디서 났어요? 이 정수 당 400 배나 4 바이트입니다. 70 00:05:08,780 --> 00:05:13,170 >> 에 이동하기 전에, 그것은 실현하는 것이 매우 중요하다고 C에서 71 00:05:13,170 --> 00:05:17,080 우리가 배열에 사용하는 인덱스의 더 집행이 없습니다. 72 00:05:17,080 --> 00:05:23,180 우리 큰 블록은 10 정수 긴하지만, 우리는 X [20] 작성하면 아무것도 우리에게 소리하지 않습니다 73 00:05:23,180 --> 00:05:26,060 또는 X [-5]. 74 00:05:26,060 --> 00:05:28,240 지수는 숫자 여야 할 필요는 없습니다. 75 00:05:28,240 --> 00:05:30,630 그것은 임의의 표현이 될 수 있습니다. 76 00:05:30,630 --> 00:05:34,800 이 프로그램에서 우리는 배열에 색인에 루프의에서 변수 i를 사용합니다. 77 00:05:34,800 --> 00:05:40,340 이것은 내가 = 0에서 배열의 길이에 루프, 매우 일반적인 패턴입니다 78 00:05:40,340 --> 00:05:43,350 그리고 배열의 인덱스로 i를 사용합니다. 79 00:05:43,350 --> 00:05:46,160 전체 배열 이상이 효율적으로 루프를 이러한 방법으로, 80 00:05:46,160 --> 00:05:50,600 그리고 여러분은 배열의 각 지점에 할당 또는 일부 계산을 위해 사용할 수 있습니다. 81 00:05:50,600 --> 00:05:53,920 >> 루프에 대한 첫 번째에, 내가, 0에서 시작 82 00:05:53,920 --> 00:05:58,680 그리고 그 배열의 0 점, 0이란 값의 2 배에 할당됩니다. 83 00:05:58,680 --> 00:06:04,370 그러다 증가, 우리는 값이 1 번 2 배열에서 첫번째 장소를 지정합니다. 84 00:06:04,370 --> 00:06:10,170 그런 다음 우리는 배열에서 N-1을 배치하도록에 다시 그래서 내가 단위로 할당 될 때까지 85 00:06:10,170 --> 00:06:13,370 값을 N-1 번 2. 86 00:06:13,370 --> 00:06:17,810 그래서 우리는 처음 10도 숫자 배열을 만들었습니다. 87 00:06:17,810 --> 00:06:21,970 아마 고르게하는 X보다 변수에 대해 조금 더 멋진 이름 이겠지만, 88 00:06:21,970 --> 00:06:24,760 하지만 그 거리에 물건을 준 것입니다. 89 00:06:24,760 --> 00:06:30,210 루프에 대한 두 번째는 우리가 이미 배열의 내부에 저장 한 값을 인쇄합니다. 90 00:06:30,210 --> 00:06:33,600 >> 배열 선언의 두 가지 유형으로 프로그램을 실행 해 보자 91 00:06:33,600 --> 00:06:36,330 그리고 프로그램의 출력에서​​ 살펴보십시오. 92 00:06:51,450 --> 00:06:57,020 까지 우리가 볼 수 있듯이,이 프로그램은 선언의 두 가지 유형에 대해 동일한 방법으로 동작합니다. 93 00:06:57,020 --> 00:07:02,230 우리가 N에서 중지하지 첫 번째 루프를 변경하는 경우의 또 무슨 일을 살펴 보자 94 00:07:02,230 --> 00:07:05,040 오히려 10,000 말한다. 95 00:07:05,040 --> 00:07:07,430 배열의 끝없는 방법입니다. 96 00:07:14,700 --> 00:07:17,210 죄송합니다. 아마 당신은 전에 본 적이 있어요. 97 00:07:17,210 --> 00:07:20,440 세분화 잘못 프로그램이 작동을 멈췄습니다 의미합니다. 98 00:07:20,440 --> 00:07:24,430 당신은 당신이 만지고하지 말아야 메모리의 영역을 터치 할 때 당신은 이걸보고 시작합니다. 99 00:07:24,430 --> 00:07:27,870 여기 우리는 X의 시작 초과 10,000 곳을 건 드리는거야 100 00:07:27,870 --> 00:07:31,920 어떤 사람은 분명히 우리가 만지는해서는 안됩니다 메모리에있는 곳입니다. 101 00:07:31,920 --> 00:07:37,690 우리 대부분 그래서 아마도 실수로 대신 N의 10,000 넣어하지 않을 102 00:07:37,690 --> 00:07:42,930 우리가 같은 더 미묘한 짓을한다면 쓰기 이하 N 같 무슨 말을 103 00:07:42,930 --> 00:07:46,830 반대로를위한 루프 상태 N. 미만 104 00:07:46,830 --> 00:07:50,100 배열은 0에서 N-1 인덱스를 가지고 기억 105 00:07:50,100 --> 00:07:54,510 이는 인덱스 N은 배열의 끝 넘어 있다는 것을 의미합니다. 106 00:07:54,510 --> 00:07:58,050 이 프로그램은이 경우에 충돌하지 않을 수 있습니다,하지만 여전히 오류입니다. 107 00:07:58,050 --> 00:08:01,950 사실,이 오류가 있다면, 그건 자신의 이름이 너무 일반적입니다 108 00:08:01,950 --> 00:08:03,970 오류 1의 해제. 109 00:08:03,970 --> 00:08:05,970 >> 기본에 대한 그것입니다. 110 00:08:05,970 --> 00:08:09,960 따라서 배열 선언의 2 종류 사이의 주요 차이점은 무엇입니까? 111 00:08:09,960 --> 00:08:13,960 메모리의 큰 블록 어디로가는 하나의 차이입니다. 112 00:08:13,960 --> 00:08:17,660 첫 번째 선언에서, 나는, 브라켓 - 배열 유형을하는 전화 할게 113 00:08:17,660 --> 00:08:20,300 이입니다하지만 더는 종래의 이름을 의미합니다 114 00:08:20,300 --> 00:08:22,480 이 스택에 이동합니다. 115 00:08:22,480 --> 00:08:27,450 나는 포인터 배열 유형에 전화 할게 두 번째에 반해,이 힙에 이동합니다. 116 00:08:27,450 --> 00:08:32,480 이 때, 함수의 반환, 브라켓 배열이 자동으로 deallocated된다는 것을 의미합니다 117 00:08:32,480 --> 00:08:36,419 당신은 명시 적 포인터 배열에 무료로 전화해야하기 때문에 반면에 118 00:08:36,419 --> 00:08:38,010 또는 다른 당신은 메모리 누수가 있습니다. 119 00:08:38,010 --> 00:08:42,750 또한, 브래킷 배열은 실제로 변수가 아닙니다. 120 00:08:42,750 --> 00:08:45,490 이 중요합니다. 단지 상징 이죠. 121 00:08:45,490 --> 00:08:49,160 당신은 컴파일러가 당신을 위해 선택하는 상수로 생각할 수 있습니다. 122 00:08:49,160 --> 00:08:52,970 이것은 우리가 X + + 브라켓 형과 같은 일을 할 수 있다는 것을 의미 123 00:08:52,970 --> 00:08:56,240 이 포인터 유형이 완벽하게 유효하지만. 124 00:08:56,240 --> 00:08:58,270 >> 포인터 유형 변수입니다. 125 00:08:58,270 --> 00:09:01,510 포인터 타입의 경우, 우리는 메모리의 2 개의 블록이 있습니다. 126 00:09:01,510 --> 00:09:06,060 변수 x 자체는 스택에 저장하고 단지 하나의 포인터입니다 127 00:09:06,060 --> 00:09:08,620 하지만 메모리의 큰 블록은 힙에 저장됩니다. 128 00:09:08,620 --> 00:09:11,010 스택에있는 변수 x는 주소를 저장 129 00:09:11,010 --> 00:09:14,010 힙에 메모리의 큰 블록의. 130 00:09:14,010 --> 00:09:17,370 이 중 하나 함축 된 의미는 연산자의 크기입니다. 131 00:09:17,370 --> 00:09:22,480 이 브라켓 배열의 크기를 요청하는 경우, 당신에게 메모리의 큰 블록의 크기를 제공합니다 132 00:09:22,480 --> 00:09:24,620 40 바이트 같은, 133 00:09:24,620 --> 00:09:26,920 하지만 배열의 포인터 타입의 크기를 요청하는 경우, 134 00:09:26,920 --> 00:09:32,740 당신에게 어플라이언스에 단 4 바이트 가능성이 변수 x 자체의 크기를 제공합니다. 135 00:09:32,740 --> 00:09:36,530 포인터 배열 타입 사용, 직접 요청하는 것은 불가능합니다 136 00:09:36,530 --> 00:09:38,530 메모리의 큰 블록의 크기입니다. 137 00:09:38,530 --> 00:09:42,530 우리는 매우 드물게 크기를 원하는 없기 때문에 이것은 보통 많은 제한하지 않습니다 138 00:09:42,530 --> 00:09:46,980 의 큰 메모리 블록, 그리고 우리가 필요한 경우 우리는 보통 그것을 계산할 수 있습니다. 139 00:09:46,980 --> 00:09:51,490 >> 마지막으로, 브래킷 배열은 배열을 초기화에 대한 바로 가기를 제공하기 위해 발생합니다. 140 00:09:51,490 --> 00:09:56,130 우리가 바로 가기 initilization를 사용하여 처음 10도 정수를 작성할 수 방법을 알아 보자. 141 00:10:11,220 --> 00:10:14,470 포인터 배열을 통해이 같은 바로 가기를 할 수있는 방법이 없습니다. 142 00:10:14,470 --> 00:10:18,120 이 메시지는 배열로 무엇을 할 수에 대한 소개입니다. 143 00:10:18,120 --> 00:10:20,990 그들은 당신이 쓰는 거의 모든 프로그램에 표시됩니다. 144 00:10:20,990 --> 00:10:24,390 운이 좋다면 당신은 지금 학생 ID를 예를하는 더 좋은 방법을 볼 수 있습니다 145 00:10:24,390 --> 00:10:26,710 동영상의 처음부터. 146 00:10:26,710 --> 00:10:29,960 >> 내 이름은 롭 보덴 있으며,이 CS50입니다.