1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [주 4, 계속] 2 00:00:02,310 --> 00:00:04,240 [데이비드 J. Malan - 하버드 대학교 (Harvard University)] 3 00:00:04,240 --> 00:00:07,290 [이 CS50입니다. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> 이 CS50이며,이 주 (4)의 끝입니다. 5 00:00:11,290 --> 00:00:14,030 좋은 소식과 나쁜 소식이 그럼. 6 00:00:14,030 --> 00:00:26,240 월요일에 더 강의, 아무 문제 다음 주 설정하지 마십시오. [학생들은 환호] 7 00:00:26,240 --> 00:00:28,680 당신이가는 곳처럼되지 않을 꺼예요. 8 00:00:28,680 --> 00:00:31,590 그러나 우리는 다음주 수요일 대신이있어, 9 00:00:31,590 --> 00:00:37,740 다음 금요일은 우리가 궤도에 머물 수 있도록 강의 한 금요일 강의 당도 마련되어 있습니다. 10 00:00:37,740 --> 00:00:40,580 그러나 모든 것은 평소와 같이 촬영되기 때문에 걱정 없습니다. 11 00:00:40,580 --> 00:00:44,100 >> 그리고과 관련하여 우리가주의 끝으로 무슨 짓을할지 0 퀴즈 12 00:00:44,100 --> 00:00:47,140 코스의 홈페이지 cs50.net 설명에 게시되어 있습니다 13 00:00:47,140 --> 00:00:50,160 그 첫 번째 퀴즈 할 때 당신이 있어야 기대 어떤 종류의. 14 00:00:50,160 --> 00:00:55,100 일반적으로 객관식 사실 - 거짓, 짧은 대답, 짧은 코딩 문제가 될 것입니다. 15 00:00:55,100 --> 00:00:57,360 당신은 동등한를 구현하는 기대하지 않을거야 16 00:00:57,360 --> 00:01:00,030 당신이 pset에서 볼 것이라고 문제,하는 당신은 컴퓨터가 17 00:01:00,030 --> 00:01:03,240 와 디버거와 같은,하지만 작은 코딩 문제가 될 것입니다. 18 00:01:03,240 --> 00:01:06,900 >> 그리고 실제로, CS50는 퀴즈 어떤 의미를 거둘 수있는 가장 좋은 가이드는 같다 19 00:01:06,900 --> 00:01:09,180 cs50.net로 이동되어, 퀴즈 링크로 이동 20 00:01:09,180 --> 00:01:11,920 당신은 퀴즈의 가치가 지난 몇 년 동안 볼 수 있습니다. 21 00:01:11,920 --> 00:01:16,600 그냥 교육 과정이 항상 몇 년 동안 같은되지 않았 음을 알고 있습니다. 22 00:01:16,600 --> 00:01:18,510 때때로 우리는 가끔 뺍 추가 23 00:01:18,510 --> 00:01:20,670 당신은 오래된 퀴즈 중 하나에 몇 가지 항목을 볼 수 있도록하는 경우 24 00:01:20,670 --> 00:01:25,380 당신이 무슨 말 아무 생각이 없다는 것을, 우리가 그것을 커버 않았다고 중입니다 25 00:01:25,380 --> 00:01:27,210 또는 우리가 그것을 커버하는 것이 었죠. 26 00:01:27,210 --> 00:01:31,110 그러나의 리뷰 형태,이 일요일, 월요일하고 화요일 27 00:01:31,110 --> 00:01:34,770 뿐만 아니라 일요일 밤에 - 물론 폭 넓은 검토 세션 - 28 00:01:34,770 --> 00:01:37,500 코스의 홈페이지에 발표 할 시간과 장소 - 29 00:01:37,500 --> 00:01:40,120 이 모든 과정의 교육 친구들과 함께 검토 할 기회를 가질 수 30 00:01:40,120 --> 00:01:44,830 섹션과 전체 클래스로 모두 올해의 재료, 31 00:01:44,830 --> 00:01:48,400 이들은뿐만 아니라 평소와 같이 촬영됩니다. 32 00:01:48,400 --> 00:01:53,380 >> 괜찮아요. 따라서 소동 패스에 하나 댓글 / 실패 드롭 / 추가 할 수 있습니다. 33 00:01:53,380 --> 00:01:57,980 너 어제 밤에 내 노트를 볼 수 있습니다,이 단지 몇 가지 추가적인 안심입니다 34 00:01:57,980 --> 00:02:01,250 당신은 특히 더 편안한 또는 어딘가 사이에 그 나라의 경우 35 00:02:01,250 --> 00:02:04,870 그리고 당신은 당신의 머리에 조금 기분이 36 00:02:04,870 --> 00:02:08,430 실제로 매우 정상적인 있다는 걸, 그리고 장소에 충분한 지원 구조가, 37 00:02:08,430 --> 00:02:13,530 근무 시간 내 이메일 어제 밤에 당이 좀 더 개선에 대한 의도 된 중 하나 38 00:02:13,530 --> 00:02:16,520 그리고 패스 같은 옵션이 /이 같은 클래스에 실패하는도 실현 39 00:02:16,520 --> 00:02:21,540 정말 이런 코스의 가장자리를 벗을 수있는 메커니즘위한 것입니다, 40 00:02:21,540 --> 00:02:24,200 그래서 당신이 저 10, 15, 20 시간 지출하고 다시하는 경우 41 00:02:24,200 --> 00:02:28,160 단지 작동하려면 몇 가지 pset를 얻으려고하고 당신이 거기 방법의 90~95% 걸 알아 42 00:02:28,160 --> 00:02:32,100 하지만 패스에 어떤 빌어 먹을 버그를 발견 / 정렬의 괜찮 모델을 실패 할 수 없습니다. 43 00:02:32,100 --> 00:02:36,230 >> 아이디어는 그 메커니즘과 그런 다음 다른 psets에 초점을 갈 수 있다는 것입니다 44 00:02:36,230 --> 00:02:39,530 거나 자지 또는 당신이 중점을 것입니다 뭐든간에. 45 00:02:39,530 --> 00:02:43,390 당신이 올 때까지 화요일이는 것을 - 기술적으로 5 일 월요일 46 00:02:43,390 --> 00:02:50,840 하지만, 그래서이 오는 화요일 휴일 - 패스에서 전환 / 등급 또는 그 반대로 실패 할 수 있습니다. 47 00:02:50,840 --> 00:02:54,450 그리고 당신은 절벽에 정말이야 그리고 모두 떨어 생각하는 경우, 48 00:02:54,450 --> 00:02:56,440 강의 후에 날 잡아 나 나에게 메모를 드롭 해 주시기 바랍니다. 49 00:02:56,440 --> 00:02:59,990 당신이 작별을 고하기 전에 우리는 적어도 채팅 싶네요. 50 00:02:59,990 --> 00:03:03,470 괜찮아요. 그래서 우리는 마지막에서 훈련 바퀴를 복용 시작했다. 51 00:03:03,470 --> 00:03:06,030 특히, 우리는 문자열에 초점을 맞추 었습니다. 52 00:03:06,030 --> 00:03:09,740 문자열은 CS50 라이브러리에 선언 뭔가있다 53 00:03:09,740 --> 00:03:14,340 구체적으로 cs50.h라는 이름의 파일에 우리는 이번 주하고 다음을 바라 시작된다. 54 00:03:14,340 --> 00:03:17,250 그러나 문자열은 정말 뭔가가 단지 단순화 55 00:03:17,250 --> 00:03:20,980 그 조금 더 arcanely 숯불 *로 설명입니다. 56 00:03:20,980 --> 00:03:24,090 우리가 익숙 숯불. 단지 단일 문자입니다. 57 00:03:24,090 --> 00:03:28,010 그러나 월요일로 * 무엇을 표시된? >> [학생] 포인터. 58 00:03:28,010 --> 00:03:31,290 포인터. 그리고 포인터가 뭐죠? >> [학생] 주소를 입력합니다. 59 00:03:31,290 --> 00:03:33,420 >> 이 주소, 메모리에 위치 같아요. 60 00:03:33,420 --> 00:03:35,910 주소 또는 위치 또는 메모리는 무엇입니까? 61 00:03:35,910 --> 00:03:40,290 다시, 우리 모두는이 일 가능성이 가장 높은 공연이나 RAM 2GB의와 노트북을 가지고 62 00:03:40,290 --> 00:03:44,160 그리고 그 말은 당신이 메모리의 가치를 억 또는 2 억 바이트를 의미합니다. 63 00:03:44,160 --> 00:03:46,240 그리고 정말, 물리적으로 보이는 것과는 상관 없습니다 64 00:03:46,240 --> 00:03:51,220 하지만 자신의 노트북 가지고 각 바이트의 모든 번호를 수 있다는 믿음에 걸릴 - 65 00:03:51,220 --> 00:03:54,580 이 0 바이트이며,이 바이트 1이 2,000,000,000 바이트입니다 - 66 00:03:54,580 --> 00:03:56,100 그 바로 컴퓨터가 그래. 67 00:03:56,100 --> 00:04:00,030 하나의 문자를위한 공간을 할당 할 때, 예를 들어, 68 00:04:00,030 --> 00:04:02,480 그것은 분명히 당신의 컴퓨터의 메모리 어딘가에 살아있다 69 00:04:02,480 --> 00:04:05,860 그리고 아마, 12,345 바이트 번호에 있어요 70 00:04:05,860 --> 00:04:08,470 그리고는 컴퓨터의 메모리에 여기 어딘가에 있습니다. 71 00:04:08,470 --> 00:04:12,630 그리고 그 문자의 다음 주소는 12345입니다. 72 00:04:12,630 --> 00:04:16,140 >> 지금 저를 통해 지금까지 주 0에, 우리는 정말 딸이 걱정하지 73 00:04:16,140 --> 00:04:19,170 우리가 일반적으로 기호를 사용하기 때문에 위치를 기억 일들에 저장 74 00:04:19,170 --> 00:04:22,540 변수와 배열은 실제로 데이터를 얻을 수 있습니다. 75 00:04:22,540 --> 00:04:24,950 그러나 월요일의 모든보다 오늘로, 당신은 지금 할거야 76 00:04:24,950 --> 00:04:27,710 쓰기 프로그램과 모든 더 표현 기능 77 00:04:27,710 --> 00:04:31,330 정말 그러나 만약 당신이 적합 볼 컴퓨터의 메모리를 조작하려면, 78 00:04:31,330 --> 00:04:33,720 좋은 목적과 나쁜 모두, 79 00:04:33,720 --> 00:04:39,620 버그는이 일을 배우는이 시점에서 매우 일반적인 결과 것. 80 00:04:39,620 --> 00:04:42,460 그런데 정말 숯불 *로 의미합니까? 81 00:04:42,460 --> 00:04:46,140 오늘 약속대로 우리가 빙키에 돌아 오면 - 우리로 앞서 가자. 82 00:04:46,140 --> 00:04:48,670 의는 여기에 간단한 예에 가자. 83 00:04:48,670 --> 00:04:53,060 저이 파일 compare.c 등을 저장하고, 난 그냥 여기에 몇 가지 템플릿 코드를도록 84 00:04:53,060 --> 00:05:00,490 그래서 stdio.h를 포함, 나 또한 자신을 포함 해주지 cs50.h. 나는 거기에 확대됩니다. 85 00:05:00,490 --> 00:05:05,850 나 주 주요 INT를 (무효) 쓰기 시작하고 지금은 이런 짓을하고 싶어 보자 : 86 00:05:05,850 --> 00:05:13,520 printf ( "나에게 문자열을한다 :") 그리고 난 문자열 s이 (가) GetString됩니다 사용 87 00:05:13,520 --> 00:05:16,750 사용자의 문자열을 얻으려면 그럼 또 다른 하나는 사용자에게 물어거야. 88 00:05:16,750 --> 00:05:21,870 그리고 난 그를 얻을 GetString을 통해 물어 보자 ( "나 다른 문자열을 줘"). 89 00:05:21,870 --> 00:05:27,020 꽤 일반적인이라면 s와 s는 문자열에 대한 좋은 이름 뒤에 t이 오면 때문에 그것을 t에 전화 할게. 90 00:05:27,020 --> 00:05:30,030 따라서 GetString, 그리고 지금 난 그냥 정신 확인하고 싶어하고 말거야 91 00:05:30,030 --> 00:05:39,770 (들 == t)가 난 ( "! 당신을 \ n 같은 일을 입력") printf 사용자를 말 하겠어요 경우, 92 00:05:39,770 --> 00:05:45,520 다른 나 같은 ( "당신 형식화 된 것을 다른! \ N") 뭔가를 인쇄 할거야 93 00:05:45,520 --> 00:05:48,460 뭐든간에 그 문장이 될 것입니다. 그래서 그런 일. 94 00:05:48,460 --> 00:05:52,200 그런 다음 평소처럼, 난 그냥 아무것도 나쁜 일하지 의미 0을 반환합니다 95 00:05:52,200 --> 00:05:54,400 내가 가서이 프로그램을 컴파일하고 실행하는거야. 96 00:05:54,400 --> 00:05:56,540 >> 그러나 월요일에 우리는이 프로그램을 실행 97 00:05:56,540 --> 00:06:00,420 실제로 HELLO HELLO가 아니며 작별 작별 아니라는 것을 말해 줬다. 98 00:06:00,420 --> 00:06:03,140 우리가 본 문제는 이와 같은 좀 더했습니다. 99 00:06:03,140 --> 00:06:11,450 내가, 내 소스가있는 디렉토리로 이동 여기에 줌, 그리고의 비교하려면 어떻게해야합니까 보자 구요. 100 00:06:11,450 --> 00:06:14,570 괜찮 컴파일. 비교 나 실행할 수 있습니다. 나에게 문자열을한다 :여보세요. 101 00:06:14,570 --> 00:06:16,300 나에게 또 다른 문자열을한다 :여보세요. 102 00:06:16,300 --> 00:06:18,000 당신은 뭔가 다른 일을 입력! 103 00:06:18,000 --> 00:06:22,650 음, 간단하게 50, 50 같은 해 봅시다. 당신은 뭔가 다른 일을 입력! 104 00:06:22,650 --> 00:06:25,740 안녕하세요, 안녕하세요. 그럼 분명히 무슨 일이된다. 105 00:06:25,740 --> 00:06:28,440 하지만 왜에 대한 설명 뭐죠? 106 00:06:28,440 --> 00:06:33,850 분명히, 12 호선 완전히 역기능이다. 107 00:06:34,300 --> 00:06:39,430 여기 근본적인 문제가 무엇입니까? 그래. >> [학생]은 주소를 비교있어. 108 00:06:39,430 --> 00:06:41,850 네, 맞아요. 실제로 주소를 비교있어 109 00:06:41,850 --> 00:06:44,580 있는 HELLO HELLO와가 저장되어 있습니다. 110 00:06:44,580 --> 00:06:48,290 그것은 다시 다시 HELLO 문자를 비교 안 111 00:06:48,290 --> 00:06:52,370 어떤 정말 무슨 일이 있었 때문에,이 시간 우리는 GetString을 사용하고 - 112 00:06:52,370 --> 00:06:56,130 이 칠판은 또 다시 컴퓨터의 메모리입니다 113 00:06:56,130 --> 00:07:00,100 그리고 시작하자 내가 변수 s를 선언 한 후 GetString 전화를 말한다. 114 00:07:00,100 --> 00:07:01,930 내 기억이 어떻게 생겼는데? 115 00:07:01,930 --> 00:07:07,070 하자 임의로 s이 (가)과 같은 말. 이 광장입니다. 116 00:07:07,070 --> 00:07:09,040 그리고 거의 모든 시간이 나는 화면에 메모리의 조각을 그려 한 117 00:07:09,040 --> 00:07:12,860 가 32 비트면 어플라이언스에 있기 때문에 실제로 이와 같은 사각형 그리기 했어요 118 00:07:12,860 --> 00:07:17,380 포인터 주소는 32 비트입니다. 이 정수와 같은입니다. 119 00:07:17,380 --> 00:07:19,420 그래서 컴퓨터 시스템에 따라 다를 수 있습니다. 120 00:07:19,420 --> 00:07:24,630 Mac 또는 PC가 64 비트라는 사실과 막연히 알고있는 분들, 121 00:07:24,630 --> 00:07:28,120 그 사실은, 컴퓨터가 64 비트 포인터를 사용하는 것을 나타냅니다 122 00:07:28,120 --> 00:07:33,730 64 비트 주소 및 나름의 매력 중은 컴퓨터입니다 123 00:07:33,730 --> 00:07:35,560 작년보다 훨씬 더 많은 RAM을 가질 수 있습니다. 124 00:07:35,560 --> 00:07:39,240 짧게 말하면, 과거에 컴퓨터는 32 비트를 사용할 때 125 00:07:39,240 --> 00:07:42,740 주소를 표현하기 위해, 바이트의 가장 큰 숫자는 당신이 대표 수 126 00:07:42,740 --> 00:07:46,280 그 상자 안에 만약 당신이 32 비트가 있다면 요? 127 00:07:46,280 --> 00:07:49,590 2 32 4 억 있기 때문에, 오른쪽, 억​​ 4 그럼. 128 00:07:49,590 --> 00:07:51,370 이 숫자는 과정에서 반복되었습니다. 129 00:07:51,370 --> 00:07:55,240 >> 만 32 비트를 가지고 있으므로 경우에 셀 수 가장 높은 번호는 약 4,000,000,000. 130 00:07:55,240 --> 00:07:58,750 하지만 그게 몇 년 전까지 컴퓨터의 기본 제한했다 131 00:07:58,750 --> 00:08:01,180 만 4,000,000,000만큼 높은 셀 수 있다면 때문에, 132 00:08:01,180 --> 00:08:05,270 당신은 RAM의 8기가바이트 또는 RAM의도 5기가바이트을 구입하는 경우는 문제가되지 않습니다 133 00:08:05,270 --> 00:08:07,780 그 높은 셀 수없는 때문에 쓸모가 없었습니다. 134 00:08:07,780 --> 00:08:11,430 당신은 컴퓨터의 메모리의 처음 3 또는 4 기가 바이트에 액세스 할 수 있습니다. 135 00:08:11,430 --> 00:08:14,410 지금은 저것이 문제의 덜, 당신은 맥북 프로와 Dells을 구입하실 수 있습니다 136 00:08:14,410 --> 00:08:17,680 8 기가 바이트 RAM 혹은 그 이상 요즘으로. 137 00:08:17,680 --> 00:08:24,100 나는이 프로그램에 아주 단순히 포인터를 할당한다면, 포인터, S라고 138 00:08:24,100 --> 00:08:28,370 실제로 우리가이 레이어 뒤로 껍질을해야하기 때문에이 화면에 다음과 같이 보일 수 있습니다. 139 00:08:28,370 --> 00:08:33,520 , 제가​​ 말했듯이 문자열을 유지하지만, 월요일, 문자열은 정말 숯불 *입니다 140 00:08:33,520 --> 00:08:35,590 일부 문자의 주소입니다. 141 00:08:35,590 --> 00:08:39,280 그래서 우리가 지금 GetString을 사용하여 계속에도 불구의이 꺼져 훈련이 휠을 봅시다. 142 00:08:39,280 --> 00:08:42,600 그래서 S 선언 한,이 메모리 덩어리, 32 비트입니다. 143 00:08:42,600 --> 00:08:47,370 기본적으로 메모리에 여기에 무엇입니까? >> [안 들리게 학생 응답] 144 00:08:47,370 --> 00:08:50,040 그게 뭐야? >> [학생] 쓰레기. >> 쓰레기. 그렇지. 145 00:08:50,040 --> 00:08:54,610 당신은 프로그래머가 변수에 값을 넣어하지 않으면 누가이 몇인지 아는 사람? 146 00:08:54,610 --> 00:08:57,990 때때로 당신은 운이하고 10 살인데, 이는, 좋은, 깨끗한 기본값 종류입니다 147 00:08:57,990 --> 00:09:00,310 우리가 월요일 본으로하지만, 가끔이 완료 말도 안돼 148 00:09:00,310 --> 00:09:04,130 어디에서 온 일부 정말 큰 양수 또는 음수? 149 00:09:05,350 --> 00:09:07,010 그래. 이전 >> [학생] 기능. >> 그래. 150 00:09:07,010 --> 00:09:10,170 >> 종종 기억 때문에 앞으로 불려 갔어 기능 151 00:09:10,170 --> 00:09:13,920 당신은 메모리에 함수를 호출로, 그들은 바닥에서 더 많은 공간을 차지 152 00:09:13,920 --> 00:09:17,040 그리고 곧 함수의 반환 등, 그 메모리가 재사용됩니다 153 00:09:17,040 --> 00:09:20,890 라는됩니다 다음 사람에 의해, 누구는 메모리의 동일한 슬라이스를 사용하고 있습니다. 154 00:09:20,890 --> 00:09:23,450 그리고 당신은 거기서 왼쪽으로 쓰레기, 이전 값을 한 경우 155 00:09:23,450 --> 00:09:28,190 우리는 정말 우리가 아무 것도 넣지 않은 경우 어떤 값을 갖는으로 s를 착각 할 수도 있습니다. 156 00:09:28,190 --> 00:09:30,960 그럼이 시점에서 우리 RAM은 다음과 같습니다. 157 00:09:30,960 --> 00:09:36,030 지금 7 호선의 오른쪽에 우리는 GetString를 호출하는 158 00:09:36,030 --> 00:09:40,150 있는 우리는 주 지금 봤는데,하지만 정말하고 GetString입니까? 159 00:09:40,150 --> 00:09:43,350 CS50 직원이 작성한 GetString하는 것은 약간의 지능이다 160 00:09:43,350 --> 00:09:46,500 거기에 사용자가 입력 키와 조회수가 입력 시작 즉시로 161 00:09:46,500 --> 00:09:50,010 얼마나 많은 키 입력은 사용자 히트 한 GetString는 숫자 중에 162 00:09:50,010 --> 00:09:53,360 얼마나 많은 문자 나에 대한 RAM을 할당 할 필요는 없어. 163 00:09:53,360 --> 00:09:55,660 그리고 곳 RAM은에서 유래 누가 알 겠어? 164 00:09:55,660 --> 00:09:58,930 당신의 컴퓨터의 2기가바이트 또는 메모리 년대에 어딘가에 있습니다. 165 00:09:58,930 --> 00:10:05,200 그러나의 컴퓨터가 바로 여기 HELLO라는 단어를위한 공간을 발견했다고 가정하자. 166 00:10:05,200 --> 00:10:08,710 제가 입력 한 단어는 H-E-L-L-O했습니다. 167 00:10:08,710 --> 00:10:13,510 그리고 우리가 문자의 순서로 그려하는 경우, 우리는이처럼 그려 수 있습니다. 168 00:10:13,510 --> 00:10:17,860 하지만 1 추가 일을해야합니다. 어떻게 C에서 문자열의 끝 부분에 속해? 169 00:10:17,860 --> 00:10:20,710 우리는 \ 0로 쓰기 널 (null) 문자. 170 00:10:20,710 --> 00:10:23,980 그것은 기술적으로 번호 0 만, 역 슬래쉬는 모든 명확하게 171 00:10:23,980 --> 00:10:28,150 이 말 그대로 숫자 0, 정수 0입니다; 172 00:10:28,150 --> 00:10:32,440 당신이 키보드에 입력 할 수있는 예를 들어, 견적 - 인용을 끝 맺다의 영에 대해 아닙니다. 173 00:10:32,440 --> 00:10:33,940 그래서이 HELLO입니다. 174 00:10:33,940 --> 00:10:36,350 >> 그리고 우리는 월요일에 무슨 말을 못했다 GetString 같은 기능을 175 00:10:36,350 --> 00:10:39,580 실제로 이러한 모든 주 반환입니까? 176 00:10:39,580 --> 00:10:43,960 그런 일이 실제로 의미하지 않기 때문에 그것은 본질적으로 문자열을 반환 없어 177 00:10:43,960 --> 00:10:47,710 문자열은 존재하지 않기 때문에. 그들은 CS50 라이브러리에서 제조의 일종이야. 178 00:10:47,710 --> 00:10:51,300 더 기술적으로 어떻게 정말 문자열입니다? >> [학생] 그것은 첫 문자입니다. 179 00:10:51,300 --> 00:10:55,950 그렇지. 하지만 사용자가 들어 입력 한 단순히 첫 문자의 주소입니다 180 00:10:55,950 --> 00:11:02,810 그래서, 만약 바이트 수 (123)에서 다음 바이트 124 번에서 그걸 종료 HELLO 내 말을, 181 00:11:02,810 --> 00:11:08,320 125 126, 등등, 최대의 0에서 방금 번호 제 바이트 경우, 182 00:11:08,320 --> 00:11:12,650 어떤 정말 GetString가 반환 것은 문자 그대로 수 (123)입니다. 183 00:11:12,650 --> 00:11:19,270 그래서 S에 넣어됩니다 것은 숫자 (123)가 아닌 문자 H 아닌 단어, HELLO입니다 184 00:11:19,270 --> 00:11:23,130 단순히 나는 HELLO의 첫 글자를 찾을 수 있습니다 주소를. 185 00:11:23,130 --> 00:11:26,500 그러나 충분히 같지 않습니다. 나는 문자열이 아닌 문자를 물었다. 186 00:11:26,500 --> 00:11:32,970 그럼 어떻게 나 컴퓨터는여보세요 가지 H와 같이 알 수 있습니까? 187 00:11:35,760 --> 00:11:37,460 우리가 계약의 종류는 무엇입니까? 그래. 188 00:11:37,460 --> 00:11:40,100 [학생] 한번 더 문자를 찾을 수 자체를 말하는 유지합니다. 정확히 >>. 189 00:11:40,100 --> 00:11:44,570 >> 당신은 문자열 다루고된다이 인간 컴퓨터 대회가 있어요 190 00:11:44,570 --> 00:11:49,410 그렇지 않으면 지금 숯불 별로 알려진, 당신은 단순히 파악해야 191 00:11:49,410 --> 00:11:54,350 삶의 모든 문자열의 끝 정말 그냥 루프와 그 위에 반복하는 것입니다 곳 192 00:11:54,350 --> 00:11:57,820 잠시 루프, 어쨌든, 그래서 당신은 문자열의 끝을 찾을 때 193 00:11:57,820 --> 00:12:02,160 이제 그에서 추측 할 수, 오, 전체 단어 HELLO했다. 194 00:12:02,160 --> 00:12:04,820 이전 프로그래밍 경험을 가진 분들이 자바로 알 수도 195 00:12:04,820 --> 00:12:09,880 당신은. 전화 길이와 다른 프로그래밍 언어에서 길이 또는 이와 유사한를 호출 할 수 있습니다. 196 00:12:09,880 --> 00:12:14,060 언어 많이, 특히 상황이 객체 지향 언어라는 있기 때문 이예요 197 00:12:14,060 --> 00:12:18,580 뭔가의 길이는 데이터 자체의 작품의 캡슐화 내부의 종류입니다 198 00:12:18,580 --> 00:12:24,000 많은 우리 캡슐화 ID와 이름과 월요일에 학생의 내부 가옥이 좋아요. 199 00:12:24,000 --> 00:12:28,700 그러나 C는 훨씬 낮은 수준입니다. 당신이 전에 그 조건을 들었는지 아무 개체 나 클래스가 없습니다. 200 00:12:28,700 --> 00:12:31,490 당신이 가진 모든 정말 메모리 주소입니다. 201 00:12:31,490 --> 00:12:35,540 그래서이 흥미로운 데이터 구조를 나타내는의 옛날 방식의 일종이다. 202 00:12:35,540 --> 00:12:38,760 당신은 첫 번째 문자의 주소 등의 시작 값을 가지고 203 00:12:38,760 --> 00:12:42,340 그리고 모두가 따라 할 것에 동의하는 단순한 임의의 규칙. 204 00:12:42,340 --> 00:12:46,420 따라서 문자열 길이가 구현되는 방법, 우리는 제안 했어? 205 00:12:46,420 --> 00:12:51,360 여러분 중 일부는 지금 몇 번 사용했습니다 나 strlen, 나 strlen. 그것은 바로, 아주 간단한거야? 206 00:12:51,360 --> 00:12:53,060 이 코드 2 줄 같아. 207 00:12:53,060 --> 00:12:56,140 그것은 아마 추가 지역 변수와 함께 거의 일종의을위한 루프입니다. 208 00:12:56,140 --> 00:13:00,540 그러나 나 strlen은 \ 0를 찾아 다음 포인터를하고 있습니다. 209 00:13:00,540 --> 00:13:05,190 >> 그리고 빨리 그것을 발견으로, 그것이 해당 문자열에서 납치 단계의 총 수를 반환 할 수 있습니다. 210 00:13:05,190 --> 00:13:07,150 그래서 우리는 다음에 무슨 일이 일에서 추론 할 수 있습니다. 211 00:13:07,150 --> 00:13:11,850 나는 10 호선에서 수행 한대로 나는 t를 선언 한 후 가정 해 보겠습니다. 212 00:13:11,850 --> 00:13:14,280 이 일부 쓰레기 값입니다. 누가 처음 알아? 213 00:13:14,280 --> 00:13:18,490 그러나 10 줄의 오른쪽에 다시 GetString 전화 했어. 214 00:13:18,490 --> 00:13:20,050 이 문제가 끝나는 장소를 누가 알 수 있겠어요? 215 00:13:20,050 --> 00:13:23,830 하자 임의로 운영 체제가 여기에 오는 이상을위한 공간을 찾을 수 있다고합니다. 216 00:13:23,830 --> 00:13:28,610 나는 다시 우연히 H-E-L-L-O를 입력 할 일 217 00:13:28,610 --> 00:13:31,260 그래서 우리는 그림의 같은 종류를 그릴 수 있습니다. 218 00:13:31,260 --> 00:13:34,290 하지만 다시 그려야이 사진을 표시 한 사실은 고의적 인 것입니다 219 00:13:34,290 --> 00:13:37,720 그 때문에 이것보다 HELLO 다른. 220 00:13:37,720 --> 00:13:43,920 그래서 여기이 장소 456 일 수도이 457이며, 등등. 221 00:13:43,920 --> 00:13:47,170 물음표 한 번있는 곳 그래서 넣어주지? 222 00:13:47,170 --> 00:13:50,190 이 경우 456합니다. 223 00:13:50,190 --> 00:13:53,540 우리는 오늘 이후 때문에 정말 임의의 숫자를 선택하고 224 00:13:53,540 --> 00:13:57,110 우리는 아무것도 주소가 무엇인지에 대해서 왜 그렇게 신경을하지 않을거야. 225 00:13:57,110 --> 00:14:02,690 우리가 걱정하는 건 우리가 HELLO 같은 데이터의 일부 부분의 주소를 알아낼 수 있다는 것입니다. 226 00:14:02,690 --> 00:14:07,100 >> 그래서 정말 메모리 주소에 대해 얘기 할 때 대부분의 사람들은 컴퓨터 과학에서하는 일 227 00:14:07,100 --> 00:14:10,210 그리고, 특히 포인터에 대해 얘기 228 00:14:10,210 --> 00:14:14,220 이 물건이 실제로 어디에 무슨 상관 - 123 것 자체가 귀찮게보다는 229 00:14:14,220 --> 00:14:17,440 우리는 단지 몇 가지 숫자 주소 것을 알고 - 230 00:14:17,440 --> 00:14:22,180 우리는 세계를 단순화하고 단지의 해당 문자를 가리키는 말 231 00:14:22,180 --> 00:14:25,080 그리고 t는 문자를 가리키고 있습니다. 232 00:14:25,080 --> 00:14:27,430 그리고 화살표 있다는 사실은 매우 의도적이다 233 00:14:27,430 --> 00:14:31,610 말 그대로 지금 s이 (가) H와 t에서 가리키고 있기 때문에 또 다른 H에 가리키고 있습니다 234 00:14:31,610 --> 00:14:34,720 하루의 끝에서,이 주소가 무엇인지 상관,하지 않기 때문에 235 00:14:34,720 --> 00:14:40,240 하지만 우리가 코드의 일부 조각을 그 주소를 표현 할 수있는 능력을 가지고이 문제를 않습니다. 236 00:14:40,240 --> 00:14:42,730 우린 단지 아직이 주소를 조작하지 않은 237 00:14:42,730 --> 00:14:47,770 그래서 우리는 우리가 끼어 들어도와 포인터와 함께 일을 분류 할 수있는 곳이 표시됩니다 238 00:14:47,770 --> 00:14:52,030 하지만 말 그대로 12 현재 행에 대한 어떤 값이 우리가 비교 아르 239 00:14:52,030 --> 00:14:55,500 12 호선이 이야기에 따라? 240 00:14:56,570 --> 00:15:01,290 우리는 456-123 동일한 같다 건가요? 그리고 확실히 경우 없습니다. 241 00:15:01,290 --> 00:15:05,320 심지어 개념적으로,이 포인터는 확실히이 동일하지 않습니다 242 00:15:05,320 --> 00:15:09,500 , 당신은 두 번 GetString라고하며, GetString 영리 슈퍼 영웅이 될하려고하지 않기 때문에 243 00:15:09,500 --> 00:15:12,470 가 실현하려고하지 않습니다, 오, 당신은 5 분 전에 HELLO 입력, 244 00:15:12,470 --> 00:15:15,090 내가 전에 준으로 나에게 그 같은 포인터를 주자, 245 00:15:15,090 --> 00:15:18,450 그냥 메모리의 새로운 덩어리 당신이 그것을 매번 전화 할 때마다 할당합니다. 246 00:15:18,450 --> 00:15:20,350 >> 우리는이 문제를 얼마나 해결하나요? 247 00:15:20,350 --> 00:15:24,270 높은 수준되면 난 문자열 HELLO HELLO을 비교하고 싶어 - 248 00:15:24,270 --> 00:15:28,680 나는 포인터 상관 없어 - 내가 질문에 대답을 어떻게해야할까요, 249 00:15:28,680 --> 00:15:31,980 사용자는 같은 일을 입력 거죠? 무슨 일이 필요한거야? 그래. 250 00:15:31,980 --> 00:15:35,200 [학생] 기능을 사용합니다. >> 그 상자의 기능을 사용할 수 있습니다. 251 00:15:35,200 --> 00:15:38,170 나는 strcmp, S-T-R-C-m-P라는 함수를 사용할 수 있습니다 252 00:15:38,170 --> 00:15:41,190 문자열 비교라고 말하는 축약 버전입니다. 253 00:15:41,190 --> 00:15:45,070 그리고 우리가 들어갈 경우, 예를 들어, 오늘날의 유인물 중입니다, 2를 비교 254 00:15:45,070 --> 00:15:46,690 나는 정확히 않습니다. 255 00:15:46,690 --> 00:15:51,750 나는, 26 정도까지 아래에 다른 모든 1 호선에서 같은 유지 256 00:15:51,750 --> 00:15:54,360 지금이 부분은 조금 변경되었습니다 확인합니다. 257 00:15:54,360 --> 00:15:57,690 가 잠시 선 28 무시하고 이것에만 신경을 보자. 258 00:15:57,690 --> 00:16:00,410 우리는 str을 비교는 않는 월요일 뭐라고 했어요? 259 00:16:00,410 --> 00:16:05,200 그것은이 경우에는 두 포인터, s 및 t을 복용하는 과정을 처리 260 00:16:05,200 --> 00:16:08,480 정렬 거의 그 두 글자에 그 손가락을 넣어 261 00:16:08,480 --> 00:16:11,530 과가 수행해야하는 것은 for 루프 동안 루프 나 같은 것입니다 262 00:16:11,530 --> 00:16:16,050 그리고이이 같은하다고 말한거야? 그렇다면,이 손가락이나 앞으로 포인터를 이동합니다. 263 00:16:16,050 --> 00:16:17,970 이러한 동일,이 같은이 같은, 264 00:16:17,970 --> 00:16:22,710 이 같은,이 같은? 그리고 오, 오, 나는 s와 t 모두에서 문자열의 끝에서입니다. 265 00:16:22,710 --> 00:16:26,780 어떤 모순을 발견하지 않았습니다. 예, 문자열은 동일합니다. 266 00:16:26,780 --> 00:16:31,940 두 문자열이 같은 경우와는 str, 분명히이 수익을 어떻게 비교합니까? 제로. 267 00:16:31,940 --> 00:16:35,900 그럼 0이 경우 좋은 이유는 -1 또는 1을 반환하는 경우 268 00:16:35,900 --> 00:16:40,560 그 친구는 단지 t 알파벳 순으로 전 또는 t 뒤에 오는 일이 있다는 것을 의미합니다. 269 00:16:40,560 --> 00:16:43,760 그 이유는 문자열이 앞에 오는 정보를 알려 함수가 유용 할 것 270 00:16:43,760 --> 00:16:46,720 또는 사전에 후? 271 00:16:46,720 --> 00:16:48,740 [학생] 검색하는 중입니다. >> 검색 및 정렬. 272 00:16:48,740 --> 00:16:51,730 >> 그럼 당신은 바이너리 검색 또는 거품 정렬과 같은 일을 또는 정렬 병합 할 수 있습니다 273 00:16:51,730 --> 00:16:53,230 당신은 일을 비교해야 곳. 274 00:16:53,230 --> 00:16:56,420 지금까지 우리는 모서리를 잘라 종류가 있어요 만 정렬 이야기 275 00:16:56,420 --> 00:16:59,430 숫자의 맥락에서 얘기하고 친절하게 쉽게, 때문에 276 00:16:59,430 --> 00:17:02,430 하지만 확실히 문자열, 사과와 바나나를 비교할 수 277 00:17:02,430 --> 00:17:05,349 사과는 마찬가지로, 바나나 앞에 와야하는 것으로 알려져 경우 때문에, 278 00:17:05,349 --> 00:17:09,319 당신이 비디오에 병합 정렬을했던 롭과 같은 메모리에 주위에 문자열을 이동할 수 있습니다 279 00:17:09,319 --> 00:17:15,880 우리는 선택 정렬, 삽입 정렬, 풍선 정렬과 무대에서 여기 했어요. 280 00:17:15,880 --> 00:17:18,710 어디 다른 우리는이 걸릴 수 있습니다? 의이 일을 해 보자. 281 00:17:18,710 --> 00:17:23,980 의하자 일종의 잠시 동안 그 수업을 잊지 지금 시도하고 다음을 할 1.c 복사합니다. 282 00:17:23,980 --> 00:17:26,800 라인 21 나는 인쇄 무언가를 말 283 00:17:26,800 --> 00:17:28,520 그때는 사용자의 문자열을 나타납니다 284 00:17:28,520 --> 00:17:30,690 그럼 내가이 일을 알아보고 있어요. 285 00:17:30,690 --> 00:17:33,620 우리는 정말 아직이 버릇이라도,하지만 지금은이 작업을 수행 보낼 수있다. 286 00:17:33,620 --> 00:17:40,990 다시이 층 껍질을 벗기면 실제로합시다. 이건 정말 숯불 *입니다. 이 사람은 정말 숯불 *입니다. 287 00:17:40,990 --> 00:17:45,690 그럼 S == NULL 여부를 확인 할 무엇을 의미합니까? 288 00:17:45,690 --> 00:17:48,380 이 판명 당신은 GetString 같은 함수를 호출 할 때 289 00:17:48,380 --> 00:17:51,540 이상 일반적으로 단지 몇 가지 메모리를 제공하는 컴퓨터를 물어 290 00:17:51,540 --> 00:17:53,030 뭔가 잘못 갈 수 있습니다. 291 00:17:53,030 --> 00:17:56,630 당신 미쳤어 메모리의 테라 바이트의 컴퓨터를 물어볼 수 292 00:17:56,630 --> 00:18:01,780 그냥 컴퓨터에 존재하지 않는 메모리의 바이트 조를 요청하여, 293 00:18:01,780 --> 00:18:05,130 하지만 GetString 및 기타 기능은 너 한테 소리지르 중 일부 방법이 필요합니다 294 00:18:05,130 --> 00:18:06,820 당신은 너무 많이 요구 한 경우. 295 00:18:06,820 --> 00:18:10,450 더 많은 메모리를 요구 한 경우 그리고 GetString은이 작업을 수행하는 방법입니다 296 00:18:10,450 --> 00:18:14,250 그 슈퍼, 슈퍼 낮은 확률이라도 컴퓨터에서 사용할 수있는 것보다 297 00:18:14,250 --> 00:18:17,730 우리는 모두 입력을 누르 다음 조 문자를 입력하고 갈 수 없기 때문에 298 00:18:17,730 --> 00:18:21,980 하지만 할 수 있지만 낮은 확률, 난 여전히 경우를 대비해서 그것을 확인하려면 299 00:18:21,980 --> 00:18:26,120 그리고 특별한 가치 GetString, 답변, 및 기타 기능 반환하는 300 00:18:26,120 --> 00:18:30,630 뭔가 잘못됐다고 경우 모두 대문자로 NULL입니다. 301 00:18:30,630 --> 00:18:36,520 >> 그리고 NULL 무엇입니까? NULL 그냥 포인터를 표현하기 위해 발생합니다. 이 메모리 주소 0입니다. 302 00:18:36,520 --> 00:18:40,800 이 내 컴퓨터의 메모리 인 경우 세계, 그 임의로 결정 - 당신이 알아요? - 303 00:18:40,800 --> 00:18:46,260 우리는 모든 컴퓨터의 메모리가 단 1 바이트를 뺏으려고하고,이 위치 0입니다. 304 00:18:46,260 --> 00:18:49,560 우리는 그것을 NULL의 별명을 부여 할거야, 우리는 약속 할거야 305 00:18:49,560 --> 00:18:52,660 우리는 실제로 실제 데이터를 입력하지 않겠다고 306 00:18:52,660 --> 00:18:56,770 우리는 임의의 특별한 가치, 0, 일명의 NULL이 필요하기 때문에 307 00:18:56,770 --> 00:19:00,230 뭔가 일이 잘못되면 Google은 사용자의 소리 할 수​​ 있도록. 308 00:19:00,230 --> 00:19:03,590 그렇지 않으면 0 여기서 뭔가를 넣어 의미 인지도 몰라요 309 00:19:03,590 --> 00:19:05,490 아니면 뭔가 잘못되었을 의미합니까? 310 00:19:05,490 --> 00:19:09,190 우리는 모두 NULL 의미 아무것도 반환되지 않았습니다 동의해야 311 00:19:09,190 --> 00:19:11,700 실제 주소가 반환되지 않았습니다. 312 00:19:11,700 --> 00:19:15,210 자, 여기 나는 그냥 내 인간의 규칙을 채택하는거야 주에서 1을 반환 313 00:19:15,210 --> 00:19:17,040 뭔가 잘못되면. 314 00:19:17,040 --> 00:19:20,650 주의 반환 대회가 0 좋은 경우를 반환하는 것입니다 때문 이예요 315 00:19:20,650 --> 00:19:22,990 1 또는 다른 값이 나쁜 경우. 316 00:19:22,990 --> 00:19:28,200 그러나 GetString 및 NULL 메모리 반환에 계약이 뭔가 나쁜되면 한 기능입니다. 317 00:19:28,200 --> 00:19:33,480 >> 좋아요. 그래서 불행히도, 선 27, 그게하지만 슈퍼 간단한 완전히 문자열을 복사하지 못합니다. 318 00:19:33,480 --> 00:19:35,740 이유는 무엇입니까? 우리는이 다음과 같이 볼 수 있습니다. 319 00:19:35,740 --> 00:19:40,120 나는 s의 사본을 만드는하고 t 전화 할 줄 27에서 소유권을 주장거야. 320 00:19:40,120 --> 00:19:45,790 그래서 2 문자열이 시간에 대한 사용자 의견을 묻는 게 아니에요, 난 그저 s의 값을 말 321 00:19:45,790 --> 00:19:47,870 뿐만 아니라 t에 넣어해야합니다. 322 00:19:47,870 --> 00:19:52,890 이제 막 29 이후 내가 뭘하고있는 거지 줄이 얼마나 깨진 입증 하는가? 323 00:19:52,890 --> 00:19:56,980 t의 길이가 0보다 큰 경우 우선 확인하고 있어요. 324 00:19:56,980 --> 00:19:59,330 거기에 어떤 문자열이 있어요. 사용자는 인치 무언가를 입력 325 00:19:59,330 --> 00:20:03,410 분명 선하고 32, 무엇입니까? 326 00:20:03,410 --> 00:20:08,910 [안 들리게 학생 응답] >> 오른쪽. 당신은 가지 내가하는 일의 말에서 유추 할 수 있습니다. 327 00:20:08,910 --> 00:20:13,200 그러나 엄밀히 말해서,이 뭐하는 거지? t는 [0] 무엇을 제시 하는가? 328 00:20:13,200 --> 00:20:15,140 [학생] 0번째 문자. >> [Malan] 0번째 문자. 329 00:20:15,140 --> 00:20:19,620 또는 더 인간 같은 t의 첫 번째 문자, 그 무엇이든간에, H 어쩌면 이번 케이스는 아니군요. 330 00:20:19,620 --> 00:20:24,990 그리고 toupper는 말하지 않습니다. 그것은 t의 0번째 문자를 capitalizes하고 그것을 변경합니다. 331 00:20:24,990 --> 00:20:28,430 이 t의 0번째 문자를 의미합니다 그래서,이 대문자하기 332 00:20:28,430 --> 00:20:30,320 그 같은 위치에 다시 넣어. 333 00:20:30,320 --> 00:20:35,540 제가 소문자로 인사 입력하면 그럼, 그 수도 H.에 소문자 H을 변경해야합니다 334 00:20:35,540 --> 00:20:41,400 그러나 문제는 라인에 35 제가는 건 36 우리 s와 t에 인쇄이라는 것입니다. 335 00:20:41,400 --> 00:20:43,120 그리고 육감이 뭐죠? 336 00:20:43,120 --> 00:20:47,250 난 정말 모두 소문자로 인사 입력 있는지 무엇을 할까? 337 00:20:47,250 --> 00:20:52,280 어떻게 인쇄한다는거야? >> [안 들리게 학생 응답] >> 그게 뭔데? 338 00:20:52,280 --> 00:20:58,360 [학생] 빅 H 나머지 작은. 작은 >> 큰 H 나머지 어떤 용도로, s 또는 t? 339 00:20:58,360 --> 00:21:03,170 [학생] 모두 있습니다. >> 둘 다. 그렇지. 그럼 여기서 무슨 일이 벌어 보자. 340 00:21:03,170 --> 00:21:08,380 >> 내가 가서이를 컴파일한다. 이 copy1하므로 copy1을합니다. 괜찮아요. 341 00:21:08,380 --> 00:21:14,840 소문자 인사 : 저 어서 가서 copy1를 실행 입력, 뭔가 말을 듣지 확대. 342 00:21:14,840 --> 00:21:19,570 , 그것은 복사를 대문자로 표기하지만, 분명히뿐만 아니라 원래를 대문자로 표기 343 00:21:19,570 --> 00:21:22,070 어떤 지금은이 이야기에서 무슨 일이 있기 때문에? 344 00:21:22,070 --> 00:21:27,030 라인 27에서 I는 실제로는 문자열을 복사 할 것 같지 않아 345 00:21:27,030 --> 00:21:30,450 하지만 직관적 경우가되는 기대했을 수도하더라도, 346 00:21:30,450 --> 00:21:33,680 이 그림에 대해 생각한다면, 어떻게 정말 나는 짓을 한거야? 347 00:21:33,680 --> 00:21:35,410 사진의 절반은 동일합니다. 348 00:21:35,410 --> 00:21:39,390 t 아직 이야기에 존재하지 않도록 그럼 다시 시간을 몰게. 349 00:21:39,390 --> 00:21:43,160 S 그 이야기에 존재 수 있지만, 가자여이 시간을 소문자. 350 00:21:43,160 --> 00:21:46,710 그래서 실제로 인치 입력 한 저 드릴게요 351 00:21:46,710 --> 00:21:51,280 여기이 경우에서 우리는 H, E, L, L-O를 갖추고 있습니다. 352 00:21:51,280 --> 00:21:58,050 우리는 문자의 순서로 그려 줄게, 내 구분 라인을 넣어 내 \ 0. 353 00:21:58,050 --> 00:22:05,980 그래서 우리가 24 틱을 통해 가능한 한 빨리 1 호선과 같은 곳이며, 어림 잡아서, 실행하고 있습니다. 354 00:22:05,980 --> 00:22:07,800 이건 내 메모리의 그림입니다. 355 00:22:07,800 --> 00:22:10,800 I 줄 27에 도착하면, 어떤 일이 벌어 질까요? 356 00:22:10,800 --> 00:22:14,730 전 맘에 들어요, 난이 사각형으로 그려 줄게 포인터를 얻을. 357 00:22:14,730 --> 00:22:19,740 그것은 t라고. 그리고 기본적으로 그 값이 뭐야? 누가 알 겠어? 일부 쓰레기 값입니다. 358 00:22:19,740 --> 00:22:22,060 >> 그래서 그 거리에 물음표와 같은 추상적드립니다. 359 00:22:22,060 --> 00:22:27,670 그리고 곧 선 27 오른쪽은 실행으로 내가이 t 내부 넣는 이유는 무엇입니까? 360 00:22:27,670 --> 00:22:30,770 S에 같은 일. 361 00:22:30,770 --> 00:22:34,120 잠시 동안 우리는 화살표의 추상화를 제거하고 우​​리 말한다면 362 00:22:34,120 --> 00:22:40,330 오,이게 당신이 t는 초, 세미콜론를 얻을 수 말할 때, 메모리로드 주소 123입니다 363 00:22:40,330 --> 00:22:42,700 당신은 문자 그대로 여기에 123을 높이는 데 큰 도움이됩니다. 364 00:22:42,700 --> 00:22:45,200 우리가 가지 사진과 함께 다시 세계를 단순화 지금한다면, 365 00:22:45,200 --> 00:22:48,750 만약 당신이 정말 한 것은 당신의 세계에 또 다른 화살표를 추가 366 00:22:48,750 --> 00:22:52,910 그 t에서 같은 정확한 문자열로는 눈치입니다. 367 00:22:52,910 --> 00:22:59,730 그러니까 줄 31 32 실은 t [0] 변경에 대해 갈 때, 368 00:22:59,730 --> 00:23:05,580 t이 무슨 날인지 [0] 지금은 확실히 동의어? S [0] 369 00:23:05,580 --> 00:23:07,030 그래서 그 모든 상황이 있습니다. 370 00:23:07,030 --> 00:23:09,900 그리고 이런 종류의 불구하고 느낌이 약간 낮은 수준과 마법 371 00:23:09,900 --> 00:23:12,760 그리고 이런 종류의 아마 직관적이 단지 성공 했어야 것 같아요 - 372 00:23:12,760 --> 00:23:15,410 전에 일의 사본을 만들어 봤는데 그냥 일 - 373 00:23:15,410 --> 00:23:18,590 당신이 실제로 문자열 게 뭔지에 대해 생각한다면, 그것은 숯불 *입니다. 374 00:23:18,590 --> 00:23:21,700 그게 무엇인가? 그것은 어떤 문자의 주소입니다. 375 00:23:21,700 --> 00:23:24,930 그리고 아마도 더 많은 의미가 당신이 뭔가를하려고 할 때 376 00:23:24,930 --> 00:23:29,220 이와 같은 슈퍼 겉보기에 간단한, 당신이하고있는 모든 복사 메모리 주소입니다. 377 00:23:29,220 --> 00:23:32,530 당신은 실제로는 문자열 자체와 아무 짓도 안하고 있습니다. 378 00:23:32,530 --> 00:23:37,500 당신이 모르는 경우에도 당신은 코드에이 문제를 해결 방식을 379 00:23:37,500 --> 00:23:45,080 높은 수준의, 개념적, 우리는 분명히 s의 진정한 사본을 강타하기 위해 어떻게해야하나요? 380 00:23:46,670 --> 00:23:48,820 그래. >> [학생] 그것에게 새 위치를 줘요? 정확히 >>. 381 00:23:48,820 --> 00:23:50,800 >> 우리는 t에게 새로운 위치를 제공해야합니다. 382 00:23:50,800 --> 00:23:55,230 우리는 어떻게 든 우리가 메모리의 새로운 덩어리를하는 세계를 만들 필요가 383 00:23:55,230 --> 00:24:00,090 단지 명확성의 위해 바로 이것 아래 그릴거야,하지만이있을 필요가 없다. 384 00:24:00,090 --> 00:24:04,880 그러나 같은 크기이어야합니다, 그래서 제가 같은 장소에서 이러한 수직 라인을 그릴 수 있습니다. 385 00:24:04,880 --> 00:24:09,720 이 처음 모든 쓰레기 인 경우는 괜찮아요. 누가가 발생했습니다인지 아는 사람? 386 00:24:09,720 --> 00:24:13,850 내가 원하는 그러나 1 단계 많은 메모리로 내놔해야 할 것입니다 387 00:24:13,850 --> 00:24:18,630 인사의 사본에 맞게, 다음, 여기 H를 복사하는 방법을 여기에 전자를 파악 388 00:24:18,630 --> 00:24:20,390 여기 등등 리터. 389 00:24:20,390 --> 00:24:24,880 세부 정보 중 일부가 여전히 추상적 경우에도 그러나 이미 너무 눈에 띄어서 기분이해야합니다. 390 00:24:24,880 --> 00:24:28,690 이 일에이 문자열을 복사하려면, 그냥 루프 나 while 되풀이을위한 391 00:24:28,690 --> 00:24:31,580 또는 당신은 모든 더 익숙하게 한되는 것을. 392 00:24:31,580 --> 00:24:35,970 그럼 이렇게 해보자. 저 copy2.c로 가자. 393 00:24:35,970 --> 00:24:43,270 copy2.c에서 우리는 라인 27를 제외하고 거의 동일한 프로그램을 갖추고 있습니다. 394 00:24:43,270 --> 00:24:47,260 , 조금 복잡한 보이는,하지만 우리는 조각으로 조각을 내려 어기면 395 00:24:47,260 --> 00:24:48,950 왼쪽은 동일합니다. 396 00:24:48,950 --> 00:24:52,790 숯불 * t은 물음표와 함께이라도 메모리에이 일을 만듭니다 397 00:24:52,790 --> 00:24:54,680 우리가 아무 생각이 없기 때문에 기본적으로이거야. 398 00:24:54,680 --> 00:24:57,920 오른쪽에 우리는 이제, 새로운 기능, malloc을 소개하고 399 00:24:57,920 --> 00:25:00,640 메모리 할당을 위해, 나에게 메모리를 제공 400 00:25:00,640 --> 00:25:06,900 그리고 무리가 소요 얼마나 많은 인수, 얼마나 많은 괄호 안의 일 있었나요? 401 00:25:09,660 --> 00:25:12,130 나는 1과 2의 murmurings을 듣긴했는데 그냥 1입니다. 402 00:25:12,130 --> 00:25:15,320 괄호 안의 단 1 가지가 의미없이 쉼표가 없습니다. 403 00:25:15,320 --> 00:25:17,720 다른 괄호가 비록, 내가 강조하게 404 00:25:17,720 --> 00:25:21,460 가장 바깥 쪽 괄호 안에있는 건하고,이 표현은 다음과 같습니다 405 00:25:21,460 --> 00:25:25,880 (나 strlen (들) + 1) * sizeof (숯불). 406 00:25:25,880 --> 00:25:29,190 우리가 실제로 통해 생각한다면 그럼, 저에게 s의 길이를 제공 답니다. 407 00:25:29,190 --> 00:25:34,440 왜 길이에 1을 추가하지만인가? >> [안 들리게 학생 응답] 408 00:25:34,440 --> 00:25:40,200 그렇지. 우리는 꼬리에서이 사람을위한 공간, 더 영어​​ 의미가 없다 여섯 번째 문자가 필요 409 00:25:40,200 --> 00:25:42,250 하지만 특별한 프로그래밍 의미를 가지고있다. 410 00:25:42,250 --> 00:25:46,800 >> 그래서 우리가 그 일에 대한 + 1이 필요했기 때문에 나 strlen 반환 길이의 인간 예상, 411 00:25:46,800 --> 00:25:50,890 안녕하세요 5, 당신에게 추가 널 문자를 제공하지 않습니다. 412 00:25:50,890 --> 00:25:52,980 그래서 수동으로 + 1이 추가 할 수 있습니다. 413 00:25:52,980 --> 00:25:56,060 그리고 이것은의 * 크기는 (자), 우리는이 전에 보지 못했어요. 414 00:25:56,060 --> 00:25:57,480 이 기술적으로 기능하지 않습니다. 415 00:25:57,480 --> 00:26:04,150 단지 어떤 크기 것은 컴퓨터에 일부 데이터 형식입니다을 알려줍니다 특수 키워드의 416 00:26:04,150 --> 00:26:06,980 현실에서 있기 때문에, 우리 중 일부는 32 비트 컴퓨터를 갖추고 있습니다. 417 00:26:06,980 --> 00:26:10,900 집에서 꽤 오래된 컴퓨터를 가지고 있고, 그것은 단지 포인터를 나타 내기 위해 32 비트를 사용합니다. 418 00:26:10,900 --> 00:26:13,900 나는 데이터 형식의 크기를 한 경우 그리고, 그것은 32 비트 수 있습니다. 419 00:26:13,900 --> 00:26:18,300 내 새로운 멋진 컴퓨터를 사용한다면, 저는 64 비트의 값을 돌려 수 420 00:26:18,300 --> 00:26:20,510 주소 같이하십시오. 421 00:26:20,510 --> 00:26:25,400 따라서이 경우, 단지 슈퍼 안전을 위해, 우리는 같은 하드 코드 뭔가를하지 않을거야 - 422 00:26:25,400 --> 00:26:28,740 그래, 우리가 지금까지 말을했는지에 따라 문자의 크기를 무엇입니까? 423 00:26:28,740 --> 00:26:34,450 우리는 거의가 1 바이트이고, 그 이사회에서 거의 사실이야 말로 말했습니다. 424 00:26:34,450 --> 00:26:37,000 다시 한 번, 가정은 나쁜 경향이 있습니다. 425 00:26:37,000 --> 00:26:40,850 사람들이 당신이 의도하지 않은 방식으로 소프트웨어를 사용하는 경우 그들은 버그가 소프트웨어에 연결되어 있습니다. 426 00:26:40,850 --> 00:26:44,750 그럼 가자 추상적이 거리에 있으며 더 많은 총칭 말 427 00:26:44,750 --> 00:26:46,830 나는 기억이 많은 덩어리가 필요 428 00:26:46,830 --> 00:26:50,210 메모리의 각 덩어리는 문자의 크기에 상응해야 429 00:26:50,210 --> 00:26:54,870 이 경우 1 같은 사실에있는 것입니다,하지만 그것을 작성하는 더 일반적인 방법입니다. 430 00:26:54,870 --> 00:27:00,460 단어가 인사하는 경우 그래서, 얼마나 많은 바이트 malloc 무리가 인사에 대한 할당합니까? 431 00:27:00,460 --> 00:27:04,980 [학생] 여섯. >> 여섯. 우리가 화면에 물음표가 그대로 많은. 432 00:27:04,980 --> 00:27:07,800 그리고 지금 GetString의 이해를 바탕 같아요 걸릴 433 00:27:07,800 --> 00:27:12,790 malloc은 아마도 무엇을 반환합니까? >> [학생] 주소를 입력합니다. 434 00:27:12,790 --> 00:27:17,020 어떤 주소? 메모리의 첫 번째 청크의. 435 00:27:17,020 --> 00:27:20,670 >> 우리는 뭐야이 아무 생각이 없기 때문에 다른 기능 436 00:27:20,670 --> 00:27:23,010 이전에이 메모리를 사용하는 것 같다. 437 00:27:23,010 --> 00:27:28,380 그러나 malloc은 GetString 같은 메모리의 첫번째 바이트의 주소를 반환 438 00:27:28,380 --> 00:27:30,540 당신을 위해 정해 것을. 439 00:27:30,540 --> 00:27:38,380 그러나, 그런 일이 수행하지 않는 것은 백 슬래시 널 문자로이 기입되어 있습니다 440 00:27:38,380 --> 00:27:43,030 ints, 문자열, 배열, : 당신이 아무 것도 할당 malloc를 사용하여 아웃이 변하므로 441 00:27:43,030 --> 00:27:45,700 수레, 학생 구조. 442 00:27:45,700 --> 00:27:47,750 당신은 완전히 총칭 malloc을 사용할 수 있습니다. 443 00:27:47,750 --> 00:27:51,470 건 상관 또는 당신이 메모리를 할당하고 있는지 알고 필요가 없습니다. 444 00:27:51,470 --> 00:27:55,810 그럼 \ 0 넣어 mal​​loc에​​ 대한 주제 넘은 것 445 00:27:55,810 --> 00:27:58,340 메모리의 모든 덩어리의 끝에서 당신을주고 있어요 446 00:27:58,340 --> 00:28:02,620 이 \ 0은 정말 문자열을위한 대회이기 때문이다. 447 00:28:02,620 --> 00:28:06,310 이것은 ints 사용이 아니라,이 수레를 사용하지거야,이 학생들을 위해 사용하지있어. 448 00:28:06,310 --> 00:28:11,730 그리고 malloc으로 잡았다는 부담이 당신을 완전히 프로그래머 점입니다 449 00:28:11,730 --> 00:28:16,790 당신이 할당 얼마나 많은 바이트를 기억하고 영원히 루프에를 사용하지 450 00:28:16,790 --> 00:28:21,570 또는 동안 루프와 당신이 주어진 한 메모리의 청크의 경계를지나 이동합니다. 451 00:28:21,570 --> 00:28:23,540 빨리 메모리를 할당 같은 다른 방법을 넣어, 452 00:28:23,540 --> 00:28:28,510 당신이 운영 체제를 요청할 수없는 오, 그런데,이 얼마나 메모리의 청크의 큰 였어요? 453 00:28:28,510 --> 00:28:32,080 당신이 그 값이 필요한 경우 기억 귀하가 전적으로입니다. 454 00:28:32,080 --> 00:28:34,330 >> 그래서이 메모리를 사용하는 진행 방법을 보자. 455 00:28:34,330 --> 00:28:38,430 라인 28 29 왜 내가이 짓을하는거야? 456 00:28:39,850 --> 00:28:42,260 그냥 총 정신 검사. 457 00:28:42,260 --> 00:28:45,110 뭔가 잘못되었을 경우를 대비해서, 나는 기억의 일부 미친 금액을 요청 458 00:28:45,110 --> 00:28:48,690 또는 너무 많은 것을, 그냥 메모리가 부족하여이 아니라는 것을 컴퓨터에서 실행 459 00:28:48,690 --> 00:28:51,780 그런 일, 나는 적어도 NULL인지 확인하고 싶습니다. 460 00:28:51,780 --> 00:28:55,260 현실에서, 대부분의 컴퓨터는 당신에게 환상을주는 것이다 모든 프로그램 461 00:28:55,260 --> 00:28:57,080 귀하의 RAM의 전체를 사용할 수 있습니다, 462 00:28:57,080 --> 00:29:00,740 그렇다고해도, 아마 어떤 미친 긴 문자열에 사용자가 유형을한다면 그들은 나쁜 사람이라 463 00:29:00,740 --> 00:29:03,440 그리고 사실은 그에 프로그램이나 해킹을 중단하려는 464 00:29:03,440 --> 00:29:07,300 당신은 적어도 malloc의 반환 값을 확인 하시겠습니까과는 null 같습니다 여부를 지정합니다. 465 00:29:07,300 --> 00:29:11,630 그리고 그렇게되면, 그 경우에 무엇을해야하는지하지 않기 때문에 그냥 지금 그만 두지. 466 00:29:11,630 --> 00:29:13,950 어떻게 문자열을 복사하려면 어떻게해야합니까? 이 작업을 수행 할 수있는 몇 가지 방법이 있습니다. 467 00:29:13,950 --> 00:29:18,850 이 str을 C 함수를 복사 만, 우리는이 옛날 방식으로 할 것이 간단한 됐네요. 468 00:29:18,850 --> 00:29:23,110 >> 먼저 저 s의 길이가 무엇인지 생각해 보자. 469 00:29:23,110 --> 00:29:26,930 나는 루프에 넣고 수 대신 그냥 명확성을 위해 여기를 넣어. 470 00:29:26,930 --> 00:29:30,610 따라서 n은 이제 분명 5 원래 문자열의 길이를 저장합니다. 471 00:29:30,610 --> 00:29:35,290 그런 다음 내 용 루프에 나는 N까지에 0에서 반복 해요 472 00:29:35,290 --> 00:29:40,940 각 반복에서 내가 할게요 님의 [I] t의 안쪽에 [I]. 473 00:29:40,940 --> 00:29:45,060 그게 내가 전에 문자열에서 포인팅 제 2 손가락으로 암시거야. 474 00:29:45,060 --> 00:29:49,260 루프이 이런 식으로 반복으로, 여기에 H를 복사 할거야 475 00:29:49,260 --> 00:29:52,890 여기에, 난 여기에에 전자 제품이 있기 때문에,이 t이다. 476 00:29:52,890 --> 00:29:58,770 그리고 마지막으로, 선 35에 왜 이런 짓을하는거야? 477 00:29:58,770 --> 00:30:03,770 본인은 문자열 t를 마무리하고 있는지 확인해야합니다. 478 00:30:03,770 --> 00:30:06,170 그리고 명시 적 영웅이 될하는 데 이런 식으로 했어요. 479 00:30:06,170 --> 00:30:09,510 하지만 당신이 있다면,이 일을하는 다른 방법을 사람을 제안합니다. 480 00:30:09,510 --> 00:30:13,930 정말 라인 35 필요하지 않습니다. 이 작업을 수행 할 수있는 다른 방법이 있지. 481 00:30:13,930 --> 00:30:18,880 그래. >> [안 들리게 학생 응답] >> 다 들리게 말해. 482 00:30:18,880 --> 00:30:20,960 [학생]보다 작거나 같다. 정확히 >>. 483 00:30:20,960 --> 00:30:24,450 우리는보다 작거나 일반적으로 나쁜 된 N,와 같은 말을 할 수 484 00:30:24,450 --> 00:30:28,190 우리가 계산하는 일에 동일한에 가서 거의 항상있어서 485 00:30:28,190 --> 00:30:30,000 우리는 너무 멀리 한 단계를 이동합니다. 486 00:30:30,000 --> 00:30:32,170 하지만 잊지마, 우리는 얼마나 많은 바이트를 할당 할거야? 487 00:30:32,170 --> 00:30:37,210 우리는 6 총하므로 5 + 1 s의 나 strlen을 할당. 488 00:30:37,210 --> 00:30:39,980 따라서이 경우에는 우리는 이런 일을 할 수 489 00:30:39,980 --> 00:30:46,450 우리는 매우 말에 그냥 인사뿐만 아니라 \ 0하지 복사하고 있도록. 490 00:30:46,450 --> 00:30:49,860 또한, 우리는 strcpy, str을 복사라는 기능을 사용할 수 491 00:30:49,860 --> 00:30:51,700 하지만 그건 거의만큼 재미 않습니다. 492 00:30:51,700 --> 00:30:54,000 하지만 그런 놈들은 후드 아래에 전부거든요. 493 00:30:54,000 --> 00:30:56,050 그런 다음 마지막으로, 우리는 이전과 같은 일을 할. 494 00:30:56,050 --> 00:31:01,620 나는 t를 대문자로하고 나서 원래이와 복사가 그런 식으로 보이는 것 같습니다 주장한다. 495 00:31:01,620 --> 00:31:08,570 그럼 지금 이렇게 해보자. 날 여기에 가자. COPY2하십시오. 우리는 확대하고 COPY2를 실행합니다. 496 00:31:08,570 --> 00:31:13,840 나는 소문자로 인사 입력에 갈 때 실제로 나는 원래로 인사 소문자 얻을 497 00:31:13,840 --> 00:31:16,930 하지만 복사본에 대한 안녕하세요 자본. 498 00:31:16,930 --> 00:31:20,300 하지만 난 아직 안 끝났어요. 여기 한 마지막 일을해야합니다. 499 00:31:20,300 --> 00:31:28,000 46 47 명확하게 메모리를 자유롭게 있지만, 그 사실은 무엇을 의미합니까? 500 00:31:28,000 --> 00:31:33,250 I 줄 46 줄 47 전화하여 생각, 무슨 짓을하는거야? 501 00:31:33,250 --> 00:31:38,900 그게 무슨 효과가 있습니까? 그래. 502 00:31:38,900 --> 00:31:43,140 [안 들리게 학생 응답] >> 맞아. 503 00:31:43,140 --> 00:31:46,380 >> 당신은 요,이 메모리 덕분에 운영 체제를 얘기하고 있습니다. 504 00:31:46,380 --> 00:31:48,320 이제 다른 사람을 위해 사용할 수 있습니다. 505 00:31:48,320 --> 00:31:50,790 여기이 쓰레기 값의 완벽한 예입니다. 506 00:31:50,790 --> 00:31:55,430 난 단지 2 곳에서 인사라는 단어를 적어이 메모리를 사용했습니다 507 00:31:55,430 --> 00:31:57,490 여기, 여기, 여기, 그리고 여기. 508 00:31:57,490 --> 00:32:00,910 그래서이 H, E, L, L-O-\ 0입니다. 509 00:32:00,910 --> 00:32:06,960 하지만 난 줄 46 줄 47 전화, 당신은 그림의 관점에서가 어떻게되는 줄 알아? 510 00:32:06,960 --> 00:32:10,010 사실, 기다려,이 사진은 예전의 하나입니다. 511 00:32:10,010 --> 00:32:12,550 우리가 복사본을 만들되면,이 사람은 실제로 여기 가리키고있다 512 00:32:12,550 --> 00:32:16,110 그래서 다시 번호를 제거하고 단지 추상적 거리에 우리의 화살로 까. 513 00:32:16,110 --> 00:32:19,370 내가 무료로 전화하면 어떻게이 사진에 어떻게됩니까? 514 00:32:19,370 --> 00:32:22,750 [안 들리게 학생 응답] >>조차도. 515 00:32:22,750 --> 00:32:29,510 나는 s와 t에 무료로 전화하는 경우 - 트릭 질문의 종류 -이 사진은 전혀 변경되지 않습니다 516 00:32:29,510 --> 00:32:33,880 을 호출하고 호출하기 때문에 t, 그냥 운영 체제를줍니다 517 00:32:33,880 --> 00:32:39,010 이봐 요, 당신은 다시 메모리를 사용할 수 있지만이 null로 변경되지 않습니다 518 00:32:39,010 --> 00:32:41,840 또는 일부 특수 문자는,이 설정을 변경하지 않습니다 519 00:32:41,840 --> 00:32:47,350 그것은 H 또는 전자 또는 다른 어떤 두 장소에서 L 또는 L 또는 O를 변경하지 않습니다. 520 00:32:47,350 --> 00:32:51,610 그림의 관점에서, 최대한 빨리 무료, 아무것도 변경 사항을 전화로. 521 00:32:51,610 --> 00:32:56,570 그리고 거기에 쓰레기 값의 출처를 잡고 있기 때문에 만약 내가 나중에이 프로그램에 522 00:32:56,570 --> 00:33:01,010 그 GetString 또는 malloc 또는 같은 더 많은 메모리 운영 체제에게 523 00:33:01,010 --> 00:33:04,900 과 운영 시스템은 물론, 내가 일어 단지 해방 메모리의 12 바이트를 가지고 있다고 524 00:33:04,900 --> 00:33:08,080 이러한을 사용하여, 어떻게 당신은 전달 할거야? 525 00:33:08,080 --> 00:33:10,830 당신은 우리가 일반적으로 그릴 것이라고 메모리의 덩어리를 건네 할 것 526 00:33:10,830 --> 00:33:13,700 물음표와 함께, 그러나 그 물음표은 무엇입니까? 527 00:33:13,700 --> 00:33:17,000 그들은 H, E, L, L-O, H, E, L, L-O 될거야. 528 00:33:17,000 --> 00:33:20,940 이러한 즉시 해당 메모리를 확보로 새로운 쓰레기 값입니다. 529 00:33:20,940 --> 00:33:22,750 >> 실제 의미도 여기에 있습니다. 530 00:33:22,750 --> 00:33:24,720 이 RAM과 무슨 일이 있지만, 컴퓨터 531 00:33:24,720 --> 00:33:26,720 실제로 디스크 같은 일을 할. 532 00:33:26,720 --> 00:33:30,620 우리는 과학 수사에 초점을 맞추고 미래의 문제 세트 특히 이것에 대해 얘기하자. 533 00:33:30,620 --> 00:33:36,170 당신이 바탕 화면에 민감한 금융 파일이있는 경우하지만 어떻게 실제로 발생 534 00:33:36,170 --> 00:33:39,600 또는 일부 스케치 JPEG 그리고 당신은 당신의 휴지통에 끌어 535 00:33:39,600 --> 00:33:44,390 당신이 휴지통 또는 휴지통에 끌어하면 어떻게됩니까? 536 00:33:44,390 --> 00:33:47,240 당신은 내가 무엇을 말하고 있었는지 알고 있었다. [웃음] 537 00:33:47,240 --> 00:33:52,370 당신이 휴지통 또는 휴지통으로 그 증거를 괴롭혀하면 어떻게됩니까? 538 00:33:52,370 --> 00:33:55,920 [안 들리게 학생 응답] 539 00:33:55,920 --> 00:33:58,000 음,주의. 당신이 그렇게하면 어떻게됩니까? 540 00:33:58,000 --> 00:34:01,030 짧은 대답은 그래, 아무것도 아니다? 541 00:34:01,030 --> 00:34:04,790 스케치 또는 민감한 파일은 여전히​​ 당신의 하드 드라이브에 어딘가에 앉아있다. 542 00:34:04,790 --> 00:34:07,940 우리 대부분은 적어도 당신이 휴지통을 비울해야하는 어려운 방법을 배웠습니다 543 00:34:07,940 --> 00:34:10,429 또는 휴지통 실제로 파일을 삭제합니다. 544 00:34:10,429 --> 00:34:13,440 그리고 실제로, 당신은 마우스 오른쪽 버튼을 클릭하거나 쓰레기를 클릭하여 관리 할 때 수 545 00:34:13,440 --> 00:34:15,580 또는 파일, 휴지통 비우기이든 뭐든간에를 선택 546 00:34:15,580 --> 00:34:21,420 당신은 실제로 쓰레기 수거나 실제로이 그림에 무슨 일이 휴지통, 비어? 547 00:34:22,810 --> 00:34:25,969 더 아무것도. 그럼 아무는 실제로 디스크에 변화가 없습니다. 548 00:34:25,969 --> 00:34:30,880 >> 우리가 일시적으로 빗나가 다 쓸 경우 그리고 - 난 단지이 다시 사용합니다. 549 00:34:30,880 --> 00:34:34,639 그래서 지금 그 이야기는 프로그램이 존재합니다 RAM에서 변화 550 00:34:34,639 --> 00:34:39,250 당신은 디스크에 그들을 실행하는 동안 그들이 장기적으로 저장되는 위치, 누가 551 00:34:39,250 --> 00:34:42,920 전력은 지금,을 간다해도 - 우리는 앞으로이 다시 올거야 - 552 00:34:42,920 --> 00:34:46,380 우선은이 컴퓨터의 하드 드라이브 내부를 나타냅니다 척 553 00:34:46,380 --> 00:34:50,110 때문에 과거에 그들은 많은 플로피 디스크처럼 원형 디스크로 사용됩니다. 554 00:34:50,110 --> 00:34:55,130 당신이 민감한 엑셀 파일을 가지고있는 경우 그래서, 메모리의 덩어리를 걸릴 수 있습니다 555 00:34:55,130 --> 00:34:59,770 컴퓨터의 디스크에, 그냥 같은 임의의 1 초와 0s을 그릴거야. 556 00:34:59,770 --> 00:35:03,970 당신이 휴지통으로 그런 식으로 파일을 드래그 할 때 또는 bin을 재활용 할 수 557 00:35:03,970 --> 00:35:07,750 애플과 MS가 단지 결정했기 때문에 그대로 아무 일도 발생하지 않습니다 558 00:35:07,750 --> 00:35:10,450 휴지통은 안돼하고 휴지통 단지 임시 자리 표시 자입니다. 559 00:35:10,450 --> 00:35:14,710 아마 결국 OS가 당신을 위해 비우되지만, 일반적으로는, 아무것도하지 않습니다 560 00:35:14,710 --> 00:35:17,090 당신이 공간이 정말 저질이야 적어도 때까지. 561 00:35:17,090 --> 00:35:20,870 >> 그러나, 휴지통 비우기 또는 빈 휴지통으로 갈 때, 562 00:35:20,870 --> 00:35:23,460 마찬가지로, 아무것도이 사진에 변화가 없습니다. 563 00:35:23,460 --> 00:35:28,590 그런 일이 모두 다른 사용자의 컴퓨터에, 테이블의 일부 종류가 있습니다. 564 00:35:28,590 --> 00:35:35,400 그 말은, resume.doc, 말의하자 있다고 약간의 컨닝 시트 같은 종류의입니다 565 00:35:35,400 --> 00:35:40,920 때문에 하드 디스크의 위치 123에서 살았 Microsoft Word 파일의 이력서, 566 00:35:40,920 --> 00:35:43,710 하지 메모리가 아닌 RAM에 있지만 하드 디스크에, 567 00:35:43,710 --> 00:35:49,050 그리고 456에서 스케치 JPEG 생활 및 엑셀 파일 789에서 또는 어디든지 살고있다. 568 00:35:49,050 --> 00:35:53,640 당신이 실제로 휴지통 또는 휴지통을 비우는하여 파일을 삭제하면은, 569 00:35:53,640 --> 00:35:59,530 이 그림은 변경되지 않습니다. 하드 드라이브에 0s와 1S 어디 가지 마세요. 570 00:35:59,530 --> 00:36:03,930 그러나이 테이블 종류의이 작은 데이터베이스가 변경됩니다. 571 00:36:03,930 --> 00:36:08,750 파일이 어떤 의미에서 삭제 것처럼 당신의 이력서를 삭제하면, 그것은이다 572 00:36:08,750 --> 00:36:12,790 그 것은 하드 드라이브에 사는 곳 있지만 모든 컴퓨터는 잊지 않습니다. 573 00:36:12,790 --> 00:36:17,870 이력서 또는 다른 파일을 작성 0s와 1S은 여전히​​ 그대로입니다. 574 00:36:17,870 --> 00:36:21,960 >> 실수로 이런 짓을하면, 0이 아닌 확률은 여전히​​이 575 00:36:21,960 --> 00:36:25,800 당신은 노턴 유틸리티 또는 일부 상용 소프트웨어를 사용하여 데이터를 복구 할 수 576 00:36:25,800 --> 00:36:29,810 인생에서 누구 목적은 0s, 말하자면 고아 된 1 초 찾을 수 있습니다 577 00:36:29,810 --> 00:36:33,300 여기 잊어하지만 다시 데이터를 얻을 수 있도록, 여기를 떠났다. 578 00:36:33,300 --> 00:36:38,410 또는 경찰이나 FBI와 법정 수사 당국은 실제로 하드 드라이브를 걸릴거야 579 00:36:38,410 --> 00:36:42,550 실제로, 0s 및 JPEG 파일과 같은 모양, Excel 파일과 같이하는 1 초에 패턴을 찾아야 580 00:36:42,550 --> 00:36:46,400 그리고 그들에게 컴퓨터가 거기를 잊은 경우에도 그런 식으로 복구합니다. 581 00:36:46,400 --> 00:36:49,820 그래서 우리는 앞으로 논의 되겠지만, 데이터를 삭제하는 정말있는 유일한 방법은, 582 00:36:49,820 --> 00:36:54,190 로 파일이나 하드 디스크를 문질러거나 닦아 것입니다 - 583 00:36:54,190 --> 00:36:56,540 당신은 정말 0s와 1 초를 제거 할 수 없습니다 584 00:36:56,540 --> 00:36:59,440 그렇지 않으면 당신은 기가 바이트 하드 드라이브로 시작 테니까요 585 00:36:59,440 --> 00:37:02,380 당신은 지속적으로 삭제 된 경우 그리고 당신은 메가 바이트 하드 드라이브와 함께하고 말 거예요 586 00:37:02,380 --> 00:37:04,380 문자 그대로, 0s와 1 초. 587 00:37:04,380 --> 00:37:06,310 당신이 정말로 당신의 흔적을 충당하기 위해 원한다면 그럼 당신은 어떻게 하겠니? 588 00:37:06,310 --> 00:37:10,510 그리고 근본적인 문제는 여전히 0s와 디스크에 1 초이 뭐야? 589 00:37:10,510 --> 00:37:14,930 당신이 물리적 장치를 깰 것이라고 gesticulating 사람을 참조하십시오. 그 작동합니다. 590 00:37:14,930 --> 00:37:19,600 그 비싼 솔루션의 종류면 [웃음]하지만, 어떻게 더 합리적인 것입니까? 591 00:37:19,600 --> 00:37:23,270 그래. >> [학생]를 덮어 씁니다. >> 뭘를 덮어 쓰시겠습니까? >> [학생] 기타 데이터입니다. 592 00:37:23,270 --> 00:37:29,070 다른 데이터입니다. 당신은 0s 또는 1 초 또는 모든 0s, 모든 1 초를 사용하여 디스크를 덮어 쓸 수 있습니다. 593 00:37:29,070 --> 00:37:31,230 >> 그리고이 소프트웨어의 일부가 무엇을 실제로입니다. 594 00:37:31,230 --> 00:37:33,570 당신이 소프트웨어를 구입하거나 무료 소프트웨어를 얻을 수 있습니다 595 00:37:33,570 --> 00:37:36,610 심지어 덜 때문에 Windows에서이 일 맥 OS에 내장 596 00:37:36,610 --> 00:37:38,660 안전하게 삭제 할 수있는 기능입니다. 597 00:37:38,660 --> 00:37:41,960 오늘 모든 실행 홈으로하려는 경우 사실, 당신은 Mac을 가지고이 작업을 수행하는 경우 598 00:37:41,960 --> 00:37:45,740 당신이 가진 경우 휴지통에있는 물건이, 당신은, 보안 휴지통 비우기를 할 수 있습니다 599 00:37:45,740 --> 00:37:47,610 이는 정확히 맞는다. 600 00:37:47,610 --> 00:37:53,350 오히려 여기에 단지 지우기 파일보다는, 0s와 1S 여기를 삭제하지 않습니다 601 00:37:53,350 --> 00:38:01,240 대신, 그냥 0s과 점, 점, 점에, 예를 들어, 그들 모두를 변경합니다. 602 00:38:01,240 --> 00:38:05,330 따라서 미래 psets 중 하나는 실제로 의도적으로 데이터를 복구하는 것입니다 - 603 00:38:05,330 --> 00:38:08,430 우리가 캠퍼스에서 사람, 장소, 사물의 촬영 한 사진 604 00:38:08,430 --> 00:38:12,810 하는 우리는 디지털 카메라의 메모리 카드를 법정 이미지가 될거야 605 00:38:12,810 --> 00:38:17,120 이는 동일한 생각입니다 - 당신은 실제로 찾기 위해 도전해야 할 것 606 00:38:17,120 --> 00:38:20,160 귀하의 하드 드라이브에 JPEG 파일을 나타냅니다 패턴, 607 00:38:20,160 --> 00:38:23,610 많은 그의 이메일이 전 학생 같은 몇 주 전에 읽었 어 608 00:38:23,610 --> 00:38:25,860 동생의 사진을 복구합니다. 609 00:38:25,860 --> 00:38:30,300 왜 우리가 여기로 5 분 휴식을 취하지 않으며, 우리는 메모리에 대한 자세한으로 재편성됩니다. 610 00:38:33,030 --> 00:38:38,610 그래서 여기 일이 좀 정신을 굽힘받을 곳이지만이 매우 강력한 단계입니다 611 00:38:38,610 --> 00:38:40,480 이 모든 자세한 내용을 이해하게 되었 지요. 612 00:38:40,480 --> 00:38:42,900 여기 pointers.c라는 프로그램입니다. 613 00:38:42,900 --> 00:38:45,430 오늘의 샘플 코드 중 하나입니다. 614 00:38:45,430 --> 00:38:51,280 처음 몇 줄에 22을 통해 19, 우리가하는 모든 GetString 같은 상태가됩니다 615 00:38:51,280 --> 00:38:54,460 및 S에 저장, 주소를 반환. 616 00:38:54,460 --> 00:38:58,380 이제부터 pset도 3에 대한 당신이 원하는 경우 만 pset 4에 617 00:38:58,380 --> 00:39:01,030 어디서 자신을 물러나게 훈련 바퀴를 만들 수있어 618 00:39:01,030 --> 00:39:04,030 문자열이 더 이상 존재한다는 가정 할 이유가 없습니다. 619 00:39:04,030 --> 00:39:07,030 확실히 그냥 숯불 * 말을 시작 됐어. 620 00:39:07,030 --> 00:39:12,610 >> 옆으로, 온라인 참고 문헌과 책에서 당신은 종종 변수 옆에있는 별표를 볼 수 있습니다. 621 00:39:12,610 --> 00:39:15,600 당신은 그것의 양쪽 주변의 공간을 볼 수 있습니다. 622 00:39:15,600 --> 00:39:17,680 사람들의 모든 기능적으로 정확합니다. 623 00:39:17,680 --> 00:39:21,180 지금은하지만, 우리는 슈퍼가 명확하게이 방법을 표준화합니다 624 00:39:21,180 --> 00:39:24,000 그 문자 *는 문자 포인터를 말하는 것입니다. 625 00:39:24,000 --> 00:39:25,680 그것은 데이터 형식입니다. 626 00:39:25,680 --> 00:39:28,730 그리고 변수의 이름은이 경우 s입니다. 627 00:39:28,730 --> 00:39:31,180 그래서 우리는 문자열을 늘어 놓던하고 우리는 S라고했습니다. 628 00:39:31,180 --> 00:39:35,180 그리고 여기 난 사실 속임수 약간하고있어 사실을 알아야한다. 629 00:39:35,180 --> 00:39:39,080 이것은 슈퍼 간단한의 종류입니다 포인터 산술을라고합니다. 630 00:39:39,080 --> 00:39:41,790 단지 포인터에 번호를 추가하고 빼야 의미합니다. 631 00:39:41,790 --> 00:39:43,660 그러나 실제로 작동합니다. 632 00:39:43,660 --> 00:39:49,170 이 프로그램은 확실히 같은 최종 결과 그 한 줄에 문자열의 한 문자를 인쇄 - 633 00:39:49,170 --> 00:39:54,920 그냥 그래서 우리는이가는 곳, 부패 포인터를, 포인터를 실행, 제가 확대시킬 수 634 00:39:54,920 --> 00:39:58,940 지금 HELLO와 타입 입력 그런 일에 저에게 종류를 알려 635 00:39:58,940 --> 00:40:01,080 그리고 한 줄 당 1 문자를 출력합니다. 636 00:40:01,080 --> 00:40:04,730 최대 초 전 때까지, 우리는 대괄호 표기법으로이 작업을 완료 한 것입니다. 637 00:40:04,730 --> 00:40:09,760 우리는 루프에 대한을 보내고있는 우리는 s의 printf하고 싶어 [I] 우리는 또 한번, 또 한번하고 또 그 짓을 할 거라고 638 00:40:09,760 --> 00:40:11,950 각 줄의 끝에 백 슬래시 N으로. 639 00:40:11,950 --> 00:40:16,800 그러나이 프로그램은 다릅니다. 이 프로그램은 말 그대로 산술을 사용하고 있습니다. 640 00:40:16,800 --> 00:40:18,860 그래서 여기 무슨 일이야? 641 00:40:18,860 --> 00:40:24,720 이 루프도 실행하기 전에 먼저, 무엇을, 분명히해야 할 것은, S는 실제로입니까? 642 00:40:24,720 --> 00:40:27,270 S는? >> [학생] 주소를 입력합니다. >> 주소. 643 00:40:27,270 --> 00:40:32,980 >> 그리고 인사의 경우의 주소입니다, 그 단어의 첫 번째 문자가되는데,이 H입니다. 644 00:40:32,980 --> 00:40:37,370 그래서 s은 (는)이 특정 예제에서, H의 주소입니다. 645 00:40:37,370 --> 00:40:41,850 그럼을 어떻게 의미 + 내가? 646 00:40:41,850 --> 00:40:46,280 음, 내가 루프이에 0에서 시작합니다. 우리는 몇 번 했어. 647 00:40:46,280 --> 00:40:49,760 나는 분명히 문자열의 길이까지 갈 수 있습니다. 648 00:40:49,760 --> 00:40:53,950 따라서이 루프의 첫 번째 반복에, 난 분명히 0입니다. 649 00:40:53,950 --> 00:41:01,740 오히려, S +0- - 그 분명 단지 s의 - 그래서이 표현이 s이 (가) + 내가 말하고 있습니다. 650 00:41:01,740 --> 00:41:04,320 그럼 * 여기의 무엇인가? 651 00:41:04,320 --> 00:41:08,530 이제 우리는 약간 다른 방식으로 별표를 사용하고 있습니다. 652 00:41:08,530 --> 00:41:13,080 내가 가서 우리가 t와 s의 사본 얘기를했기 때문에 t을 제거 보자. 653 00:41:13,080 --> 00:41:15,540 이제 우리는을 포함하는 이야기를하고 싶습니다. 654 00:41:15,540 --> 00:41:20,090 그 전에 한 매우처럼 그리고 지금이 순간에서 입력 문자열을 가진 후, 우리의 세계가 보인다 655 00:41:20,090 --> 00:41:26,630 단지 s는 H의 주소를 저장하고 더 일반적으로 인사 문자열에서 가리키고있는. 656 00:41:26,630 --> 00:41:33,170 지금 * 같은 라인을 할 경우 (S + I), 이것 좀보세요 까. 657 00:41:33,170 --> 00:41:40,140 따라서 * (S + I). 이 0이기 때문에 저를 단순화하자, 그래서이 * (S +0)입니다. 658 00:41:40,140 --> 00:41:43,790 음, 잠깐만 요. 더 단순화합니다. 이 * (S)입니다. 659 00:41:43,790 --> 00:41:47,020 자, 이제 괄호 바보의 종류, 이제 그냥 할 * S 보자. 660 00:41:47,020 --> 00:41:50,540 따라서이 루프, 강조있어 해당 줄, 26의 첫 번째 반복에서 661 00:41:50,540 --> 00:41:53,650 이 인쇄에 거의 동일합니다. 662 00:41:53,650 --> 00:41:56,040 * s의 데이터 유형은 무엇입니까? 663 00:41:56,040 --> 00:42:00,770 별은 S 자체에 옆에서 일어나는 이러한 맥락에서, 때문에 664 00:42:00,770 --> 00:42:04,930 하지만 더 구체적으로, 우리는 더 이상을 선언 없기 때문에 665 00:42:04,930 --> 00:42:09,730 우리는 더 이상 변수를 만들어 낸 게 아니군요, 라인 (26)에서 숯불 *에 대한 언급은 없습니다 666 00:42:09,730 --> 00:42:14,280 키워드 문자열에 대한 언급이 없어, 우리는, S라는 변수를 사용하는 667 00:42:14,280 --> 00:42:19,650 지금 별이 의미를 혼동 보면 약간의 차이가 있으며, 밝혀졌다. 668 00:42:19,650 --> 00:42:26,590 여기 * s은 (는)이 무엇이든 s의 주소와 인쇄로 이동을 의미합니다. 669 00:42:26,590 --> 00:42:33,750 그럼 s는 여기 * S는 - 정렬 낙하산과 사다리 등의, 화살표를 따라 - 여기. 670 00:42:33,750 --> 00:42:35,850 그래서이 * s입니다. 671 00:42:35,850 --> 00:42:39,060 >> 그러니까 줄 26에서 해당 루프의 첫 번째 반복에서 무엇을 인쇄됩니다? 672 00:42:39,060 --> 00:42:42,170 나는 문자에 대한 자리 표시 자입니다 % C를, 인쇄 673 00:42:42,170 --> 00:42:48,520 다음 새 줄에 \ N. * (S + I) 전 0 이번이입니다. 674 00:42:48,520 --> 00:42:53,670 그래서 숯불 I는 % C을 위해 배치합니까? H. 675 00:42:53,670 --> 00:42:56,900 이가는 곳 아마 당신은 볼 수 - - 루프의 다음 반복에서 676 00:42:56,900 --> 00:43:01,350 다음 반복 난 분명히 1,이 방법들 +1, 677 00:43:01,350 --> 00:43:05,580 이제 별 말을해야하기 때문 그리고 지금은 괄호를 필요합니까 678 00:43:05,580 --> 00:43:08,620 메모리 주소의 1로 이동합니다. 679 00:43:08,620 --> 00:43:14,170 S는 무엇입니까? 의 시간에 롤백이 화살표가 지금 실제로 전혀 도움이 안 되는군한다고 가정 해 보겠습니다. 680 00:43:14,170 --> 00:43:18,450 이 번호 (123)를 저장 있다는 말을 더 구체적으로 보자 681 00:43:18,450 --> 00:43:25,110 이 문자열의 시작은여보세요,이 주소 123 있기 때문에,이 등등 124이며,. 682 00:43:25,110 --> 00:43:30,550 그래서 S +1 말 두 번째 반복에, 그 123 일을 말하는 것입니다 683 00:43:30,550 --> 00:43:35,340 그렇지 않으면 124로 알려진 문자가 두 번째 반복에 인쇄됩니다 그래서? 684 00:43:35,340 --> 00:43:37,850 메모리 주소 124에 E. 685 00:43:37,850 --> 00:43:44,440 우리가 여기에 오기 전에 다음 + 다시 125, 126, 127,이 루프는 고맙게도 중지 686 00:43:44,440 --> 00:43:49,040 난 내가 너무 높이 포함되지 않도록하기 위해 나 strlen을 사용 때문입니다. 687 00:43:49,040 --> 00:43:50,810 그래서 역시입니다. 688 00:43:50,810 --> 00:43:55,000 다시, 우리가 일주일 전에 짓을 한 단 것처럼입니다. 689 00:43:55,000 --> 00:43:59,200 우리가 모두 싶지 않아하더라도 내게 줄에 아래를 써라. 690 00:43:59,200 --> 00:44:02,500 이 이렇게 지금 동일합니다. 691 00:44:02,500 --> 00:44:08,310 >> 그래서 우리가 주를 전화 해 봤는데 전화로 S는 문자열하더라도, S는 정말 숯불 *입니다. 692 00:44:08,310 --> 00:44:13,270 우리가 슈퍼 항문되고 싶어한다면, 그것은 특정 문자를 작성하는 정말 적합하다고 693 00:44:13,270 --> 00:44:17,490 이 숫자 주소와이 별 연산자를 사용하여 i 번째 위치에서, 694 00:44:17,490 --> 00:44:20,470 솔직히이 너무 청소기입니다. 그래서이 나쁜되지 않습니다. 695 00:44:20,470 --> 00:44:26,720 , 이유는 여기에 라인 27을 중지 없습니다하지만, 26 기능적으로 동일합니다 696 00:44:26,720 --> 00:44:31,570 그리고 우리가 지금까지 논의 된 것으로 정확히 이유로 기능적으로 동일입니다. 697 00:44:31,570 --> 00:44:33,650 그리고 마지막으로, 29는 것이 좋습니다. 698 00:44:33,650 --> 00:44:38,420 s의 무료 호출하면 이제 GetString이 준 메모리를 돌려주는한다는 것을 의미 699 00:44:38,420 --> 00:44:41,630 다시, 나는 주 동안 GetString, 월요일 언급으로하기 때문에 700 00:44:41,630 --> 00:44:44,180 코드에 버그를 소개하고 있습니다. 701 00:44:44,180 --> 00:44:46,490 주 코드는 메모리 누수을 가지고 702 00:44:46,490 --> 00:44:49,970 상기 당신은 메모리 GetString을하려고 했어요하지만 다시 제공을받은 적이 없어. 703 00:44:49,970 --> 00:44:53,410 그리고 의도적으로 pedagogically 회사로 선정되었다 그 704 00:44:53,410 --> 00:44:55,880 이 조기에 생각이 너무 많아 때문입니다. 705 00:44:55,880 --> 00:44:57,710 하지만 지금 우리는 더 대칭가 필요합니다. 706 00:44:57,710 --> 00:45:00,830 당신은 메모리에 컴퓨터를 요청한 경우와 같은, GetString의 경우입니다 707 00:45:00,830 --> 00:45:02,820 같은 경우는, malloc에​​ 분명합니다 708 00:45:02,820 --> 00:45:07,970 당신은 pset 4 이후에 무료로 이러한 메모리 지금해야합니다. 709 00:45:07,970 --> 00:45:11,650 이 정수 n을 말하는 다릅니다 확인할 수 있습니다. 710 00:45:11,650 --> 00:45:15,040 당신은 GetString 전화를하지 않았기 때문에이 해방 할 필요가 없습니다 711 00:45:15,040 --> 00:45:16,890 당신은 malloc를 호출하지 않았습니다. 712 00:45:16,890 --> 00:45:20,610 >> 결국 우리가 보게 될, 심지어 당신은 GetInt라고하면 713 00:45:20,610 --> 00:45:25,520 당신은 실제로 정수를 주위에 전달 할 수 있기 때문에 GetInt 당신을 위해 메모리를 할당하지 않습니다 714 00:45:25,520 --> 00:45:29,430 우리가 주 동안 해왔 막 방식 수레와 문자. 715 00:45:29,430 --> 00:45:33,960 정말 그들은 여러 문자의 결합이기 때문에 문자열은하지만, 특별한 있습니다. 716 00:45:33,960 --> 00:45:37,450 그래서 그들은 문자와 수레와 ints에서 다른 고 좋아요. 717 00:45:37,450 --> 00:45:39,980 그러나 우리는 오래 전부터으로 돌아올 거예요. 718 00:45:39,980 --> 00:45:44,920 질문 한 후 포인터의 시작에? 그래. 719 00:45:44,920 --> 00:45:49,690 [안 들리게 학생 질문] 720 00:45:49,690 --> 00:45:51,440 아, 아주 좋은 질문입니다. 721 00:45:51,440 --> 00:45:55,790 C는 실제로 당신을 위해 일하는 몇 가지 중 하나는, 그이 편리합니다 722 00:45:55,790 --> 00:46:00,110 그것은 크기가 데이터 형식입니다 당신에게 밖으로 떠날 수 있습니다 723 00:46:00,110 --> 00:46:03,060 그리고 당신 곱셈의 종류 않습니다. 724 00:46:03,060 --> 00:46:06,610 거의 항상 문자는 1 바이트이기 때문, 문자의 경우 관련이 725 00:46:06,610 --> 00:46:08,150 그래서 그냥 작동합니다. 726 00:46:08,150 --> 00:46:11,220 그러나 토론의 위해서 당신은 실제로 정수를 인쇄 된 경우 727 00:46:11,220 --> 00:46:15,500 그리고 당신은 어떤 값의 정수로 지목 된 그 방법을 찾아 인쇄하려는 728 00:46:15,500 --> 00:46:20,720 int는 4 바이트입니다 * 난 그냥 때문에이 유사 + 4 수행 할 필요가 없습니다 것입니다. 729 00:46:20,720 --> 00:46:25,780 포인터 산술 C와 컴파일러가 당신을 위해 모든 계산을 할 것을 의미합니다. 730 00:46:25,780 --> 00:46:29,190 당신이 걱정해야 할 모든 인간의 감각의 종류에있는 계산입니다. 그래. 731 00:46:29,190 --> 00:46:35,200 [학생]이 (가) 당신이 루프에 대한 내부 문자열을 선언하는 경우, 당신이 나중에 확보해야합니까? 732 00:46:35,200 --> 00:46:36,760 좋은 질문입니다. 733 00:46:36,760 --> 00:46:41,390 >> 당신은 루프의 문자열 내부에 선언하면 나중에 확보해야하는 이유는 무엇입니까? 734 00:46:41,390 --> 00:46:47,520 당신은 당신이 GetString이나 malloc으로 할당되는 메모리 처리해야 할 것입니다. 735 00:46:47,520 --> 00:46:53,110 당신이 뭔가를 원하는 말한다면 - 모든 코드가 관련되어 있으므로 내가 지금 중괄호를 넣어 보자. 736 00:46:53,110 --> 00:46:58,580 이 같은 buggily에도 불구하고 무언가를, 그랬다면, 숯불 * t = s의 737 00:46:58,580 --> 00:47:03,450 t는 malloc 또는 GetString의 언급을 포함하지 않았기 때문에 당신은 무료로 t 할 필요가 없습니다. 738 00:47:03,450 --> 00:47:08,960 이 짓을 반대로하는 경우 GetString는 다음 네, 당신은 무료로 t해야합니다. 739 00:47:08,960 --> 00:47:14,350 그리고 사실, 할 유일한 기회 범위의 동일한 문제에 대해,이 루프 안에서 지금 740 00:47:14,350 --> 00:47:16,060 우리가 과거에 논의 한. 741 00:47:16,060 --> 00:47:18,830 그렇지 않으면, 메모리를 할당 메모리를 할당 메모리를 할당했을 742 00:47:18,830 --> 00:47:21,230 그리고 프로그램의 끝에서, 그 루프의 외부에 있기 때문에 743 00:47:21,230 --> 00:47:24,240 t는 존재하지 않지만, 당신은 운영 체제를 말하지 않았어 744 00:47:24,240 --> 00:47:26,750 당신은 더 이상 메모리를 필요로하는 것이 었죠. 745 00:47:26,750 --> 00:47:30,430 그리고 오랜 전에 pset 4 5 우리는 Valgrind라는 프로그램을 장비합니다 746 00:47:30,430 --> 00:47:34,160 이는, 그것은 마법 인터페이스 다소있어 점에서 정신에 GDB와 비슷합니다 747 00:47:34,160 --> 00:47:35,750 그러나 인생의 목적은 당신을 도와 것입니다. 748 00:47:35,750 --> 00:47:39,380 그리고 Valgrind 앞으로 프로그램을 검색하는 프로그램입니다 749 00:47:39,380 --> 00:47:42,550 메모리 누수를 찾는, GetString 또는 malloc의 여부, 750 00:47:42,550 --> 00:47:47,800 있는 우리는 많은 CS50 라이브러리를 사용 중지로 모두 더를 사용하여 시작합니다. 751 00:47:47,800 --> 00:47:53,030 우리는 마침내 우리 이제 어휘의 종류와 이론의 정신 모델의 종류가 752 00:47:53,030 --> 00:47:55,170 이 깨진 프로그램을 해결하기 위해되는. 753 00:47:55,170 --> 00:47:59,410 >> 그래서 깨진 프로그램에, 스왑은 스왑의 내부 작동 754 00:47:59,410 --> 00:48:05,280 메인은 ​​x와 y, 리콜에 전달하기 때문에 실제로, 주에서 일한 적이 755 00:48:05,280 --> 00:48:07,260 이들은 말하자면, 값으로 전달되었다. 756 00:48:07,260 --> 00:48:09,330 그 중 사본은 교환 주어졌습니다. 757 00:48:09,330 --> 00:48:12,520 스왑 년 말까지, a와 b가 참으로 교환되었습니다, 758 00:48:12,520 --> 00:48:16,120 하지만 물론 우리는 월요일에 논의​​으로 x와 y는 본 적이 없었습니다. 759 00:48:16,120 --> 00:48:19,940 그래서이 사람은 실제로 솔루션입니다 것으로 녹색으로 제안합니다. 760 00:48:19,940 --> 00:48:22,640 그리고 사실, 난 그냥 일치하도록 내 별을 이동하게 761 00:48:22,640 --> 00:48:24,440 하더라도, 다시 기능적으로이 중요하지 않습니다. 762 00:48:24,440 --> 00:48:28,730 언제, 왜 상관있어 앞으로 주에서 우리는 설명 할 수 있습니다. 763 00:48:28,730 --> 00:48:30,600 따라서 녹색으로 지금은 솔루션입니다. 764 00:48:30,600 --> 00:48:33,700 난이 별을 모두 가지고 있기 때문에 솔직히, 이건 훨씬 참 보입니다. 765 00:48:33,700 --> 00:48:35,380 한 가지만을 지적 보자. 766 00:48:35,380 --> 00:48:40,040 이 정수 * a와 int는 * B라고 여기 최고의 767 00:48:40,040 --> 00:48:42,820 항상이 같은 근본적으로 같은 일을하고 있습니다. 768 00:48:42,820 --> 00:48:47,070 그것은 교환이 인수 또는 매개 변수를 선언합니다 769 00:48:47,070 --> 00:48:49,940 정수 포인터가있는 첫 번째는이라고 770 00:48:49,940 --> 00:48:53,100 두 번째는 b라는 정수 포인터입니다. 771 00:48:53,100 --> 00:48:55,770 이 시점에서 새로운 점은 스타가 거기에 있다는 사실입니다. 772 00:48:55,770 --> 00:48:59,340 >> 그게 무슨 뜻 이죠? 이 정수가 아닙니다, B는 정수가 아닙니다. 773 00:48:59,340 --> 00:49:04,100 이 정수의 주소이며, B는 서로 다른 정수의 주소입니다. 774 00:49:04,100 --> 00:49:06,980 나는 C가 사용자에게 혼란을 도착 인정 곳 여기선이 있습니다. 775 00:49:06,980 --> 00:49:09,790 이제 우리는 스타를 사용하고 있지만,이 맥락에서 다른 의미가 있습니다. 776 00:49:09,790 --> 00:49:13,150 우리가 여기있는 한 우리는 포인터를 선언하지 않았기 때문에 것은 777 00:49:13,150 --> 00:49:15,500 여기에 우리는 세상을 dereferencing 있습니다. 778 00:49:15,500 --> 00:49:21,520 따라서 기술적으로, 스왑의 내부의 제 1, 제 2 및 제 3 라인의 맥락에서의 별 779 00:49:21,520 --> 00:49:24,560 단지 의미 역 참조 연산자는, 거기로 가야합니다. 780 00:49:24,560 --> 00:49:27,400 내 손가락이 H에있는 화살표를 따라, 그래서 마찬가지로 781 00:49:27,400 --> 00:49:31,100 * 수단은 해당 주소로 가서 나를이 INT를 찾습니다. 782 00:49:31,100 --> 00:49:34,250 * B 수단이 주소로 가서 거기에 뭐가 저를 전달합니다. 783 00:49:34,250 --> 00:49:40,730 그럼 월요일 이제 프레임 스택을 사용하여 사진을 다시 그리기하게, 784 00:49:40,730 --> 00:49:43,130 하단의 하나는 메인이 될 것입니다 785 00:49:43,130 --> 00:49:47,600 상단 하나는 스왑 될거야 786 00:49:47,600 --> 00:49:50,880 우리의 세계는이 같은 월요일 같은데 있도록. 787 00:49:50,880 --> 00:49:53,620 여기에 주요 사용 할 것을 메모리의 덩어리입니다. 788 00:49:53,620 --> 00:49:56,520 >> 프로그램이 단 2 변수가 있다는 월요일부터 기억, 789 00:49:56,520 --> 00:50:01,930 하나는 x와 y라는 하나라고, 그리고 난 거기에 숫자에게 1과 2를 넣어했다. 790 00:50:01,930 --> 00:50:06,580 지금은 같은 교환 전화를 할 때 월요일에 한, 791 00:50:06,580 --> 00:50:11,000 내가이 프로그램의 붉은 색 버전을 사용하는 이전하면되는데,이,이 모양 792 00:50:11,000 --> 00:50:17,470 I 2 매개 변수 a와 b를 가지고, 우리는 여기와 여기에 뭘 썼는데? 793 00:50:17,470 --> 00:50:21,160 단 1과 2는 말 그대로 X와 Y 복사합니다. 794 00:50:21,160 --> 00:50:23,070 오늘 우리가 그를 변경합니다. 795 00:50:23,070 --> 00:50:28,510 오늘은 대신 ints를 전달의 a와 b 우리는이 주소를 전달하는 것. 796 00:50:28,510 --> 00:50:34,290 이러한 주소는 ints를 가리 키도록 어떻게, 그러나 그 주소는 자신을 ints하지 않습니다. 797 00:50:34,290 --> 00:50:37,330 그들은 주소입니다. 그것은 대신 우편 주소 같아요. 798 00:50:37,330 --> 00:50:40,580 이제 우리는 자신에게 화면에 좀 더 자세한 정보를 제공해야합니다. 799 00:50:40,580 --> 00:50:43,250 가 오늘 하루 종일로 내 컴퓨터의 메모리입니다. 800 00:50:43,250 --> 00:50:45,120 이제 우리는 몇 가지 임의의 번호 체계가 필요합니다. 801 00:50:45,120 --> 00:50:50,580 그래서 메모리 주소 123, 124입니다, 그냥 우연히, 방금 뭐라고 까. 802 00:50:50,580 --> 00:50:55,660 보자은 그냥 125입니다라고이 126이며, 등등,하지만 완전히 임의의입니다. 803 00:50:55,660 --> 00:50:58,590 우리는 기억의 일부 번호 체계가 필요합니다. 804 00:50:58,590 --> 00:51:04,030 그래서 저는 실제로 x와 y에 통과 할 때, 나는 x와 y에 전달 않을거야, 805 00:51:04,030 --> 00:51:08,400 나는 X의와 y의, 말하자면, 우편 주소에 전달거야 806 00:51:08,400 --> 00:51:11,870 그래서 뭐 여기와 여기에 저장됩니다 것은 1과 2은 아닐지라도 것은, 807 00:51:11,870 --> 00:51:16,030 내 작은 텍스트를 볼 수 있다면, 어떻게 여기와 여기에 전달됩니다? 808 00:51:16,030 --> 00:51:23,340 [안 들리게 학생 응답] >> 맞아. 123 여기에 넣어됩니다 및 124이 여기에 넣어됩니다. 809 00:51:23,340 --> 00:51:28,910 >> 이제 때문에, 맨 위에 여기이 매우 첫 번째 방법으로 별표를 사용 810 00:51:28,910 --> 00:51:34,340 내 프로그램이 방금 분명 정수인데도, 그 123 및 124을 알고 811 00:51:34,340 --> 00:51:40,160 모든 인간이 발견 할 수있는, 그들은 주소, 숫자 주소로 해석해야합니다. 812 00:51:40,160 --> 00:51:43,250 그들은 ints과 자신의하지 않은, 그들은, 주소 야 813 00:51:43,250 --> 00:51:46,120 내가 명시 적으로이 별을 넣어했기 때문에 그입니다. 814 00:51:46,120 --> 00:51:51,360 이제 어떻게 여기에 무슨 일이 실제 코드의 제 1, 제 2 및 제 3 행에? 815 00:51:51,360 --> 00:51:53,380 의이 그림의 나머지 부분을 그려 보자. 816 00:51:53,380 --> 00:51:56,980 TMP는 그냥 월요일에 있었던 것입니다. TMP에 관한 건 특별한 게 없습니다. 817 00:51:56,980 --> 00:52:03,060 단지 지역의 32 비트 변수이며, 내부, 나는 분명히 *의 값을 저장하고 있습니다. 818 00:52:03,060 --> 00:52:08,580 자, 내가 말한다면 tmp를 =, 여기서 무엇을까요? >> [학생] 123. 819 00:52:08,580 --> 00:52:10,370 123. 하지만 그건 내가하고있는 일 없습니다. 820 00:52:10,370 --> 00:52:13,670 나는 TMP를 말 = *. 스타 수단 거기에 이동합니다. 821 00:52:13,670 --> 00:52:19,370 그래서 여기가 123입니다. 어떻게 거기에 가지? 화살표가 척. 822 00:52:19,370 --> 00:52:24,460 음, 저기, 1입니다. 하니까, tmp 디렉토리에 무엇을 저장됩니다? 그냥 1. 823 00:52:24,460 --> 00:52:29,620 따라서 즉, tmp 디렉토리는 *, * 수단에 현재 주소로 이동 것은, 824 00:52:29,620 --> 00:52:31,320 어떤 무리가 123입니다. 825 00:52:31,320 --> 00:52:33,910 >> 자, 여기서 우리가 위치 123에 있습니다, 난 숫자 1을 참조하십시오 826 00:52:33,910 --> 00:52:35,670 그래서 나는 거기에 숫자 1을 넣어거야. 827 00:52:35,670 --> 00:52:39,020 지금은 2 호선에 무엇을해야합니까, * = * B? 828 00:52:39,020 --> 00:52:44,570 무슨 지금 때문에이 녀석은 좀 더 관련 있나? 이 123입니다. 829 00:52:44,570 --> 00:52:50,220 따라서 *은 어디 있죠? 마우스 오른쪽 전에 어디 있었는지. 그럼 거기에 이동합니다. 좋아요. 830 00:52:50,220 --> 00:52:53,420 이제 마지막으로, 그리고 마지막이, ​​바라건대, 이해되기 시작합니다 831 00:52:53,420 --> 00:53:00,280 * B는 B에 어떤 의미? 124. 그래서 2입니다, 거기로 갈해야합니다. 832 00:53:00,280 --> 00:53:03,430 그래서 어디까지 무엇을 입력해야합니까? 833 00:53:03,430 --> 00:53:10,100 * B는 *로 전환하기 때문에이 여기에 저장됩니다. 그래서 그걸을 다하겠습니다. 834 00:53:10,100 --> 00:53:13,120 그리고 당신은 이미 우리가 너무 가까이, 아마도 볼 수 있습니다 835 00:53:13,120 --> 00:53:17,710 처음으로 제대로이 바보 같은 간단한 문제를 해결하는 836 00:53:17,710 --> 00:53:20,920 지금 우리가 여전히 X가 무엇인지에 대한 기억이 있기 때문은, 837 00:53:20,920 --> 00:53:23,230 우리는, Y의 보면 2 장을 가지고 838 00:53:23,230 --> 00:53:25,850 하지만 3 호선 지금 * B는 말합니다. 839 00:53:25,850 --> 00:53:31,080 그래서 여기 B입니다. * B 수단 거기에 이동합니다. 그럼 위치는 124 어디있어? 840 00:53:31,080 --> 00:53:35,560 여기 분명 있습니다. 그래서 여기에 무엇을 입력해야합니까? 물론, tmp를 입력합니다. 841 00:53:35,560 --> 00:53:39,600 그래서 지금은이 작업을 수행합니다. 그래서 여기에 하나 여기이 있습니다. 842 00:53:39,600 --> 00:53:43,560 그리고 지금 무슨의 모든 123 124 및 1? 843 00:53:43,560 --> 00:53:47,910 즉시 스왑 수익 등이 기억을 잃은만큼 좋은 844 00:53:47,910 --> 00:53:51,070 즉시 스왑 반환, 운영 체제 등 때문에 845 00:53:51,070 --> 00:53:54,190 미래에 다시 메모리를 사용하여 무료입니다. 846 00:53:54,190 --> 00:53:58,870 이 소위 스택의 맨 아래에있는 만 메인 메모리는 주위에 넣는다. 847 00:53:58,870 --> 00:54:01,470 >> 그래서 우리는 드디어 이제 작업 버전이 있습니다. 848 00:54:01,470 --> 00:54:06,310 저 swap.c로 이동하여 다음 사항을주의하자. 849 00:54:06,310 --> 00:54:11,280 프로그램의 상단에 내 프로토 타입이 될 변경 한 정수 * a와 int는 * 나. 850 00:54:11,280 --> 00:54:15,000 내가 나빴어 빨강,에서 좋은 녹색,로 이동하도록 변경 유일한 자, 851 00:54:15,000 --> 00:54:17,350 오늘은이 별을 추가됩니다. 852 00:54:17,350 --> 00:54:21,520 하지만 여기에서 그 자체를 교환 알았다했고, 그냥 슬라이드에 뭔지 붙여 넣습니다. 853 00:54:21,520 --> 00:54:24,140 여기 스타가 여기 스타 - 그 프로토 타입을 일치 - 854 00:54:24,140 --> 00:54:27,930 다음이 모든 일 현재 tmp를 제외한 별이 855 00:54:27,930 --> 00:54:30,680 임시 변수의 사용 때문에, 새로운 아무것도 없습니다. 856 00:54:30,680 --> 00:54:33,040 난 그냥 정수에 대한 임시 저장소가 필요합니다. 857 00:54:33,040 --> 00:54:34,820 그래서 우리는 거기에 별 필요가 없습니다. 858 00:54:34,820 --> 00:54:39,310 우리가 임의의 경계 이러한 종류의를 건너 수 있도록 우리는 별이 필요합니다 859 00:54:39,310 --> 00:54:42,900 내 컴퓨터의 메모리에 이러한 두 프레임 사이에 있습니다. 860 00:54:42,900 --> 00:54:45,630 그러나 마지막으로 변경하는, 당신은 이미 희미했을 수 있습니다. 861 00:54:45,630 --> 00:54:48,810 다른 어떤 라인은 이제 분명 다른가요? >> [학생] & X. 862 00:54:48,810 --> 00:54:53,270 >> 그래, 25 나는 일에 변경해야하는 코드의 마지막 줄입니다. 863 00:54:53,270 --> 00:54:58,360 일주일 전, 심지어 월요일에 라인 25과 같이 보니, x와 y를 교환 864 00:54:58,360 --> 00:55:02,020 당신이 말하는 경우 때문에이 방금 깨 된 스왑 (X, Y) 865 00:55:02,020 --> 00:55:05,660 당신은 그때는 그 일을하고있어, 교환 x와 y의 사본을 제공하는 것입니다 866 00:55:05,660 --> 00:55:09,080 하지만 실제로 x와 y 자체를 변경하지 않을 거에요. 867 00:55:09,080 --> 00:55:12,880 이 코드에서 앰퍼샌드와 전에 문자를 본 적이 않더라도 868 00:55:12,880 --> 00:55:15,860 단지 맞춰보세요. 앰퍼샌드는 분명히 무엇입니까? 869 00:55:15,860 --> 00:55:17,890 [학생]의 주소​​로 이동합니다. >> 주소는 이동합니다. 870 00:55:17,890 --> 00:55:21,160 따라서 앰퍼샌드 저에게 X의 주소를 제공 답니다. 871 00:55:21,160 --> 00:55:25,590 그곳이 어딘지 누가 알 겠어? 그것은 123로 발생합니다. 난 상관하지 않습니다. 나 한테 X의 주소를 제공합니다. 872 00:55:25,590 --> 00:55:28,340 & y는 나에게 Y의 주소를 제공 의미합니다. 873 00:55:28,340 --> 00:55:34,450 그리고 이야기를 그림과 완벽하게 일치 그 시점에서 우리는 잠시 전에 끌었다. 874 00:55:34,450 --> 00:55:38,310 >> 처음이 공부를 시작했을 때 나는 나에게 확실히 포인터를 인정합니다 875 00:55:38,310 --> 00:55:40,570 확실히 주변에 내 마음을 포장 할 수있는 아주 힘든 일 중에 하나 있었다. 876 00:55:40,570 --> 00:55:43,760 그러나, 우리가 일을 이러한 종류의와 함께 계속 연주 특히, 실현 877 00:55:43,760 --> 00:55:48,030 당신은 이러한 슈퍼 간단한 정렬로 다운 어기면 지적 문제를 재미 878 00:55:48,030 --> 00:55:52,270 단지 포인터와 혼란에, 주변의 답을 번호를 이동 879 00:55:52,270 --> 00:55:56,590 정말이 아주 기본적인 역학에서 파생 될 수 있습니다. 880 00:55:56,590 --> 00:55:59,070 여기 주소입니다. 별과 함께 이동합니다. 881 00:55:59,070 --> 00:56:03,830 또는 반대로, 여기 앰퍼샌드입니다. 주소가 실제로 무슨 생각 해보세요. 882 00:56:03,830 --> 00:56:06,270 괜찮아요. 883 00:56:06,270 --> 00:56:09,000 어디이 메모리의 모든부터 오는 거죠? 884 00:56:09,000 --> 00:56:12,360 우리는이 사진이 몇 번 그려 봤는데, 난 우리가 그에게 다시 돌아올 거라고 약속 유지 885 00:56:12,360 --> 00:56:14,920 하지만 여기서 컴퓨터의 메모리의 표현입니다 886 00:56:14,920 --> 00:56:17,420 그는 여기에 좀 더 라벨의 칠판보다입니다. 887 00:56:17,420 --> 00:56:21,590 상단에있는 텍스트 세그먼트는 프로그램에 대하여 무엇을 제시 하는가? 888 00:56:21,590 --> 00:56:26,090 [안 들리게 학생 응답] >> 죄송합니다? 다시 말해. 889 00:56:26,090 --> 00:56:28,660 [학생] 실제 프로그램. >> 실제 프로그램. 890 00:56:28,660 --> 00:56:32,430 >> 0s 및 C 코드를 작성 후 컴파일 한 1 초 후 실행 꽝 그래서 891 00:56:32,430 --> 00:56:35,910 및 최대 0s와 1S 끝을 생성하는 것은 메모리에 거기에 집어 넣하기 892 00:56:35,910 --> 00:56:38,570 두 번 Mac 또는 PC에서 아이콘을 클릭 할 때 이유 893 00:56:38,570 --> 00:56:43,010 또는 0s와 1S 디스크에서 해당 프롬프트에 마리오 같은 명령을 실행 894 00:56:43,010 --> 00:56:45,700 컴퓨터가이를 조작 할 수 있도록 메모리에로드하기 895 00:56:45,700 --> 00:56:47,540 더 신속하게 실행합니다. 896 00:56:47,540 --> 00:56:50,880 따라서 초기화 데이터 및 초기화되지 않은 데이터는, 우리는 그 얘기는 거의하지 않습니다 897 00:56:50,880 --> 00:56:52,420 하지만 그는 전역 변수입니다. 898 00:56:52,420 --> 00:56:54,710 초기화가에 값을 준 전역 변수를 의미한다 899 00:56:54,710 --> 00:56:59,300 초기화되지 않은 아직에 값을 제공하지 않은 전역 변수를 의미합니다. 900 00:56:59,300 --> 00:57:01,900 그럼 난 완전히에 내 손을 흔드는 것이 환경 변수는,이 901 00:57:01,900 --> 00:57:04,860 하지만이하고있는 사용자 이름과 같은 저장 일 902 00:57:04,860 --> 00:57:08,090 낮은 수준의 세부 정보 및 기타 종류. 903 00:57:08,090 --> 00:57:12,880 그러나 당신의 기억의 레이아웃 juiciest 조각을 스택과 힙이라는 것입니다. 904 00:57:12,880 --> 00:57:17,470 다시 스택은, 분명히, 함수가 호출 될 때마다 사용되는 메모리 905 00:57:17,470 --> 00:57:19,710 지역 변수가 있습니다 때마다 906 00:57:19,710 --> 00:57:22,120 그리고 때마다 매개 변수는 주위가 전달되고있다. 907 00:57:22,120 --> 00:57:24,490 그 모든 스택에 발생합니다. 908 00:57:24,490 --> 00:57:29,570 힙 우리가 얘기를하지만, 힙을 사용하는 추측을하지 않았습니다. 909 00:57:31,120 --> 00:57:32,690 메모리 만 다른 덩어리. 910 00:57:32,690 --> 00:57:36,620 그것은 상단에 여기 그려 질 일이지만, 임의의 그림 대회입니다. 911 00:57:36,620 --> 00:57:41,670 누가 무리가 주 동안 힙에서 메모리를 사용하고있어? 912 00:57:41,670 --> 00:57:44,830 그것은 기술적으로 당신 만 간접적 있습니다. >> [학생] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString 및 malloc. 자, 이제 근본적인 차이가 있습니다. 914 00:57:47,950 --> 00:57:51,300 >> 당신이 메모리를 필요로하면, 그냥 변수를 선언하는 지난 몇 주 동안 알아. 915 00:57:51,300 --> 00:57:54,560 당신은 메모리를 많이해야하는 경우, 오른쪽 안쪽 함수의 배열을 선언합니다. 916 00:57:54,560 --> 00:57:59,620 당신은 로컬 내부 함수의 변수를 선언하면 우리가 직면 보관 한 문제입니다 917 00:57:59,620 --> 00:58:05,340 즉시 함수의 리턴으로, 어떻게 메모리와 그 변수에 어떻게됩니까? 918 00:58:05,340 --> 00:58:09,620 그 뿐이에요는 당신이 더 이상없는거야? 그냥 개념적으로 정렬 사라집니다. 919 00:58:09,620 --> 00:58:13,950 그것은 분명, 물리적으로 아직도하지만 더 이상 사용할 수있는 권리가 없습니다. 920 00:58:13,950 --> 00:58:17,160 당신이 인생에서 기능을 작성하려는 경우 이건 분명히 문제가됩니다 921 00:58:17,160 --> 00:58:20,440 실제로 메모리를 할당하고 즉시 돌아주지 않는. 922 00:58:20,440 --> 00:58:24,180 점에서 사례 : 삶의 GetString의 목적은 사전에 아무 생각이없는 것입니다 923 00:58:24,180 --> 00:58:26,390 어떻게이 키보드에 입력하는거야 문자열의 큰 924 00:58:26,390 --> 00:58:30,390 그러나 그 데이비드 나 인사를 잡아 메모리를 할당 할 수있어 925 00:58:30,390 --> 00:58:32,860 사용자가 들어 입력 한 수도 또는 전체 에세이 926 00:58:32,860 --> 00:58:35,280 그럼 GetString는 malloc을 사용하고 있습니다. 927 00:58:35,280 --> 00:58:38,910 Malloc 따라서이 아닌 스택을 사용합니다; 928 00:58:38,910 --> 00:58:40,770 대신에 힙 불리는이 물건을 이용하고 있어요. 929 00:58:40,770 --> 00:58:44,430 메모리에 대한 서로 다른 아무 것도 없습니다. 그것은 빠르게 또는 느리게하거나 그런 건 없습니다. 930 00:58:44,430 --> 00:58:46,570 이 다른 위치에 단지 물리적으로입니다. 931 00:58:46,570 --> 00:58:50,120 >> 그러나 규칙은 그 힙에 할당되어있는 메모리 932 00:58:50,120 --> 00:58:56,180 당신이 연락 할 때까지 널 떠난다되지 않습니다 - 맞춰보세요 - 무료입니다. 933 00:58:56,180 --> 00:59:00,510 대조적으로, 모든 메모리는 당신이 배열을 선언하여 스택에 요청 934 00:59:00,510 --> 00:59:03,320 또는 우리가 주 동안 일을 한 것 같은 변수를 선언, 935 00:59:03,320 --> 00:59:05,640 그건 기본적으로 스택에 끝납니다. 936 00:59:05,640 --> 00:59:09,550 그게 그 rarer의 경우에 시간이 큰 90 %를 작동하지만, 937 00:59:09,550 --> 00:59:12,470 당신은 메모리를 할당하고 주위에 유지하려는 938 00:59:12,470 --> 00:59:14,730 다음은 malloc 같은 함수를 사용해야합니다. 939 00:59:14,730 --> 00:59:19,370 아니면, 우리가 결과적으로 malloc을 사용하여 GetString 같은 기능을 사용했습니다. 940 00:59:19,370 --> 00:59:23,300 이 파괴 한 후 빙키에서 들여다 봐도 어디 있는지 봅시다. 941 00:59:23,300 --> 00:59:25,820 앞으로 그에게 돌아올 거예요. 942 00:59:25,820 --> 00:59:29,270 다음은 첫 2 라인에 무엇을 수행하는 슈퍼 간단한 프로그램입니다? 943 00:59:29,270 --> 00:59:33,460 영어로, 코드의 이러한 첫 2 줄 안에 주요 무슨 말을해야하나요? 944 00:59:33,460 --> 00:59:35,600 [안 들리게 학생 응답] 945 00:59:35,600 --> 00:59:37,880 조심하세요. 그것은 나에게 X 또는 Y의 주소를 제공하지 않습니다. 946 00:59:37,880 --> 00:59:41,840 [학생] ints에 포인터를 부여합니다. >> 좋아. 정수 나에게 두 포인터를 제공합니다. 947 00:59:41,840 --> 00:59:45,130 즉, 저에게 오늘 그림을 보관하는 메모리의 2 덩어리를 제공 948 00:59:45,130 --> 00:59:46,950 할지라도 사각형으로, 지금 삭제. 949 00:59:46,950 --> 00:59:50,000 나에게 메모리의 2 덩어리를달라고, 하나는 X라고, 하나는 Y라는 - 950 00:59:50,000 --> 00:59:54,320 이전 그들을 s와 t라고 - 메모리의 청크의 종류는 무엇인가? 951 00:59:54,320 --> 00:59:57,160 이 주소를 저장하는거야. 952 00:59:57,160 --> 00:59:59,110 이 유형 INT의 *의입니다. 953 00:59:59,110 --> 01:00:01,630 >> 따라서 정수의 주소는 결국 X에서 살 것이다 954 01:00:01,630 --> 01:00:03,860 정수의 주소 결국, Y에 살 것이다 955 01:00:03,860 --> 01:00:08,460 하지만 처음에, x와 y의 내부 뭐죠? 누가 알 겠어? 쓰레기 값. 956 01:00:08,460 --> 01:00:10,180 이 포인터와는 아무 상관이 없습니다. 957 01:00:10,180 --> 01:00:12,720 우리는 거기에 실제로 무엇이 있는지 알고 뭔가를 넣어하지 않은 경우? 958 01:00:12,720 --> 01:00:18,950 이제 X. 무슨 일이됩니까? x는 포인터이기 때문에 지금은 합법적입니다. 이 정수 *입니다. 959 01:00:18,950 --> 01:00:21,870 그래서 X에서 메모리의 일부 청크의 주소를 넣을 수 있습니다 의미한다. 960 01:00:21,870 --> 01:00:25,120 malloc은 무엇을 반환합니까? 완벽한는, 주소를 반환 961 01:00:25,120 --> 01:00:28,510 메모리의 전체 덩어리의 첫 번째 바이트의 주소. 962 01:00:28,510 --> 01:00:31,140 이 무리가 어플라이언스에, 예를 들어, 얼마나 많은 바이트를 할당입니까? 963 01:00:31,140 --> 01:00:33,510 정수의 크기는 무엇입니까? 4. 964 01:00:33,510 --> 01:00:36,600 당신은 주 1 다시 생각한다면, 그것은 항상 기억하는 것이 중요 슈퍼 아닙니다 965 01:00:36,600 --> 01:00:38,870 하지만이 경우는, 4 바이트를 아는 것은 중요한 일이다. 966 01:00:38,870 --> 01:00:41,770 그래서이 힙 4 바이트에 할당되어 있습니다 967 01:00:41,770 --> 01:00:46,110 그리고 임의로 나에게 첫 번째의 주소를 반환있어. 968 01:00:46,110 --> 01:00:47,700 지금, x는 뭐하는 거지? 969 01:00:47,700 --> 01:00:52,200 A * X = 42이 뭐하는거야? 970 01:00:52,200 --> 01:00:57,150 우리는 쓰레기 값과 같은 X를,이 이야기의이 시점에서하는 경우 971 01:00:57,150 --> 01:01:04,120 이 지금은 라인 3에서 I는 4 바이트를 할당, 이제 어떤 쓰레기 값이 Y입니다. 972 01:01:04,120 --> 01:01:06,950 이 사진은 본질적으로이 것 같습니다. 973 01:01:06,950 --> 01:01:12,010 이 임의의 주소 123 인 경우 또는 더 구체적으로, 이곳은 우리의 이야기가 현재의 모습입니다. 974 01:01:12,010 --> 01:01:23,940 * X = 42 지금 무슨 뜻 이죠? 주소 (123)로 이동하여 수 거기에 42 넣어 의미한다. 975 01:01:23,940 --> 01:01:26,220 우리가 문자열을 다하고 않아서이 라인을 그릴 필요가 없습니다. 976 01:01:26,220 --> 01:01:29,480 >> 난 그냥 이렇게 서면, 그리고 데모의 위해어야 977 01:01:29,480 --> 01:01:33,240 정수 가지로 42, 4 바이트를 공간을 많이 차지합니다. 978 01:01:33,240 --> 01:01:35,960 수 있도록 거기에 무슨 일이 일어 났는지 만, 문제가 지금 거기입니다. 979 01:01:35,960 --> 01:01:40,580 * y는 = 13. 무슨 일이 일어날거야? 980 01:01:40,580 --> 01:01:46,470 문제는 우리의 단순화 된 세계에서 * Y 것은 단지 Y의 주소로 이동을 의미합니다. 981 01:01:46,470 --> 01:01:48,590 Y에 무엇입니까? 그것은 어떤 쓰레기 값입니다. 982 01:01:48,590 --> 01:01:53,150 그럼 쓰레기 값이, 그런 미친 짓 5,551,212 것을의는 가정을 해. 983 01:01:53,150 --> 01:01:56,750 * Y 수단은 5,551,212를 해결하기 위해 이동합니다. 984 01:01:56,750 --> 01:02:00,450 그래서 여기 똑같아. 그것은 예를 들어, 존재하지 않습니다. 985 01:02:00,450 --> 01:02:05,310 따라서 * y는 제가 여기에 13을 끌기 위해 노력하고있어 13 의미를 얻을 수 있습니다. 그것은 존재하지 않습니다. 986 01:02:05,310 --> 01:02:08,790 나는 칠판의 세그먼트를 초과했습니다. 무엇을 어떻게해야합니까? 987 01:02:08,790 --> 01:02:14,930 제가 메모리에 넣어하려고하기 때문 암호화 된 메시지 분류 오류 988 01:02:14,930 --> 01:02:19,470 존재하지 않는 장소에서 13과 같은 값입니다. 989 01:02:19,470 --> 01:02:23,900 프로그램의 나머지 부분은하지 않는 그 시점까지 좋아,하지만 할 일이 있습니다. 990 01:02:23,900 --> 01:02:25,350 그럼이 이야기를 봅시다. 991 01:02:25,350 --> 01:02:27,830 우리는 우리가 마법에 대해 이야기 한 후에 다시 올게요. 992 01:02:27,830 --> 01:02:30,290 의이로 돌아가서 빙키라고이 일을 함께 체결하자, 993 01:02:30,290 --> 01:02:33,710 어느 리콜, claymation 놀고 집에 앉아있는 스탠포드 교수 994 01:02:33,710 --> 01:02:36,380 정확히 같은 프로그램의 이야기를합니다. 995 01:02:36,380 --> 01:02:40,580 이건 그냥 길이 약 3 분입니다. 여기 빙키 있습니다. 996 01:02:40,580 --> 01:02:45,030 [비디오에 남자 스피커 안녕 빙키, 일어나. 이 포인터 즐거운 시간입니다. 997 01:02:45,030 --> 01:02:50,080 [빙키] 그게 뭔데? 포인터에 대해 자세히 알아보십시오? 아, 케이크! 998 01:02:50,080 --> 01:02:53,700 [남성 연사는 자, 시작하려면, 우리가 몇 포인터를해야 할 것 같아요. 999 01:02:53,700 --> 01:02:57,890 >> [빙키] 좋아. 이 코드는 정수를 가리 킵니다 수있는 2 개의 포인터를 할당합니다. 1000 01:02:57,890 --> 01:03:02,220 [남성 스피커] 좋아요. 글쎄, 난 2 포인터를 참조하십시오,하지만 그들은 아무 가리키는되지 않는 것 같습니다. 1001 01:03:02,220 --> 01:03:05,550 [빙키] 그래, 맞아. 처음에는 포인터가 가리키는되지 않습니다. 1002 01:03:05,550 --> 01:03:09,270 그들은 가리 일이 pointees라고하고이를 설정하면 최대 별도의 단계입니다 수 있습니다. 1003 01:03:09,270 --> 01:03:12,330 [남성 스피커] 아, 맞아, 맞아. 나는 그렇게 알고 있었다. pointees은 별도입니다. 1004 01:03:12,330 --> 01:03:15,630 음, 그럼 당신은 pointee를 할당합니까? 1005 01:03:15,630 --> 01:03:21,510 [빙키] 좋아. 이 코드는 새로운 정수 pointee을 할당하고,이 부분은 X가 가리 키도록 설정합니다. 1006 01:03:21,510 --> 01:03:23,500 [남성 스피커] 이봐, 더 나은 보입니다. 1007 01:03:23,500 --> 01:03:26,030 그럼 뭔가를합니다. >> [빙키] 좋아요. 1008 01:03:26,030 --> 01:03:30,300 나는 역 참조 포인터 x를 그 pointee에 42 번을 저장하기드립니다. 1009 01:03:30,300 --> 01:03:34,410 이 마술은 내가 dereferencing의 마법 지팡이가 필요합니다. 1010 01:03:34,410 --> 01:03:38,610 [남성 스피커] dereferencing의 마법 지팡이? 잘 됐네요. 1011 01:03:38,610 --> 01:03:44,230 [빙키]이 코드가 어떻게 생겼는지입니다. 난 그냥 번호를 설정하고거야 ... [소리 터지는] 1012 01:03:44,230 --> 01:03:46,100 찾아 [남성 스피커] 이봐 요, 거기가갑니다. 1013 01:03:46,100 --> 01:03:50,990 따라서 X에서 역 참조하고하면 화살표가 pointee에 액세스 할 다음 1014 01:03:50,990 --> 01:03:53,230 이 경우에는 거기에 42를 저장합니다. 1015 01:03:53,230 --> 01:03:57,630 이봐 요, 다른 포인터, Y를 통해 숫자 13를 저장하는 데 사용하십시오. 1016 01:03:57,630 --> 01:04:03,250 [빙키] 좋아. 난 그냥 Y를 여기서 가서 번호 13을 준비시킬 게요 1017 01:04:03,250 --> 01:04:08,360 그리고 단지 dereferencing 및 지팡이를 ... [윙윙 거리는 소리]와! 1018 01:04:08,360 --> 01:04:10,980 [남성 스피커] 안녕 아, 작동하지 않습니다. 1019 01:04:10,980 --> 01:04:14,870 >> 빙키, 말, 나는 y를 dereferencing하는 것은 좋은 생각이 아닌 것 같아 1020 01:04:14,870 --> 01:04:17,880 pointee를 설정하면 별도의 단계이기 때문에 1021 01:04:17,880 --> 01:04:19,850 그리고 우리가 그런 짓을 저질렀다고 생각하지 않습니다. 1022 01:04:19,850 --> 01:04:21,770 [빙키] 음, 좋은 지적이야. 1023 01:04:21,770 --> 01:04:26,640 [남성 스피커] 그래. 우리는 포인터 y를 할당하지만 우리는 pointee을 가리 키도록을 설정하지 않습니다. 1024 01:04:26,640 --> 01:04:28,780 [빙키 흠, 아주 예민. 1025 01:04:28,780 --> 01:04:30,690 [남성 스피커] 이봐 요, 당신은 빙키, 거기에 좋은 찾고 있습니다. 1026 01:04:30,690 --> 01:04:34,160 그렇게 문제를 해결할 수있는 X와 같은 pointee에 Y 점?주세요 >> [빙키] 그래. 1027 01:04:34,160 --> 01:04:37,100 나는 포인터 할당을 내 마술 지팡이를 사용합니다. 1028 01:04:37,100 --> 01:04:39,070 [남성 스피커]는 전에 같은 문제가 생길인가요? 1029 01:04:39,070 --> 01:04:40,840 [빙키] 아니,이 pointees을 터치하지 않습니다. 1030 01:04:40,840 --> 01:04:44,780 단지 다른과 같은 가리 한 포인터를 변경합니다. [소리 터지는] 1031 01:04:44,780 --> 01:04:48,570 [남성 스피커] 오, 알 겠어요. X 같은 곳으로 지금은 Y를 가리 킵니다. 1032 01:04:48,570 --> 01:04:51,140 그럼 기다립니다. 지금 y는 고정됩니다. 이 pointee 있습니다. 1033 01:04:51,140 --> 01:04:54,520 그래서 당신은 13 이상을 보내 다시 dereferencing의 지팡이를 시도 할 수 있습니다. 1034 01:04:54,520 --> 01:04:58,130 [빙키] 어, 알았어. 여기에 표시됩니다. [소리 터지는] 1035 01:04:58,130 --> 01:05:01,250 [남성 스피커] 저기 좀 봐요. 지금 Y의 작품을 dereferencing. 1036 01:05:01,250 --> 01:05:05,200 포인터가 그거 pointee을 공유하기 때문에, 그들은 모두 13을 참조하십시오. 1037 01:05:05,200 --> 01:05:06,910 [빙키] 네, 공유. 뭐든간에. 1038 01:05:06,910 --> 01:05:08,880 >> 이제 우리 곳을 전환하는거야? 1039 01:05:08,880 --> 01:05:11,420 [남성 스피커] 오, 전 우리 시간이 없어. >> [빙키]하지만 - 1040 01:05:11,420 --> 01:05:13,880 [남성 스피커] 3 포인터 규칙을 명심 해. 1041 01:05:13,880 --> 01:05:18,630 번호 1, 기본 구조는 포인터를 가지고이며 pointee로 가리 킵니다. 1042 01:05:18,630 --> 01:05:23,120 그러나 포인터 pointee는 별도이며, 일반적인 오류는 포인터를 설정하는 것입니다 1043 01:05:23,120 --> 01:05:25,680 하지만 그것을 pointee를 제공​​하는 것을 잊지 수 있습니다. 1044 01:05:25,680 --> 01:05:29,580 번호 2, 포인터 dereferencing는 포인터에서 시작을 통해 그 화살표를 따라 1045 01:05:29,580 --> 01:05:31,060 그 pointee에 액세스 할 수 있습니다. 1046 01:05:31,060 --> 01:05:34,340 우리 모두가 아시다시피 pointee가있는 경우,이 만 작동 1047 01:05:34,340 --> 01:05:36,460 어떤 가지가 숫자 1를 지배 다시 가져옵니다. 1048 01:05:36,460 --> 01:05:39,870 번호 3 포인터 할당 한 포인터를 소요하고 변경 1049 01:05:39,870 --> 01:05:42,390 다른 포인터와 같은 pointee로 연결합니다. 1050 01:05:42,390 --> 01:05:45,890 그래서 할당 후 2 포인터는 같은 pointee를 가리 킵니다. 1051 01:05:45,890 --> 01:05:47,800 때로는 공유가 이름이야. 1052 01:05:47,800 --> 01:05:50,910 >> 그리고 정말 모든 작업이 있습니다. 이제 안녕. 1053 01:05:50,910 --> 01:05:55,840 이 빙키입니다. 이 CS50입니다. 우리는 다음 주에 볼 수 있습니다. [박수] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]