[음악 연주] 데이비드 J. 마란 : 좋습니다. 이것은 CS50이며,이 넷째 주의 끝에있다. 그리고 항목 중 하나 오늘 디지털 포렌식의 즉, 정보를 복구하는 기술. 그리고 실제로, 비록 당신이 중간에있어 지금 평화의 세에서 및 브레이크 아웃, 다음 주, 초점이 켜집니다 정확하게이 도메인. 멋진 작업 그래서 한 I 적 했다, 다시 대학원에 있었다 나는 지방 근무 때 미들 섹스 카운티 지방 검사의 사무실, 일 법의학 작동합니다. 그래서 본질적으로, 매사 추세 츠 주 경찰, 계기, 경우에 작업 할 때 것 하드 드라이브 같은 것들에 가져 플로피 디스크와 메모리 카드 등이있다. 그리고 그들은 그들에게 손 것 저와 제 멘토로, 우리의 목표는 증거를 발견했다, 이 매체에 어떤를가 있다면. 지금, 당신은 볼 수도 흘긋 법의학의이 세상의 미디어, TV와 영화에서. 그러나 작업은 내가 있고, daresay 그 세계, 당신이 그것을 볼 것 같은 꽤하지 않습니다. 이제 살펴 보자 무엇을 당신은 아마 보았다. [동영상 재생] - 좋아. 지금, 당신에서 좋은 모습을 얻을 수 있습니다. [음악 연주] 그것을 기다려 봐. 그 다시 실행합니다. 잠깐만. 오른쪽으로 이동합니다. 저기. 그 동결. - 전체 화면. - 좋아. 그 동결. 당신은 그것에 것까지 -Tighten? 그에에 - 벡터 뒤쪽 휠에 의해 남자. 여기이 자리에 -Zoom. 적합한 장비의 섹스, 이미지를 확대하고 날카롭게 할 수 있습니다. 그게 뭐지? - 그것은 향상 프로그램입니다. 그 최대 명확한 당신은 모를 때? - 모르겠어요. 현실을 제고하자. -Enhance 제 A6. 나는 세부 사항을 개선, 그리고 ... - 난 강화 충분히 있다고 생각. 내 화면에 놓습니다. - 난 그녀의 눈에서 반사를 강화. 버리자를 통해이 작업을 실행하는 것 비디오 향상. -Edgar,이을 향상시킬 수 있습니다? 잠시만 요. 이 반사 작업을 받았는데. 저기의 누군가의 반사. -Reflection. 남자의 얼굴에 반사되어 있어요. 년 - 반사! 반사되어 있어요. 거울에 -Zoom. 당신은 반사를 볼 수 있습니다. 여기에서 이미지를 향상시킬까요? 당신은 그것을 향상시킬까요? 당신은 그것을 향상시킬까요? 우리는이 향상까요? 당신은 그것을 향상시킬까요? 초에 기다려 봐. 나는 향상됩니다. 문에 -Zoom. 10 배속. -Zoom. 에서 비켜. - 더. 잠깐, 중지합니다. 그만. 그것을 -PAUSE. 우리에게 75도 - 회전 수직 주위하시기 바랍니다. 그만. 부분으로 돌아 가기 문에 대해 다시. 비트 맵 수있는 이미지 보정기를 샀지? 우리는 프라 딥 싱을 사용 드리죠 방법은 창으로 볼 수 있습니다. 년 - 소프트웨어는 예술의 상태입니다. 년 - 고유 값이 꺼져 있습니다. 오른쪽의 섹스 algorithms--의 조합 - 그는의 촬영 조명 다음 단계로 알고리즘, 나는에 사용할 수 있습니다 이 사진을 향상시킬 수 있습니다. 에 고정시켜 및 z 축을 확대. -Enhance. 향상시킬 수 있습니다. -Enhance. 멈춰 및 향상시킬 수 있습니다. [END VIDEO 재생] 데이비드 J. 마란 : 그래서 사람들은 아르 모든 단어는,하지만 그들은하지 않았다 제대로 문장에 사용됩니다. 그리고 실제로 미래의 어떤 시간, , 당신은 다른 사람이 단어를 말 듣고하십시오 조금 웃음을 "강화". 당신이 향상 할 때 때문에, 예를 들어,이 문제가 발생하는 것입니다. 그래서 여기에 멋진 사진입니다. 이 CS50 자신의 Daven이다. 그리고 우리가 원한다고 가정 그의 눈에서 반짝임에 초점, 또는 반사 였습니다 나쁜 사람 감시 카메라에 의해 캡쳐. 이 때 발생하는 것입니다 당신은 이미지를 확대하는 단지 한정된 수있다 연관된 비트. 즉, 당신이 얻을 것이다 것입니다. 그리고 실제로, Daven의 눈 아마 여섯 픽셀이지만 네 그게 정확히 무엇을 구성 이 희미하게 빛나는했다. 그래서 문제 4 개 세트는 궁극적으로해야합니다 당신은 특히,이 세계를 탐험 일의 성격 상 우리는 파일 I / O, 어디 전화 I / O는 단지 멋진 방법입니다 입력과 출력을 말. 그래서 지금까지, 모든 상호 작용 우리는 컴퓨터와 함께 했어 로 크게왔다 당신의 키보드와 스크린, 하지만 하드 디스크 순전히, 또는 사람을 넘어 파일로 저장하면 자신을 작성합니다. 프로그램은 지금까지 가질 하지가 생성 및 저장되어 자신의 파일을 업데이트. 음, 파일은 무엇입니까? 음, JPEG 같은. 이것은 당신이 수있는 이미지입니다 이 페이스 북에 업로드, 또는 웹 어디서든 참조하십시오. 사실, 그 사진 우리 단지 Daven의 톱 JPEG이었다. 그리고 무슨 일이 재미있다 JPEG 파일과 같은 파일에 대한 들이 식별 될 수 있다는 것이다 일반적으로, 특정 비트 패턴에 의해. 즉, 그것이 무엇이다 GIF에서 JPEG를 구별 워드에서 PING에서 Excel 파일에서 문서? 음, 그냥 다르다 비트 패턴. 그리고 그 다른 패턴은 일반적으로 그 파일의 시작. 컴퓨터가 말씀을 열 때 그 그래서 문서 또는 컴퓨터가 JPEG을 열 때, 그것은 전형적으로 보이는 파일의 처음 몇 비트. 그리고이 패턴을 인식하는 경우, 그것은 오,이 이미지입니다 말했다. 나에게 표시하자 같은 그래픽 유저. 또는, 오,이 워드 문서처럼 보인다. 나 에세이로 사용자에게 보여 드리겠습니다. 예를 들어 그래서, JPEG 파일, 그것은 아르 밝혀 매우 정교한 후드 아래에. 그러나 대부분의 모든 제 3 바이트 JPEG는이 세 개의 숫자로 시작합니다. 그래서 바이트 0, 1, 및 두이다 대부분의 모든 JPEG, 255의 경우, 수 216 다음 번호 255. 그리고 당신은 할 수 있습니다 무엇을 다음 주에 일을 시작합니다 실제로 아래에 파고있다 JPEG 파일과 같은 파일의 후드 비트 맵 파일 등을들 수 있으며,보고 무슨 일이 항상 오래가있었습니다 당신은 컴퓨터를 사용하고있다. 그러나 일반적으로이없는거야 이 같은 소수처럼 작성합니다. 컴퓨터 과학자들은하지 않습니다 진수로 이야기하는 경향이있다. 그들은 정말 이진 말을하지 않습니다. 일반적으로 할 때 우리가 원하는 숫자를 표현하기 위해, 우리는 실제로 16 진수 사용 이는 당신이 기억하고있을 것 문제 설정, 말에서 도전 하나 당신은 다른 시스템에 대해 생각합니다. 우리는 물론, 익숙 구를 통해 진수, 0 인. 우리는 진에 대해 이야기했다. 그리고 우리는 정말이 없습니다 많은 여기에 사용하기 아웃에 컴퓨터를 이용합니다 때문입니다. 그러나 프로그래머는 매우 것 종종, 항상 그런 것은 아니지만, 그냥 의미하는 16 진수를 사용 당신이 당신의 알파벳 16 글자가 으로 두 개 또는 10에 반대했다. 그렇다면 이상으로 센다 16 진수로 구 이상? 만약 이동 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 단지 규칙에 따라 C, D, E, F, 나. 그러나 중요한 것은 각 점이다 이 중 하나의 상징이다. 더 열이 없습니다. 각 때문에 더 11, 그 자체가 없습니다 당신의 자리로, 단지 소수에 좋아 그냥 진에 추천하고, 그냥해야 규칙에 따라 하나의 문자 수. 우리가 가지고있는 알파벳이되도록 진수에 대한 우리의 처분에. 그래서 JPEG는 경우처럼 무엇을 보는가 그 첫번째 세를 기록했다 , 소수로하지 바이트 만 예를 들면, 16 진법 (hexadecimal)으로? 왜 진수는 그 유용도 모두입니까? 음, 예를 잠깐 살펴. 나는 비트를 쓰는 그래서 만약 그 이러한 소수점 숫자들을 나타냅니다 이 녹슬 수 있습니다 이제 다시 몇 주에서, 왼쪽 하나는하지만, 오른쪽에 하나는 매우 쉽습니다. (255)는 가장 큰 숫자 우리이었다 8 비트와 함께 나타낼 수 있습니다. 그것은 모든 사람이었다. 그래서 약간입니다 만 한 흥미로운 가운데 하나입니다. 그리고 당신은 가지에서 할 경우 수학, 당신은 참으로 그 추론한다 하나의 패턴 제로는 216을 나타냅니다. 그래서 그냥에 대한 규정하자 이제 이러한 올바른지. 그런데 왜이 재미있다? 그런데, 바이트는 물론, 8 비트이다. 그리고 그것은 당신이 생각하는 경우 밝혀 4 비트의 두 덩어리로 바이트, 이있다. 나 그냥 일부 공간을 추가 할 수 있습니다. 그래서 전, 후. 전 그냥 공백을 추가 한 여기 시각화의 위해서. 어떻게 우리가 지금에 나타낼 수, 말 16 진수 각 비트 쿼드, 4 비트의 각 세트? 예를 들면, 좌측에 따라서 지금, 우리는 이진 1111이있다. 진수로 그 숫자는 무엇입니까, 당신은 수학을한다면? 당신은 사람의 장소가, 조로 장소, 발로 장소 및 형상을 장소. 대상 : 15. 데이비드 J. 마란 : 그것은 15입니다. 그래서 우리는 팔 플러스 넷을 할 경우 더하기 둘 더하기 하나는, 우리는 15를 얻는다. 그래서 아래 15를 기록 할 수 1111, 그러나 여기에서 요점 16 진수, 진수 없습니다. 그래서 그 대신 적어 15, 1-5, 나는 16 진수에 해당를 작성하는거야 당신이 가지고있는 경우는, 다시 생각하면되는 F 0 - 어떤 15가 될 것입니다? 청중 : 바. 데이비드 J. 마란 : 그래서 그것의 F를 밝혀졌습니다. 그리고 당신이 말하는 그 정도는 알 작업 할 수 있습니다, 이 10 인 경우도, 다음 확인을, F는 15입니다. 그래서 참으로, 우리는 다시 수 F f를 같은 번호의 동일한 집합입니다. 그리고 우리는 수학의 비트를 할 경우, 우리는이 D 있다고 추론 할 수 있습니다. 여덟, 아주 쉽게 우리 때문에 석 장소에서 일을해야합니다. 그리고, 우리는 F F의 몇 가지 더있다. 그래서 인간 관례 적으로하는 경향이 그들이 사용하는 경우 16 진수 그들은 단지입니다 더 간결이 조금 쓰기 그 공백의 대부분을 제거. 그리고 그냥 슈퍼 명확하게 이 16 진수임을 독자, 중 간단한 규칙 인간은 당신이 제로를 기록 다른 의미가 없습니다 X, 시각적 식별자보다 여기에 16 진수가 제공됩니다. 그리고, 당신은 f를 두 자리 숫자를 넣어 이 경우에 F, D 후, 다음 F F. 그래서 긴 이야기를 짧은 진수는 경향이있다 유용하는 각 때문에 숫자, F 0 - 완벽 라인 4 비트의 패턴 닫. 두 개의 16 진수가 생기면, 제로 또 다시 F를 통해, 그 완벽을 제공합니다 8 비트 또는 한 바이트. 이 경향 이유야 통상적으로 유용합니다. 아무런 지적이 없다 정말 이상 내용, 실제 유틸리티 이외의. 지금 JPEG 파일은뿐만 아니라 아르 그래픽 파일 포맷. 당신은이 있다는 것을 기억 있습니다 세계에서 같은 파일, 적어도 몇 년에서. 그래서이 사실이었다 윈도우 XP에 설치 전 세계 수백만 대의 PC에. 그리고이 비트 맵 파일, BMP이었다. 그리고 비트 맵 파일로 당신 옆에 볼 수 있습니다 주, 단지 도트의 패턴을 의미 그들이이라 불리는로 픽셀, 정말, 비트에 매핑합니다. 그래서 비록, 흥미, 이 파일 형식, BMP에 대해서, 인 이 후드 아래, 그것을 단지 세 바이트보다 더 많은 것이있다 그 때문에, 헤더를 구성 처음 몇 바이트를 구사합니다. 사실은 조금 보인다 언뜻 보면 복잡. 그리고 당신은 P 설정이 표시됩니다. 그리고 무언가를 얻기 이 특정 밖으로 지금 그냥 사실로, 그렇게 중요하지 않다 그 각 비트 맵의​​ 시작 파일, 그래픽 형식으로, 숫자의 전체 무리가있다. 이제 마이크로 소프트, 이 형식의 저자, 그 호출 경향 일하지 정수 및 문자 그리고 수레하지만 단어와 D 단어와 걷고 바이트. 그래서 그들은 단지 다른 데이터 유형이있어. 그들은 다른 이름이야 같은 일을합니다. 하지만 당신은 P 4 개 세트에이를 볼 수 있습니다. 하지만이 말을 아니라 그 인간의 경우 에 대한 몇 가지 .BMP 파일을 두 번 클릭 그의 혹은 그녀의 하드 드라이브 및 창이 열립니다 그 사람이나 그 여자 그 이미지를 보여주는까지, 그 운영하기 때문에 무슨 일이 있었 시스템은 아마도뿐만 아니라 발견 .BMP 파일 확장자 파일 이름, 뿐만 아니라, 사실은 거기에 몇 가지 비트 패턴 협약 처음에 그 비트 맵 파일의. 하지만 그건 지금에 집중하자 이러한 복잡한 파일 대신 이렇게 뭔가. 나는 gedit에서 여기에 가정 그냥 시작을 아주 간단 프로그램의. 나는 약간의 상단을 포함하고 있어요. 지금 내가 가진 # 포함 "structs.h"하지만, 나는 순간에 다시 그에게 올 것이다. 그러나 지금은 유용합니다. 그래서이 프로그램입니다 그 구현 것 등록 기관의 데이터베이스 등을들 수있다. 그래서 학생들의 데이터베이스, 세계의 모든 학생 아마 이름과 집과​​이 다른 것들, 그러나 우리는 간단하게합니다. 모든 학생의 이름과 집이있다. 나는를 쓰고 싶다한다면 그 목적은 인생에서 프로그램 단지에서 반복되었다 세까지의 제로, 세 학생이 있다면 하버드 대학. 그리고 난 그냥있는 getString을 사용하고 싶지, 각 학생의 이름과 집, 다음 그냥 그를 인쇄 할 수 있습니다. 이 종류의 주처럼 하나, 둘째 주 물건 지금 난 그냥 위해 원하는 위치에 루프 또는 그런 일. 그리고, getString에 몇을 호출 할 시간은 다음 몇 번 f를 인쇄 할 수 있습니다. 그래서, 비록이 작업을 수행하는 방법, 때 이름과 집 모두 각 학생 참여? 그래서 내 첫번째 본능 수도 이런 식으로 뭔가를 할 수. 내가 먼저 잘 줘, 말할 수도, , 이름이라는 문자열 배열을 말한다. 그리고 하드 코드 셋 여기를 원하지 않는다. 내가 거기에 넣고 싶어? 그건 그냥이기 때문에, 학생들은 그래서 상단 선언 상수 나는 하드 코딩 할 필요가 없습니다 둬 여러 장소에서 세. 이 방법은, 내가, 그것을 한 장소를 변경할 수 있습니다 그리고 사방 변화에 영향을 미친다. 그리고, 내가 할 수 있습니다 문자열은 학생을 수용. 그리고 지금, 내가 좋아하는 일을 할 수 있습니다 내가 학생을 <;에 (I = 0 int 전은 + +. 그래서 빠른 입력 해요,하지만이입니다 지금은 아마 익숙한 구문. 그리고 지금이 최근 있었다. 나는 i 번째에 넣어하려는 경우 학생의 이름, 나는 이렇게 생각한다. 그리고, 이름이 아닌 하지만 집은 내가 브라켓. 나는이,있는 getString을 수행하고하자 나를 되돌아 가서이 줄을 수정합니다. 동의? 동의? 그것은 매우 사용하기 쉬운이 아니다. 나는 무엇을해야 하는지를 사용자를 말하지 않았다. 하지만 지금 나는 경우도 나중에하자 싶어 말하자면, 이러한 것들을 인쇄 병원을 나온 그래서 TODO 이상이 필요합니다. 좀 더 함께 할거야 틀림없이이 될 것 ... 의 올바른 구현 이름과 주택, 셋을 얻는 사용자로부터 각각 그들 전체. 그러나 이것은 매우 좋은 디자인, 오른쪽 아닌가요? 어떤 학생이 아니라 이름이있는 경우 그리고 집뿐만 아니라, ID 번호, 및 전화 번호, 및 이메일 주소 어쩌면 홈 페이지 및 아마 트위터 핸들, 및 기타 세부 사항의 수 학생 또는 사람과 연관 더 일반적으로. 우리는 추가 시작하는 방법 이 프로그램에 기능? 글쎄, 난하는데 가장 간단한 방법 같은 느낌 같은 일을 가정 해 보자하는, IDS의 학생을 int로. 그래서 나는 거기에 모든 ID를 넣을 수 있습니다. 그리고, 무엇인가 전화 번호 등 나는 방법을 모르겠어요 아직 것을 나타냅니다. 그래서 앞서 단지 호출 가자 이 학생을, twitters하는 조금 이상한,하지만 ...이다 및 필드 무리보다. 나는 효과적으로에 시작했습니다 복사 및 붙여 넣기하십시오. 그리고이 꽤 증가 할 것입니다 꽤 빨리 다루기 힘든, 오른쪽? 거기에 있다면 좋지 않을까요 세계의 데이터 구조는 공지 int가 아닌 나 문자열,하지만 뭔가로 높은 수준의 추상화, 그래서 학생으로 알려져하니? C는 내장 함께 제공되지 않은 학생들을위한 기능 하지만 그러한주고 싶어 경우 어떻게? 글쎄, 내가 갈거야 밝혀 , structs.h 여기라는 파일을 엽니 다 당신은 정확하게 작업을 수행 할 수 있습니다. 그리고 우리가 지금이 일을 시작하는 것입니다. 그리고 P 3 설정의 후드 아래, 당신은 이미 지금이 일을했습니다. g의 RECT 같은 건 없다 또는 프로그래밍 언어 C의 g 타원형 스탠포드에서 사람들은 그 구현 여기서이 방법을 사용하여 데이터 타입, 자신의 새로운 데이터를 선언 새로운 유형의 키워드를 사용 라는 구조체 및 다른 하나라는 형식 정의. 그리고 실제로, 비록 구문 재료는 조금 다르게 보입니다 우리는에, 전에 본 적이 원칙적으로, 그것은 매우 간단합니다. 이것은 단지 "유형을 정의"을 의미합니다. 즉이 될 것 구조 및 구조 단지 용기처럼 여러 것들에 대한. 그리고 그 구조는 것입니다 이름라는 문자열을 가지고, 그리고 문자열은 집이라고. 그리고 그냥 편의를 위해 전화를하자, 이 모든 데이터 구조 학생. 그래서 순간 당신은에 도착 세미콜론, 당신은 지금이 자신의 데이터를 생성 종류라​​는 학생 즉 지금 INT 함께 서 플로트 및 문자, 문자열, 와 g의 RECT 및 g 타원형, 그리고 임의의 숫자 다른 것들의 사람들이 발명했다. 따라서이에 대한 유용한 무엇 지금 돌아 가면 것입니다 공을 구조체이 완료됩니다 내가 쓴 구현 여기에 사전에 모든 것을 알 수 피할 수없는 어지러움의 I가 추가로 발생 시작하고 있었다 전화 번호 및 twitters 모든 이러한 다른 것들 학생의 정의, 지금은 간결 싸서있어 학생들의 한 배열로. 그리고 그 학생의 각 지금 그 안에 여러 가지가 있습니다. 있도록하는 것은 하나의 질문을 남긴다. 어떻게 이름에서 얻을 수 있습니까, 그리고 집, ID, 그리고 어떤 다른입니다 학생의 내부? 슈퍼 간단한뿐만. 새로운 구문하지만 간단한 아이디어. 배열에 당신은 단순히 인덱스, 우리는 지난 주이 그랬던 것처럼. 그리고 무슨 일이 분명하다 구문의 새로운 조각? 그냥., 의미 "내부 이동 구조와 필드는 호출받을 이름은, 집 불리는 필드를 얻을 학생이라는 필드를 얻을. " 그래서 P 3 설정, 당신은이 있다면 아직도 그 작업, 아직도 대부분의 사람들 당신과 같은 것을 실현된다 같은 것들을 사용하여 시작 g의의 구형 및 g 타원 다른 것들에 보이지 않는 주 0, 1, 2에서 온 즉 스탠포드 때문입니다 실현 새로운 데이터 유형을 선언했다. 그리고 사실, 즉 정확히 무엇을 우리는거야 P 4 개 세트에,뿐만 아니라, 수행 할 때 우리는 일을 처리하기 시작 이미지, 비트 맵, 그리고 더욱. 그래서 그냥 맛보기와이야 올 무엇인지에 대한 정신 모델입니다. 지금, 나는 미루 약간의 아침. 내가 무엇을보고 가지 궁금 마이크로 소프트 벽지 실제로 오늘처럼 보인다. 그리고 그것은 2006 년에 사람을 밝혀 실제로 거의 정확하게 갔다 같은 자리는 실제로 촬영하기 어떻게 이러한 일처럼 보인다. 이 필드는 이제 조금 자란입니다. 그래서 이미지의 지금 말하고, 여기서 Daven을 다시 가져 보자 화면 니콜라스에, 단지 당신을 생각 나게 당신은 점심 식사를 위해 우리와 함께하고 싶은 경우 우리 보통의 URL이 금요일, 머리 여기. 어디 우리는 월요일에 떨어져 떠 났죠? 우리는 바로이 문제를 도입? 이것은 겉으로는 정확했다 스왑의 구현, 이에는 두 개의 정수를 복용 하나는 B라는 하나라는 로라 여기에 그랬던 것처럼, 그들을 교환 우유와 물을 무대에, 를 사용하여 임시 변수 또는 빈 컵, 우리는과에서의 b 넣을 수 있도록 엉망진창으로하지 않고 나. 우리는 변수를 사용했다. 그것은 온도라고. 그러나 근본적인 무엇이었다 월요일에이 코드 문제? 여기에서 문제는 무엇인가? 그래. 청중 : 그것은 더 많은 공간을 차지합니다. 데이비드 J. 마란 : 자세한 차지 공간, I 변수를 사용하고 있기 때문에, 그 괜찮습니다. 그건 사실이지만, 난 그 확인을 말할 것. 그것은 그랜드에서 32 비트입니다 사물의 체계, 그래서하지 큰 문제. 다른 생각? 청중 : 그것은 단지 스왑 로컬 변수. 데이비드 J. 마란 : 그렇지. 그것은 단지 로컬 변수를 교환합니다. 언제 당신은 function--를 호출하기 때문에 나는 아넨 버그에서 용지함을했을 때 마지막으로, 당신은 바닥에 주요 있습니다. 즉시 호출 함수를 호출로 스왑, 스왑은 X와 Y를 얻을하지 않습니다, 원래 값. 무엇 우리가 주장 않았다 스왑 GET합니까? 청중 : 복사합니다. 데이비드 J. 마란 : 그 사본 그래서. 그래서 당신이 경우, 하나 둘 도착 마지막에서 예를 리콜, 하지만 한 두 사본 그 성공적으로 교체된다. 그러나 불행하게도 결국, 이러한 값은 여전히​​ 동일합니다. 그래서 우리는 이것을 볼 수있는 우리의 새 친구, 희망 GDB, 당신이나 TF들과 칼슘의가 있다고 다음으로 당신을 안내하고. 그래서 더 스왑 리콜하자 라니 보지 않는다 이 같은이 항아리 모양을 엽니 다. 우리는 두 가지로, 하나의 Y를 X를 초기화. 인쇄 F의 한 무리가 있었다. 그러나, 키 호출 여기에, 스왑이었다 정확하게 코드 우리입니다 잠시 전 보았다. 어떤 처음에 정확 눈에 있지만, 기능적으로, 이 프로그램 때문에 작동하지 않습니다 이 영구적으로 X와 Y를 교환하지 않습니다. 그래서, 빠른 따뜻한의이를 보자 여기 GDB, ./noswap 최대. 압도적 인 정보의 무리가 지금 필자가 제어 L로 없애 것이다. 그리고 지금, 나는 갈거야 가서 실행합니다. 그리고 불행하게도, 그 그 유용하지 않았다. 그것은이 내부 프로그램을 실행 프로그램은 GDB 디버거를 호출 그러나 그것은 나를 찌를 수 있도록하지 않았다. 그래서 실제로 일시 중지 할 수있는 방법 이 프로그램 안에 실행? 그래서 휴식. 그리고 나는 어떤에 깨질 수 있습니다 행 번호 번, 10, 15. 그러나 나는 또한 상징적으로 손상 될 수 있습니다 휴식 주를 말하면서. 그리고 휴식을 설정할 것 점을 분명히 메인 라인 16에서. 어디 선 16? 의 코드까지 가자 및 noswap까지 이동합니다. 그리고 실제로, 라인 (16)은 첫 번째 프로그램. 그래서 지금, 내가 가서 입력하면 이 시간을 실행 입력이 일시 중지되었습니다. 그럼 살펴볼 수 있습니다. 왜 X 제로가 x-- 인쇄? 그리고 달러 기호를 무시합니다. 즉, 애호가를위한 단지 프로그램의 사용. 왜 순간에 X 제로인가? 그래. 청중 : 그것은 바로 전에 일시 중지 라인 (16), 실제로 라인 16. 데이비드 J. 마란 : 그렇지. GDB 기본적으로 일시 중지했다 단지 라인 (16) 전에 실행. 그래서이 실행되지 않은 어떤 알 수없는 값입니다 X를 의미한다. 그리고 우리는 그것의 운이있어 제로와 같은 깨끗한 뭔가. 그래서 지금은 다음에 입력하면, 지금은 16를 실행. 내가 17을 실행하는 것이 기다리고있어. 내가 앞서 인쇄 X 가자. 그것은 하나입니다. 내가 앞서 인쇄 Y 가자. 나는 지금 무엇을 볼 것인가? 청중 : [들리지] 데이비드 J. 마란 : 약간 크게. 청중 : [들리지] 데이비드 J. 마란 : 그렇진 합의. 그래서 그래, 우리는 약간의 쓰레기 값을 참조하십시오. 이제, Y​​가 134,514,064입니다. 음, 그냥 쓰레기 값입니다. 내 프로그램은 RAM을 사용합니다 다른 목적을 위해. 다른 기능이있다. 다른 사람들은 내 컴퓨터의 내부를 썼다. 그래서 이러한 비트가 사용되어왔다 다른 값, 그리고 내가 무엇을보고 있어요 일부의 잔재입니다 해당 메모리의 사용 전에. 그래서 더 큰 문제가 있기 때문에 빨리 내가 옆에 입력 한 후 Y를 인쇄로, 그것은으로 초기화있어 내가 원하는 값입니다. 그래서 지금의 조금 더 빨리 진행 할 수 있습니다. 다음에 대한 N. 다시 한 번 해 보자. 다시 한 번 해 보자. 하지만 치고 싶어하지 않는 여기에 있기 때문에 나는 경우 내부에 무슨 일이 일어나고 있는지보고 싶어 스왑의 명령은 무엇입니까? 청중 : 단계. 데이비드 J. 마란 : 단계. 그래서이 나를 단계 오히려보다 위에 기능. 그리고 지금은 좀 애매하다 정직하게, 그러나 이것은 단지입니다 지금은 33 행에있어 말해. 그리고 다시 한 번이 작업을 수행 할 수 있습니다. 인쇄 온도. 쓰레기도, 음성이 때, 하지만 그건 그냥 여전히 쓰레기 값입니다. 그럼 다음, 인쇄 온도를 할 수 있습니다. 그것은, 1로 초기화하는 것 일명 x의 값이었다. 자, 여기서 우리는과에서 오는 x를? 음, 우리는 주에 주목 이 값 x와 y를했다. 우리는 다음과 같이 그들을 스왑 통과했다. X는 쉼표 y를 먼저했다. 그리고, 스왑 그들에게 X와 Y를 호출 할 수 있습니다. 그러나 명확성을 위해, 이건 B와 이들을 호출. 그러나 A와 B는 이제 될 것 아르 각각 X 및 Y, 사본. 나는, 온도 다시 GDB로 이동한다면 이제 하나이며, 지금은 하나입니다. 지금 다음에 무엇을하고하지만 인쇄를 , 이미 이상 이동되었습니다. 우유는 이전에 주입 된 오렌지 주스의 유리, 또는 그 반대의 경우도 마찬가지입니다. 그리고 지금 다음 다시 수행하고있는 경우 내가 전성 검사로 인쇄하는 경우, 여전히 두이지만, B는 이제 하나입니다. 솔직히, 아직있다. 나는 무엇 온도 상관 없어. 그러나 바로 지금 입력 할 때,의 말을하자 지금은 말에있어, 돌아가 계속 프로그램을 실행합니다. 그리고 불행하게도, X는 여전히 하나의 Y는 여전히이있다. 그래서이 GDB의 유틸리티는 무엇 이었습니까? 그것은 나를 해결 도움이되지 않았다 문제 라기보다는, 하지만 잘하면 도와 실현함으로써 이해 그 그래, 내 논리는 권리이지만, 내 코드는 궁극적으로 필요하지 않습니다 영구적 인 영향. 그래서 우리가있어 문제입니다 이제 오늘 해결하는 것. 그러나 이제이의 방법으로 거기에 도착 할 수 있습니다. 문자열은 거짓말이다. 그것은 역시없는 데이터 형식 그 그건 C.에 존재 일부의 동의어이었다 뭔가 다른 시간, 우리는 다음과 같은 것을 공개 할 수 있습니다. 내가 가서 열어 보자 프로그램은 비교 - 영했다. 그리고이 일을 입력하기보다는, 우리는 코드를 도보로 시작합니다 이미 쓴, 그러나 그것은 단지 몇 라인이다. 그래서 이것은 비교 - 영됩니다. 그리고 제일 먼저 내가하고 있어요 한 줄의 텍스트를 받고있다. 하지만 난 무엇을 알 처음 하. 무슨 일이 명확 라인 (21)에 대한 다른가요? 사실, 분을 기다립니다. 이 사본이 있습니다. 그것도 오른쪽 프로그램이 아닙니다. 좋아, 스포일러 경고. 좋아, 그래서 신경 쓰지 않았다. 어쩌면 미래의 질문에 대한 대답입니다. 여기에-0을 비교하고 난입니다 한 줄의 텍스트를 얻을에 대한 정보가 포함되어 있습니다. 프로그램의 훨씬 간단. 그래서이 간단합니다. 이것은 첫째 주, 둘째 주 물건처럼 순간. 문자열의 = getString에. 자, 여기로 다시 말한다. 문자열 t = getString에. 이에 그리고, 마지막으로 프로그램, 그 이름이 시사하는 바와 같이, 나는 그들을 비교하려고거야된다. 그래서의 경우, 첫 번째 문자열, =의 t, 다음 난에 해당 당신이 같은 일을 입력 말을하려고. 그렇지, 내가 말할거야 당신은 다른 일을 입력합니다. 그래서 컴파일하고이 프로그램을 실행 할 수 있습니다. 그래서 영을 비교합니다. 좋아 보인다. 컴파일 오류가 없습니다. 나 지금 앞서 가자 및 ./compare-0을 입력합니다. 내가 가서 뭔가를 가정 해 봅시다 : Daven 뭔가 : 롭. 그리고 나는 다른 일을 입력합니다. 지금까지 너무 좋아. 프로그램은 올바른 것 같다. 그러나 다시 한 번 실행 할 수 있습니다. 뭔가 말 : 게이브. 뭔가 말 : 게이브. 좋아. 어쩌면 내가 스페이스 바를 충돌 또는 펑키 뭔가. 다시 한 번 해 보자. Zamyla 그래서. Zamyla. 다른 것들. 그래서 무슨 일입니까? 그래서 우리는이 두 라인을 가지고 코드에서 getString가 두 번 호출된다. 그리고, 단순히 해요 s 및 t를 비교하는 시도. 그러나 무슨 일 후 정말 무엇을? 좋고, 내 필기의 약 다소이 예제를 도살. 그리고 이제 실제로 던져 보자 이 최대 여기뿐만 아니라. 그래서 우리는 선처럼이 문자열의 = getString에. 그래서 단순히 첫번째입니다 해당 프로그램에서 흥미로운 라인. 그러나이 모든 시간이되었습니다 무엇을 후드 아래에 무슨 일? 음, 왼쪽에 사이드 캐릭터 라인은, 어떤 변수의 일부 유형은, 그것은의를 불렀다. 그래서 나는이 메모리를 사용하는 것을 알고, 또는 RAM, 어떻게 든 내 컴퓨터에서. 그래서 추상적에 갈거야 사각형으로 그립니다. 32 비트, 알고 보니하지만, 미래에 그에 대한 자세한. 그리고 무슨 일이 여기 일이야? 글쎄, 확실히있는 getString 사용자로부터 문자열을 가져옵니다. 그리고있는 getString이있어 Zamyla 또는 게이브 또는 Daven. 그럼 첫 번째를 선택할 수 있습니다 이 중 Daven이었다. 그래서 효과적으로 어떤 getString에가있어 내게는 첫 번째 경우에 D--V-E-N이었다. 그리고, 그 밖의 무엇을하는 한 그것은 나에게 비밀리에 제공? 청중 : [들리지] 데이비드 J. 마란 : 네, / 0 또는 널 문자. 그래서 효율적으로 나에게 문자열을했다. 그러나 우리는 이미 이전부터 알고 문자열은 단지 배열되어 보이는 문자, 이는 종료있어 이 특별한 감시 문자 / 0. 그러나 이것은 해당하는 경우 이 사각형이고, 이 분명히 훨씬 더 큰 사각형이다. 그리고 실제로이입니다, 나는, 32 비트를 주장한다. 그리고 이것은 분명 이상 32 비트, 이것이 아마도 때문 팔에 8을 더한 8을 더한 8을 더한 플러스 팔, 단지 ASCII 바이트 때문이다. 어떻게 도대체 우리가 맞게 가고있다 여기이 작은 상자에 Daven? 글쎄, 무엇을 실제로 getString는거야? 음,이 그리드는 여기를 나타냅니다 내 컴퓨터의 메모리 또는 RAM. 그럼 임의의 경우 가정 해 봅시다 이들 각각은 바이트를 나타낸다 우리는 각 생각할 수 바이트 어드레스를 갖는 것으로, 33 옥스포드 스트리트 (Oxford Street), 또는 34 등 옥스포드 스트리트 (Oxford Street), 또는 35 옥스포드 스트리트 (Oxford Street). 그래서 가정은 주소가있는 것처럼 건물은 주소를 가지고, 그래서 개별 바이트를 할 메모리 주소 나 번호가 그 고유를 식별합니다. 자,이 임의이다. 하지만 난 갈거야, 간단하게하기 단지 규칙에 따라 16 진수 사용 하지만 0X 다른 아무 의미 보다 "이 16 진수입니다." 나는 주장거야 "D"는 메모리에 바이트 하나에 끝납니다. 난 아무것도 다른에 어떤 일이 일어나고 없어 메모리, 그래서 Daven 첫 번째 자리를 얻었다 바이트 하나에서. 이 후, 0x2로 될 것입니다. 이 0x3으로 가고있다. 이 0x4로 될 것입니다. 이것은에서 0x5로 이동합니다. 이것은이 0x6가 될 것입니다. 하지만 한 번 생각하기 시작 어떤 컴퓨터의 것에 대해 후드 아래, 당신은 추론을 시작할 수 있습니다 방법을, 몇 년 전 것 자체 C 구현했습니다. 아마있는 getString는 무엇인가 returning-- 그것 때문에 그렇지 않은 것 같은 느낌이 든다 반환 Daven, 그 자체, 그는 확실히 않을거야 때문에 이 작은 상자 .--에 맞게 그래서 무슨 일이있는 getString 아마 반환? 청중 : [들리지] 데이비드 J. 마란 : Daven의 위치입니다. 그리고이 일을하고 있어요 지금까지 주 하나입니다. 무엇 getString는 정말 반환하는 문자열 그 자체가 아닙니다. 즉, 작은 흰색 거짓말 중 하나입니다. 그것은의 주소를 반환하는 것 메모리에 문자열, 고유 주소입니다. Daven는 33 옥스포드 스트리트 (Oxford Street)에서 살고있다. 하지만 더 간결하게, 개빈 살고 이 0x1에서 번호를 하나의 주소. 그래서은이에 넣어 도착 작은 상자는, 명확하게 해당 문자열의 단지 주소입니다. 그래서이 모든 시간이 이는 계속되고. 하지만이 암시 무엇 지금은 모두가 s의 경우가 있다는 것입니다 그 안에 수있어입니다 당신을 막을 수, 프로그래머, 의 임의의 숫자를 넣어에서 어떤 변수 바로 점프 메모리의 청크? 그리고 실제로, 우리는 볼 수 있습니다 그 위협이 다음 시간이다. 하지만 지금은이 충분하지 느낀다. 내가 말할 경우에, 저를 얻을 문자열, 당신은 나에게 Daven을 제공합니다. 하지만 당신은 정말 나에게 Daven를 제공하지 않습니다. 당신이 나에게주는 모든 Daven의 주소입니다. 그때 나는 확실히 알고하는 방법 여기서 Daven이 시작되고 ends-- 이야기의이 weird-- 점점 Daven의 시작과 끝나는, 그리고, 다음 다음 메모리에 문자열이 시작? 글쎄, 당신은 나눠하는 경우 나 Daven의 시작, 기본적으로, 내가 어떻게 알 수 있습니까 자신의 이름의 끝은 어디? 특별한 널 문자, 어떤 더욱 중요한 지금이다 아래 문자열 경우 후드는 단순히 식별 고유 메모리에서의 위치에 의해. 그래서 모든 시간은, 그건 무슨 일이 진행되고 있어요. 그래서 우리는 지금에서 볼 때 여기에 코드는 설명 당신은 라인 (26)의 버그하고자하는 경우. 왜 Zamyla 및 Zamyla 다른가? 왜 게이브와 게이브 다른가? 그래, 다시. 청중 : 그들은 서로 다른 주소를 가지고있다. 데이비드 J. 마란 : 간단하기 때문에 서로 다른 주소를 가지고있다. 당신이있는 getString를 호출 할 때 때문에 다시 여기 빨리 할 거하는 이 두번째 라인, 문자열인지 t, 나는 그 프로그램에서했던 것처럼, getString에 또 다른 전화와 동일합니다. 내가 전화를 다음 번에 getString에, 내가 갈거야 메모리의 다른 덩어리를 얻을 수 있습니다. getString는 허용됩니다 운영을 물어 더 많은 메모리 시스템. 이 같은 재사용 않을거야 여섯 바이트 매번. 그것은 새를 얻을 것 메모리의 덩어리, 어떤 t 얻을 것입니다 의미 여기에 다른 값입니다. 내가 그래서들 = 같음 t, 당신은 비교하지 않을 이것에 대한 D 이이에 대한 V. 이 비교하고 , 어떤이에 대한 솔직히 꽤 useful-- useless--입니다 꽤 쓸모가 정말 사람 때문에 문자열이 메모리에있는 경우 상관이야? 그리고 실제로, 우리는하지 않았습니다. 그리고 우리는 안 갈거야 특히 돌보는 시작합니다. 전용 버그가 발생할 수있을 정도로 보안 위협은 의지를 발생할 수 우리는 실제로이 걱정하기 시작한다. 그럼이 문제를 해결 할 수 있습니다. 당신이 매우 간단하게 수정 밝혀졌습니다. 그리고 전에, 실제로하자 다시 공개, 어떤 것 CS50 클래스의 경우는, 할 당신은 구현했다 두 개의 문자열에 대한 비교. 당신은 명확 단지의이 =의 t와 동일 사용할 수 없습니다. 그러나 단지 논리적으로 어떻게 이 문자열을 비교할 것 C 코드를 사용하여 문자열에 대해? 그래. 청중 : 그냥 할 루프 [INAUDIBLE] 데이비드 J. 마란 : 완벽 한. 청중 : [들리지] 데이비드 J. 마란 : 그래. 그냥 루프 또는 위해를 사용 루프 또는 어떤있다. 그러나 단지 기본 개념을 적용 할 경우 그 이 메모리 나 배열의 덩어리입니다 이며 이것은 반복 모두 동시에. 그리고 바로 문자를 비교합니다. 그리고 당신은 수있어 약간의주의, 당신 때문에 한 손가락을 원하지 않는 다른 과거 이동 한 문자열이 때문에 다른 것보다 더 많은 시간이 든다. 그래서 당신이 확인하고 싶은거야 끝이 특별한 값, 널 (null). 그러나 그것은 정말로에서, 말과 간단. 그리고 솔직히 말해서, 우리는 필요가 없습니다 그 바퀴를 재발견합니다. 다음 버전 두 가지이다. 그리고 내가 여기서 말을하려고하고있어 것입니다 대신에 S를 비교는, t = 용 같음 문자열 경우 내가 대신 말할거야 의 쉼표 t의 비교 = 0 같습니다. 이제 문자열은 무엇을 비교한다? 그것은 함수의 밝혀 그 그 목적은 인생에서 C와 함께 제공 두 문자열을 비교하는 것입니다. 우리가 읽을 경우에, 비교 파문의 매뉴얼 페이지 또는 문서 또는 CS50 참조, 그것은 것 단순히 당신이 파문을 알려 부정적이든 수익을 비교 번호 또는 양수 또는 제로 제로 의미 그들은 어디를 동일. 그러니 그냥 추측. 그것은 무엇을하면 의미 할 수 있습니다 비교 수익을 저어 음의 값 또는 양의 값? 청중 : 크거나보다. 데이비드 J. 마란 : 네, 보다 크거나보다 적은. 그래서 당신은 전체를 정렬하고 싶다면 dictionary-- 문자열의 무리 우리는 결국 road-- 다운 것 같은 완벽한 기능은 잠재적으로 사용하는, 그것은 그렇게 것 때문에 당신을 위해 문자열의 비교, 그리고 이야기 당신이 나 앞에 오는 수행 또는 수행 B 알파벳 전에 온다. 우리는 정확하게 작업을 수행 할 수 있습니다. 그리고 다른 하나는 한주의 사항 이 예에서는 일. 다른 무엇보다 높은 변경 이 주요 기능 최대? 숯불 *. 그리고 이것은 다른 선의의 거짓말이다. 이 모든 시간 때했습니다 문자열을 쓰고, 우리는 비밀리에 재 작성되었습니다 문자로 문자열 * 그래서 실제로 연타 당신을 이해한다. 즉, CS50.h에서 우리는 결국 보 겠지만, 우리는 동의어라는 문자열을 만든 그 문자 *와 같은 일입니다. 그리고 지금은 만 알고 *,이 문맥에서, 적어도, 주소를 의미합니다. 무엇의 주소? 음, 사실은 내가 말했다 char *로, 그리고, * int 형 또는 * 뜨지 char *로가 있음을 의미 문자의 주소입니다. 그래서 여기이 작은 상자, 일명 문자열, 정말 형 char *로이다, 어떤 말을 단순히 멋진 방법입니다, 이 상자에 주소를 이동합니다. 그리고 무엇을 그 주소를 참조합니까? 분명히, 문자. 그러나 우리는 절대적으로 수 INT * 및 다른 일을해야합니다. 하지만 지금은 char *로 정말 가장입니다 간단하고 관심 중 하나. 그래서이 문제는 것입니다 다시,하지만 상승. 나는이 프로그램을 열어 가정하자. 지금 우리가 예측할 수 있는지 보자 무슨 일이이 코드를 잘못. 이 프로그램에 그래서, 복사 공을, 난 가서 다시 전화를 거 getString에 및 S의 값을 저장한다. 그리고, 내가 왜이 일을하고 있어요 단지 주 과거에서 알림으로? 우리는 getString는 말을했다 가끔 null를 돌려줍니다. 그것은 무엇을 의미 하는가하는 경우 getString는 null을 반환? 문제가 발생했습니다. 아마 문자열이 너무 의미 큰 메모리를 컴퓨터의 아웃. 그것은 슈퍼, 슈퍼, 슈퍼를 발생 드물게 있지만 일어나지 않을 수있다. 우리는 그것을 확인하려면, 그리고 이건 우리가하고있는 전부입니다. 그렇게하지 ​​않으면 우리는 지금 볼 수 있기 때문에 물건을 습관적으로 검사 시작 널 (null)처럼, 당신은 수도 실제로 이동 시작 메모리에 주소를 잘못이 있습니다. 그리고 당신은 유도를 시작하려는 것 더 세분화 결함. 또는 Mac 또는 PC에서 바로 컴퓨터를 일으키는 것은 매달려 또는 프로그램은 잠재적으로 동결. 그래서 지금은, 복사 0.C에서 주장 나는 그 그런데 이러한 문자열을 복사 예정 의 28 라인. 그리고, 내가 갈거야 하단 항 여기에 내가 갈거야 것을 이 중 하나를 변경합니다. 그래서이 문제를 확인할 수 있습니다. 나는 우리의 오랜 친구의 strlen 함수를 호출하고 있습니다. 그리고 그냥 영어로 설명 이 라인 (34)은 무엇을하고 있습니까? 무엇 t 브래킷 공을 수행 왼쪽에 나타냅니다. 그래. 청중 : t의 첫 번째 문자? 데이비드 J. 마란 : t의 첫 번째 문자. 그게 다야. t의 첫 번째 문자, 내가 원하는 대문자 버전을 할당 t의 첫 번째 문자의. 그래서이 활용된다 첫 번째 문자. 그리고, 매우 마지막으로 내가 할 이 프로그램은 내가 여기 있어요 주장 원래는, S 및 여기에 복사, t입니다. 그러나 이야기를 기반으로 우리 단지 문자열이 정말로 무엇인지에 대해 이야기 정말 선 (28) 무엇인가 일을하고, 무엇을 가는 결과 버그 화면에 있어야 하는가? 그래서 첫째, 첫 번째 질문, 28. 문자열 t의 = s의 정말 뭐하는거야? 우리는 왼쪽에있는 경우 여기에 측면 문자열 t의 = s의; 그것은 나에게 한 상자를 제공합니다 여기 하나의 상자 여기. 그리고,이 주소가 0X 가정하자 의 임의로,이 시간을 말 50 보자. 어떤 문자열 t의 = s의 수행 후드 아래에 무엇입니까? 청중 : [들리지] 데이비드 J. 마란 : 그것은 메모리를 저장 이 주소, 그래서 × 50가 간다. 지금 그래서 만약, 내가 처음으로 이동 t에서 문자를 대문자로, 나는 효과적으로 s로 무엇을하고 있는가? 제가 정말, 같은 일을하고있는 거죠? 때문에 경우 주소 0x50-- 단지, I 여기 보드에 많은 공간을 필요가 없습니다, 하지만,이 여기까지 × 50 있다고 가정 내 컴퓨터의 메모리 어딘가에. 그리고, 예를 들어, 게이브있다 이런 식으로, 여기 소문자입니다. 그리고 나는 말했다 t 브래킷 0 대문자됩니다. 음, t 브래킷 공입니다 t의 첫 번째 편지입니다. 그래서 약간의 g는에 가고 가 큰 G. 그러나 문제 무엇도를 가리 s는 않습니다입니까? 대상 : 동일합니다. 데이비드 J. 마란 : 똑같은 일이. 그래서 아마도 간단한 설명, 구문은 조금 이상한 경우에도 마찬가지입니다. 그래서이 작업을 수행 할 수 있습니다. ./copy-0을 누른 다음 복사 - 공을 확인하고. 뭔가 말 : 게이브. 그리고 불행하게도, 모두 그들 지금 자본화 한 하지만 대한 기본 우리가 단순히있어 이유 이제 주소를 처리. 그래서 우리가 어떻게에 시작 할까 주소인데 웃기 intended-- 우리는 해결하기 위해 시작 어떻게 이 특정 문제? 음, copy1.c에 가지려고하고있다 조금 더 복잡합니다. 하지만 주장 것 개념적으로 간단한 솔루션을 제공한다. 첫 눈에 얻을 그래서 하드. 첫번째 쉽지 않을 시간은 당신은 아마 그것을 입력 하지만 문제는 경우 단순히 t의 = s의 단지 일을 복사 주소, 무엇을, 내가 다시 당신을 선택할 수 있다면, 해결책이 될 것입니다 실제로 문자열을 복사하는? 청중 : 우리는 아마거야 다시 루프를 사용한다. 데이비드 J. 마란 : 그래. 그래서 우리는 다시 루프를 필요로하기 위하여려고하고있다. 그리고 우리는 복사 할 경우 때문에 다른 문자열로 문자열의, 우리는 아마 그것을 할 문자 단위. 그러나 문제는 경우입니다 이것은 원래의 것입니다 지금 우리는 명시 적으로 시작해야 t에 대해 메모리를 할당. 즉,하자 이 마지막으로 한 번 다시 그리기. 이 문자열의 = getString는 경우. 그리고의뿐만 아니라, 여기를 넣어 보자. 이있는 getString입니다. 무언가 그리고, 포토 그런 식으로 이전 될 것입니다, g-A-B-전자 / 0. 즉,이 같은 작은 선물을 보인다. s는 따라서,이 0x50이 호출 그것은 51, 52이 될 것. 그래서 이것은 × 50이다. 그리고, 나는 문자열 t을한다. 메모리에서, 그것은 단지에 무슨 나에게 이런 작은 광장을 제공합니다. 그래서 중요한 단계는 이제 무엇인가? 나는 t로의 복사 할 경우, 어떤 빈 우리가 여기에 기입해야합니까? 아니면 우리에 필요한 것은 무엇 높은 수준에서합니까? 그래? 누군가? 그래. 청중 : 우리는 [INAUDIBLE]으로해야합니다. 데이비드 J. 마란 : 그래, 우리 이 빈을 작성해야합니다. 그때 복사 할 수 없습니다 게이브의 이름을 대문자 I는 운영 체제를 요청할 때까지 메모리의 또 다른 청크 즉, 원본과 적어도 크다. 그래서 질문을 우리에게 남긴다. 내가 운영 체제를 부탁 한 어떻게 단순한 작은 pointer--에 대한 이 호출 될 때, 주소, pointer--하지 간단한 작은 상자 이 같은 캐릭터라고? 어떻게 운영을 물어요 메모리의 큰 청크에 대한 시스템? 지금까지, 나는 단지 그 다시 쪘 간접적있는 getString을 호출하여. 어떻게 getString에있다 메모리를 얻기도? 음, 거기에 밝혀 여기 다른 기능 것을 우리가 지금 사용하는 시작합니다. 이제,이 방법이 더 애매한 than-- 보인다 나는이게 뭐지 볼 수있는 유일한 일입니다 이 라인은 방법이 더 애매한 보인다 그것은 언뜻해야한다. 그러나 현실을 떨어져 애타게 할 수 있습니다. 왼쪽에, 나는 char *로 t 있습니다. 영어의 자, 공식화 시작하자 기술적 인 전문 용어의 적절한 문장. 그래서이 할당 된 char 형의 변수는 t라고 *. 이제, 정말 무엇을 의미 하는가? 글쎄, 그 의미, 내가 무엇을 갈거야 t이라는 변수에 넣어? 문자의 주소입니다. 그래서, 그냥 간단 보다 합리적인 방법 의 좌측을 설명. 그래서 여기 만이 상자를 만듭니다. 그래서 오른쪽, 아마도 것입니다 더 큰 것을 할당 할 메모리의 방법 덩어리? 그래서이 떨어져 애타게 할 수 있습니다. 그것은 첫눈에 압도 하지만 내부 여기 무슨 일이야? 첫째, malloc에​​, 거기에있는 우리의 새로운 친구가 분명히있다 "메모리를 할당 할 수 있습니다." 그래서이 전달되는 인수입니다 그것으로, 그래서 꽤 큰 논쟁. 그래서이 떨어져 애타게 할 수 있습니다. 의의 나 strlen 물론, 대표 찌를 청중 : 문자의 수입니다. 데이비드 J. 마란 : 그냥 의 문자의 수입니다. 그래서 S의 길이, 원래의 문자열입니다. 그래서 G-A-B-E. 그래서 아마 네이 경우입니다. 이유는 후에 1 일을하고 있어요 의의 strlen 함수를 호출? 청중 : [들리지] 데이비드 J. 마란 : 그 내용은 특별한 널 문자. 당신이 저를 요구하는 경우에의 길이 무엇 게이브의 이름은, 내가 네 말을 하겠어. 후드 아래에,하지만, 내가 필요 널 문자에 대한 그 다섯 번째 바이트. 내가 일을하고 있어요 그래서 그입니다. 지금 만 경우에 당신이 실행하는 이외의 컴퓨터 프로그램은, 말 CS50 장비, 여기서 문자의 크기 다를 수 있습니다 내 자신의 computer--에서 나는이를 호출 할 수 있습니다 밝혀 운영자를 sizeof, 그냥 컴퓨터를 요청 의 크기 무엇인가 이 컴퓨터에서 숯불? 그리고이 다섯을 곱하여 문자의 크기에 의해 그 예 대부분의 컴퓨터에서 것이다 단지 하나의 malloc 수 날이 큰에 할당 할 것입니다 여기 오른쪽에 이상 메모리의 덩어리. 그리고 그것은 return-- 것 그것은 그래서 그것은 function--입니다 무엇을 나에게 돌아가는거야? 청중 : 주소? 데이비드 J. 마란 : 무엇의 주소? 청중 : 메모리가 할당? 데이비드 J. 마란 :의 메모리가 할당. 그래서 나는 솔직히 아무 생각이 곳은 끝날 것입니다. 나는 그 제안거야 그것은 0x88의에서 끝낼거야. 완전 임의하지만, × 50가 아닌 다른 곳, 운영체제 때문에, 무엇 Windows 및 Mac OS는 나를 위해,이다 이주고 있는지 확인 나 RAM의 다른 덩어리. 그래서이 값이입니다 메모리의 청크 끝낼 수 있습니다. 그래서이 함께 0x88, 여기에서 끝나는 것입니다. 그래서 지금 명확하게 이해 할 수 있습니다 본와 동일하지 않은 것을 그들이 가리키는 것 때문에 메모리의 다른 덩어리. 지금 실제로 복사 할 경우에 따라서 에서의이 제안 된 솔루션을 할 수 있습니다. , 그냥 가서 루프를 만들어 보자 와 t 브래킷을 난의 브래킷 난을 가져옵니다. 지금은 사용할 수 있기 때문에 이 배열과 같은 표기법 때문에 비록 malloc에​​ 매우 일반적으로 나에게 메모리를 할당 메모리는 연속적인 바이트입니다. 바이트, 바이트, 바이트, 다시 다시 다시하는. 나는 프로그래머로 확실하게 할 수 배열로 취급하는 나는이 마지막으로 친숙한를 사용할 수 있다는 것을 의미 그냥 대괄호 표기법. 그래서 나 때문에이 일시 정지 할 수 이것도, 한꺼번에 많은이며 기본 개념은 다시 정리해 보면 비록 문자열이며, 모든 시간, 새로운 데이터 유형 자체 아니다. 그것은 바로 소위 포인터이다 캐릭터의 주소, 이는 단지 의미는 숫자입니다 인간의 규칙에 따라 우리는 0X 무언가로 작성하는 경향이있다. 하지만, 숫자에 불과하다 33 옥스포드 스트리트 (Oxford Street)와 같은, 이는이 될 일이 CS 건물의 주소. 이러한 세부 사항에 대한 질문? 그래? 관객 : 왜 우리가 확인 할 동일 t에 null로? 데이비드 J. 마란 : 왜 우리를 이렇게 null로 동일한 t를 확인? 우리는 documentation--를 읽는다면 malloc에​​ 대한 좋은 question--, 그것은 작은 글씨로 말 것 때로는 malloc에​​ null의 반환 할 수 있습니다 다만, getString에있다. 그리고 실제로, getString에 null을 반환 차례로, malloc에​​ null을 반환하는 경우, getString에 malloc을 사용하기 때문이다. OS한다면 즉, 일어날 수 맥 OS, 윈도우, 무엇이든, 단순히 당신을위한 메모리가 부족합니다. 그래서 거기에 무슨 일이 있었는지. 그리고 내가 한 가지를 공개하자 그것은 단지 당신의 마음을 날려 버릴 수 있습니다 또는 완전히 너무 멀리 회선을 통해합니다. 그러나 저를 뽑아 보자 복사 루프 같은, 어느 순간 전, 리콜했다 이. t 브래킷 난의 브래킷 난을 가져옵니다. 니스와 사용자 친화적 인. 다시 둘째 주 같은 느낌. 그러나이 버전은 실제로이 될 수 있습니다 애매한 보이는이로 재 작성. 그것은 기술이라고 포인터이다 산술 어드레스 산술. 그런데 왜이 일을 하는가? 이제 귀찮게, C의 저자는 사용하기로 결정 다른 목적을 위해 * 기호. 우리는 이미 한 번 사용 봤어요 의미 문자 *는 "나에게 변수를 제공 즉 포함 것 문자의 주소입니다. " 그런 맥락에서 그래서 문자 * "나에게 변수를 제공합니다."를 의미한다 불행하게도, 당신은 *하지 않고 사용하는 경우 그것의 앞에 단어, 문자 등, 그것이 지금이라고 참조 연산자. 그리고 우리는 오래 전에이 더 많이 볼 수 있습니다. 그러나 그것은 단지 "로 이동"을 의미합니다. 누군가가 나에게 건네 경우는 말처럼 종이에 "33 옥스포드 스트리트 (Oxford Street)," 나는 "* 33 옥스포드 스트리트 (Oxford Street)"를 할 경우 그 의미 "CS 건물에 길을 간다." 그래서 * 그냥 경우 이동 수단 그것의 앞에 어떤 단어가 없습니다. 그래서 명확하게, t 무엇인가? t는 청크의 주소입니다 다시 내게 주어진 메모리. 의는 분명 무엇의 주소입니다 이 예에서 우리가 논의했습니다, 소문자 게이브의? 의 주소입니다 해주길 청중 : 문자열입니다. 데이비드 J. 마란 : 게이브의 원래 이름의. 그래서의 주소입니다 이 메모리 덩어리. 그래서 만약 내가 t + 난 - 예고, 우리의 오래된 친구입니다. 그냥 인덱스 변수 그 최대에 0에서 반복이야 스트링 (S)의 길이. 그래서, 다음, 0, 1이 될 것 다음이, 다음 세, 다음 네. 그럼이 새로운 조립하자 스크래치와 같은 퍼즐 조각, 만약에 당신, 비록 다시 구문 스크래치보다 훨씬 더 비전이다. 그래서 t는 어드레스 +이다 내가 나에게 줄 수 있겠나 수 있기 때문에 이들 모두 우리는 16 진수로 드로잉했습니다 번호. 그러나 그들은 단지 숫자 야. t의 주소는 우리가 말한다면 했다 0x88의는 0x88의 플러스 제로거야. 당신은 편안 아니더라도 아직 진수와 추측을. 청중 : 원래. 데이비드 J. 마란 : 0x88의 정지. 그래서 * 무엇을 의미하는 0x88의입니까? 그것은 의미 "거기에 갈"의미 효과적으로, "여기에 손가락을 넣어." 그리고 지금의 우측 이 식, * 다음 괄호에, 의 i는을 인의 의미 + 여기에 작은 g의 최대 해결합니다. S + 0은 물론이다 어떤 S, S. 그래서 지금, 그것은 *들, 야하는 단지 * 33 등 옥스포드 스트리트 (Oxford Street) 주소로 이동을 의미 의. 그래서 여기에이 손가락, 오른손입니다. 그래서 나는 무엇에 복사하지? 입니다 오른쪽에있는 것은, 게이브, 여기에 여기에 약간 g. 그리고 그 영향 루프의 첫 번째 반복, 당신은 외모에도 불구하고, 제안 된 무엇보다 미친 더 복잡 우리는 전에 본 적이 간단하게 말하고있다 여기와 여기에 문자를 복사합니다. 그것은 당신에게 두 위치에지도를주고있다. 그리고 우리는이 훨씬 더 많은 것을 볼 수 있습니다. 하지만 지금은, 희망은이다 이러한 기본 개념 중 일부를 소개합니다. 그리고 실제로, 이제 살펴 보자 여기에 최종 프로그램을, 다음 약속 클레이 메이션, 있는 모든 것이 바로 할 것입니다. 좋아. 그래서 나는 거기에 우리가 갈 망정 열 수 있습니다. 우리가 다시 올 거는데 ... 그래서 보자 오래 전에이 사진에. 내가 여기이 마지막 예제를 열겠습니다. 그래서 여기에 슈퍼, 슈퍼입니다 수행 프로그램 다음과 같은 작업을 수행합니다 인생에서 아무것도 없습니다. 그것은 첫째 두 개의 변수, 배, 선언 이 시간이 상이 할 수 있습니다 Y,, 그 자체. 그들은 그 자체 정수 아니에요. 그들은 * 분명히 아르 int 형. 그러니 사람이, 무슨 뜻인가 데이터를 입력하면, 사용자 변수 int 형 * 별이다? 즉, int 형의 주소입니다. 그래서 난 아직 아무 생각도 없어. 그것은 단지 "결국 넣어 의미 여기 INT의 주소. " 이 글은 어디서든 × 50, 0x88의, 메모리는 주소가 진행되어 가고있는 것입니다. 그리고 그 Y는 무엇입니까 뿐만 아니라, 될 것이다. 내가 지금 말을하면 X = malloc을 (를 sizeof (int)를), 이 말의 멋진 방법입니다, 헤이 운영체제의 malloc 비아 크기 나에게 충분한 메모리를 제공 아마 중간,의 32 비트 또는 4 바이트가 될 것. 그래서 malloc에​​ 무엇을 반환합니까? MALLOC는 주소를 반환합니다. 그렇다면 X에 저장을 당할 것이다? 청크의 주소 메모리, 4 바이트, 즉의 malloc 그냥 물어 나를 위해 발견 운영체제. 이제 한편, 선 여기 네, * X = 42. 다만, 명확하게 거기 무슨 일이야? 왼쪽에, X *. 그 * 33 옥스포드 스트리트 (Oxford Street)처럼. 그래서 * X는 무엇을 의미? 청중 :로 이동합니다. 데이비드 J. 마란 : 그 주소로 이동합니다. 어디든지의 덩어리 메모리가로 이동합니다. 그리고 분명, 어떤이 넣어? 대상 : 42. 데이비드 J. 마란 : 42. 좋아, * y를, 같은 생각. Y의 주소로 이동합니다. 이 숫자 13을 넣어, 하지만 순간에 Y는 무엇인가? 청중 : 더 메모리가 Y에 대한이 없습니다. 데이비드 J. 마란 :이 Y에 대한 메모리가 없습니다. 그래서 아마 Y 작업을 수행 우리가 말을했습니다으로 포함? 청중 : 쓰레기. 데이비드 J. 마란 : 일부 쓰레기 값입니다. 이제 쓰레기 값은 여전히​​ 숫자입니다. 아직 주소로 오인 될 수 있습니다. 그것은 사람처럼입니다 아래로 뭔가를 휘 갈겨 나는 의미로 잘못 해석 거리에 따라 일부 건물. 그리고 당신은 단지로 이동하려고하면 당신이 소유하지 않는 일부 건물, 또는 일부 메모리 덩어리를하지 않았습니다 주어, 나쁜 일이 일어날 수 있습니다. 컴퓨터는 다른 충돌, 또는 수 예측할 수없는 문제가 발생할 수 있습니다. 그래서, 다음, 빙키이 소개됩니다. 나는 아직도 20 기억 일부 홀수 년 후, 나는 때 결국 어디에 포인터를 이해했다. 당신이 경우, 말을하는 것입니다 어떤 삼분 여기에 남겨 내가 모른다고 생각 포인터를 이해, 실현 나는 20 기억했다 어떤 미친 이유 년 언제, 왜 결국 침몰 에, 나의 가르침에 앉아 동료, Nishat 메타에서 엘리엇 식당 홀 뒷면. 지금, 나는 기억했습니다 이이 이었기 때문에 주제 I,에서의 일 특히, 고투. 그리고 나서, 그것은 결국 눌려 같은 나는 많은 화제를 감히 결국 것이다. 그리고 지금, 그 모두를 느끼게합니다 행복하고 더욱 설득력, 의가에서 최종 살펴 보자 우리 여기 빙키에서 마지막 삼분, 우리의 친구 닉에서 스탠포드에서 Parlante. [동영상 재생] 안녕, 빙키. 일어나! 그것은 포인터 재미를위한 시간이다. 그게 뭐지? 포인터에 대해 알아? 아, 케이크! - 그럼, 시작하는, 우리가 추측 몇 포인터 필요할 것. - 좋아. 이 코드는, 두 개의 포인터를 할당 어떤 정수를 가리킬 수 있습니다. - 좋아. 글쎄, 난 두 개의 포인터를 참조하지만, 무엇을 가리키는 것 같습니다하지 않습니다. - 맞아요. 처음에, 포인터 아무것도 가리 키지 않습니다. 그들이이라고 가리 일 pointees과의 그들을 설정 별도의 단계. 오른쪽, 오른쪽, 오. 나는 그것을 알고 있었다. pointees는 별도입니다. 어, 그래서 당신은 어떻게 pointee를 할당합니까? - 좋아. 음,이 코드를 할당 새로운 정수 pointee, 이 부품 세트 x는 그것을 가리 키도록. - 이봐, 그건 잘 보인다. 그래서이 일을합니다. - 좋아. 나는 포인터의 X 역 참조거야 그 pointee에 숫자 42을 저장합니다. 이 트릭을 위해, 나는 필요 내 역 참조의 마술 지팡이. 역 참조 - 당신의 마술 지팡이? 거기 있었고 그 좋아요. -이 코드가 어떻게 생겼는지입니다. 난 그냥 수, [POP]를 설정합니다 - 이봐, 이봐. 저기 간다. x는 다음에 역 참조를하고 그럼 화살표는 pointee에 액세스 할 수 있습니다. 이 경우, 거기에 상점 42. 헤이 번호를 저장하는 데 사용하려고 다른 포인터 내지 13, Y. - 좋아. 난 그냥 y로 여기 가서, 및 수 13 셋업을 얻을. 그리고,의 완드 걸릴 역 참조 바로 [BUZZ] 오! 헤이, 오! 그것은 작동하지 않았다. 빙키, 나는 역 참조 생각하지 않는다, 말 당신이 알고 있기 때문에 Y는, 좋은 생각이다 pointee을 설정 별도의 단계입니다. 그리고 나는 우리가했다고 생각하지 않습니다. - 좋은 점. 그래. 우리는 포인터 y를 할당하지만, 우리 결코 pointee를 가리 키도록 설정합니다. - 아주 관찰력. 이봐, 당신은이 빙키 좋은 찾고 있습니다. 당신은 그래서 고칠 수 y를 점 X와 같은 pointee에? - 네. 내 마법 지팡이를 사용합니다 포인터 할당의. 이 되서 하죠 ~ 전에 같은 문제? - 아니. 이 pointees을 만지지 않습니다. 그것은 단지 하나의 포인터를 변경 또 같은 일을 가리 킵니다. - 오, 알았어요. X 같은 곳으로 지금 Y 점. 그래서 기다립니다. 이제 y는 고정되어있다. 그것은 pointee있다. 그래서 당신의 지팡이를 시도 할 수 있습니다 13 이상을 보내 다시 역 참조. OK, - 음. 여기 간다. [POP] 야, 저것 봐. 이제 Y에 작품을 역 참조. 그리고 포인터를 공유하고 있기 때문에 한 pointee 것을, 그들은 둘 다 13을 참조하십시오. 그래. 공유, 뭐든간에. 그래서 우리는 이제 장소를 전환 할 건가요? 오, 봐. 우리는 시간이 없어. 하지만 ... 셋 포인터 규칙을 기억하시오. 번호 하나, 기본 구조 당신이 포인터를 가지고있다, 그리고 그것은 pointee에 이상 가리 킵니다. 그러나 포인터 pointee은 별도 그리고 일반적인 오류 포인터를 설정하는 것, 하지만 그것을 pointee을 제공하는 것을 잊지합니다. 넘버 투, 포인터 역 참조 포인터에서 시작 이상의 화살표를 다음과 그 pointee에 액세스 할 수 있습니다. 우리 모두가 알다시피,이 가있는 경우에만 작동 pointee, 한 가지 번호를 하나의 규칙을 다시 가져옵니다. 수 세, 포인터 할당 한 포인터를 취 과를 가리 키도록 변경 또 다른 포인터와 동일 pointee. 할당 후 그래서, 이 포인터 같은 pointee를 가리 킵니다. 가끔은 그런는 공유라고. 그리고 정말, 이제 모든 설정이 끝났다. 안녕 지금. [END VIDEO 재생] 데이비드 J. 마란 : 그 CS50은 여기까지. 우리는 다음 주에 볼 수 있습니다.