[Powered by Google Translate] [주 4, 계속] [데이비드 J. Malan - 하버드 대학교 (Harvard University)] [이 CS50입니다. - CS50.TV] 이 CS50이며,이 주 (4)의 끝입니다. 좋은 소식과 나쁜 소식이 그럼. 월요일에 더 강의, 아무 문제 다음 주 설정하지 마십시오. [학생들은 환호] 당신이가는 곳처럼되지 않을 꺼예요. 그러나 우리는 다음주 수요일 대신이있어, 다음 금요일은 우리가 궤도에 머물 수 있도록 강의 한 금요일 강의 당도 마련되어 있습니다. 그러나 모든 것은 평소와 같이 촬영되기 때문에 걱정 없습니다. 그리고과 관련하여 우리가주의 끝으로 무슨 짓을할지 0 퀴즈 코스의 홈페이지 cs50.net 설명에 게시되어 있습니다 그 첫 번째 퀴즈 할 때 당신이 있어야 기대 어떤 종류의. 일반적으로 객관식 사실 - 거짓, 짧은 대답, 짧은 코딩 문제가 될 것입니다. 당신은 동등한를 구현하는 기대하지 않을거야 당신이 pset에서 볼 것이라고 문제,하는 당신은 컴퓨터가 와 디버거와 같은,하지만 작은 코딩 문제가 될 것입니다. 그리고 실제로, CS50는 퀴즈 어떤 의미를 거둘 수있는 가장 좋은 가이드는 같다 cs50.net로 이동되어, 퀴즈 링크로 이동 당신은 퀴즈의 가치가 지난 몇 년 동안 볼 수 있습니다. 그냥 교육 과정이 항상 몇 년 동안 같은되지 않았 음을 알고 있습니다. 때때로 우리는 가끔 뺍 추가 당신은 오래된 퀴즈 중 하나에 몇 가지 항목을 볼 수 있도록하는 경우 당신이 무슨 말 아무 생각이 없다는 것을, 우리가 그것을 커버 않았다고 중입니다 또는 우리가 그것을 커버하는 것이 었죠. 그러나의 리뷰 형태,이 일요일, 월요일하고 화요일 뿐만 아니라 일요일 밤에 - 물론 폭 넓은 검토 세션 - 코스의 홈페이지에 발표 할 시간과 장소 - 이 모든 과정의 교육 친구들과 함께 검토 할 기회를 가질 수 섹션과 전체 클래스로 모두 올해의 재료, 이들은뿐만 아니라 평소와 같이 촬영됩니다. 괜찮아요. 따라서 소동 패스에 하나 댓글 / 실패 드롭 / 추가 할 수 있습니다. 너 어제 밤에 내 노트를 볼 수 있습니다,이 단지 몇 가지 추가적인 안심입니다 당신은 특히 더 편안한 또는 어딘가 사이에 그 나라의 경우 그리고 당신은 당신의 머리에 조금 기분이 실제로 매우 정상적인 있다는 걸, 그리고 장소에 충분한 지원 구조가, 근무 시간 내 이메일 어제 밤에 당이 좀 더 개선에 대한 의도 된 중 하나 그리고 패스 같은 옵션이 /이 같은 클래스에 실패하는도 실현 정말 이런 코스의 가장자리를 벗을 수있는 메커니즘위한 것입니다, 그래서 당신이 저 10, 15, 20 시간 지출하고 다시하는 경우 단지 작동하려면 몇 가지 pset를 얻으려고하고 당신이 거기 방법의 90~95% 걸 알아 하지만 패스에 어떤 빌어 먹을 버그를 발견 / 정렬의 괜찮 모델을 실패 할 수 없습니다. 아이디어는 그 메커니즘과 그런 다음 다른 psets에 초점을 갈 수 있다는 것입니다 거나 자지 또는 당신이 중점을 것입니다 뭐든간에. 당신이 올 때까지 화요일이는 것을 - 기술적으로 5 일 월요일 하지만, 그래서이 오는 화요일 휴일 - 패스에서 전환 / 등급 또는 그 반대로 실패 할 수 있습니다. 그리고 당신은 절벽에 정말이야 그리고 모두 떨어 생각하는 경우, 강의 후에 날 잡아 나 나에게 메모를 드롭 해 주시기 바랍니다. 당신이 작별을 고하기 전에 우리는 적어도 채팅 싶네요. 괜찮아요. 그래서 우리는 마지막에서 훈련 바퀴를 복용 시작했다. 특히, 우리는 문자열에 초점을 맞추 었습니다. 문자열은 CS50 라이브러리에 선언 뭔가있다 구체적으로 cs50.h라는 이름의 파일에 우리는 이번 주하고 다음을 바라 시작된다. 그러나 문자열은 정말 뭔가가 단지 단순화 그 조금 더 arcanely 숯불 *로 설명입니다. 우리가 익숙 숯불. 단지 단일 문자입니다. 그러나 월요일로 * 무엇을 표시된? >> [학생] 포인터. 포인터. 그리고 포인터가 뭐죠? >> [학생] 주소를 입력합니다. 이 주소, 메모리에 위치 같아요. 주소 또는 위치 또는 메모리는 무엇입니까? 다시, 우리 모두는이 일 가능성이 가장 높은 공연이나 RAM 2GB의와 노트북을 가지고 그리고 그 말은 당신이 메모리의 가치를 억 또는 2 억 바이트를 의미합니다. 그리고 정말, 물리적으로 보이는 것과는 상관 없습니다 하지만 자신의 노트북 가지고 각 바이트의 모든 번호를 수 있다는 믿음에 걸릴 - 이 0 바이트이며,이 바이트 1이 2,000,000,000 바이트입니다 - 그 바로 컴퓨터가 그래. 하나의 문자를위한 공간을 할당 할 때, 예를 들어, 그것은 분명히 당신의 컴퓨터의 메모리 어딘가에 살아있다 그리고 아마, 12,345 바이트 번호에 있어요 그리고는 컴퓨터의 메모리에 여기 어딘가에 있습니다. 그리고 그 문자의 다음 주소는 12345입니다. 지금 저를 통해 지금까지 주 0에, 우리는 정말 딸이 걱정하지 우리가 일반적으로 기호를 사용하기 때문에 위치를 기억 일들에 저장 변수와 배열은 실제로 데이터를 얻을 수 있습니다. 그러나 월요일의 모든보다 오늘로, 당신은 지금 할거야 쓰기 프로그램과 모든 더 표현 기능 정말 그러나 만약 당신이 적합 볼 컴퓨터의 메모리를 조작하려면, 좋은 목적과 나쁜 모두, 버그는이 일을 배우는이 시점에서 매우 일반적인 결과 것. 그런데 정말 숯불 *로 의미합니까? 오늘 약속대로 우리가 빙키에 돌아 오면 - 우리로 앞서 가자. 의는 여기에 간단한 예에 가자. 저이 파일 compare.c 등을 저장하고, 난 그냥 여기에 몇 가지 템플릿 코드를도록 그래서 stdio.h를 포함, 나 또한 자신을 포함 해주지 cs50.h. 나는 거기에 확대됩니다. 나 주 주요 INT를 (무효) 쓰기 시작하고 지금은 이런 짓을하고 싶어 보자 : printf ( "나에게 문자열을한다 :") 그리고 난 문자열 s이 (가) GetString됩니다 사용 사용자의 문자열을 얻으려면 그럼 또 다른 하나는 사용자에게 물어거야. 그리고 난 그를 얻을 GetString을 통해 물어 보자 ( "나 다른 문자열을 줘"). 꽤 일반적인이라면 s와 s는 문자열에 대한 좋은 이름 뒤에 t이 오면 때문에 그것을 t에 전화 할게. 따라서 GetString, 그리고 지금 난 그냥 정신 확인하고 싶어하고 말거야 (들 == t)가 난 ( "! 당신을 \ n 같은 일을 입력") printf 사용자를 말 하겠어요 경우, 다른 나 같은 ( "당신 형식화 된 것을 다른! \ N") 뭔가를 인쇄 할거야 뭐든간에 그 문장이 될 것입니다. 그래서 그런 일. 그런 다음 평소처럼, 난 그냥 아무것도 나쁜 일하지 의미 0을 반환합니다 내가 가서이 프로그램을 컴파일하고 실행하는거야. 그러나 월요일에 우리는이 프로그램을 실행 실제로 HELLO HELLO가 아니며 작별 작별 아니라는 것을 말해 줬다. 우리가 본 문제는 이와 같은 좀 더했습니다. 내가, 내 소스가있는 디렉토리로 이동 여기에 줌, 그리고의 비교하려면 어떻게해야합니까 보자 구요. 괜찮 컴파일. 비교 나 실행할 수 있습니다. 나에게 문자열을한다 :여보세요. 나에게 또 다른 문자열을한다 :여보세요. 당신은 뭔가 다른 일을 입력! 음, 간단하게 50, 50 같은 해 봅시다. 당신은 뭔가 다른 일을 입력! 안녕하세요, 안녕하세요. 그럼 분명히 무슨 일이된다. 하지만 왜에 대한 설명 뭐죠? 분명히, 12 호선 완전히 역기능이다. 여기 근본적인 문제가 무엇입니까? 그래. >> [학생]은 주소를 비교있어. 네, 맞아요. 실제로 주소를 비교있어 있는 HELLO HELLO와가 저장되어 있습니다. 그것은 다시 다시 HELLO 문자를 비교 안 어떤 정말 무슨 일이 있었 때문에,이 시간 우리는 GetString을 사용하고 - 이 칠판은 또 다시 컴퓨터의 메모리입니다 그리고 시작하자 내가 변수 s를 선언 한 후 GetString 전화를 말한다. 내 기억이 어떻게 생겼는데? 하자 임의로 s이 (가)과 같은 말. 이 광장입니다. 그리고 거의 모든 시간이 나는 화면에 메모리의 조각을 그려 한 가 32 비트면 어플라이언스에 있기 때문에 실제로 이와 같은 사각형 그리기 했어요 포인터 주소는 32 비트입니다. 이 정수와 같은입니다. 그래서 컴퓨터 시스템에 따라 다를 수 있습니다. Mac 또는 PC가 64 비트라는 사실과 막연히 알고있는 분들, 그 사실은, 컴퓨터가 64 비트 포인터를 사용하는 것을 나타냅니다 64 비트 주소 및 나름의 매력 중은 컴퓨터입니다 작년보다 훨씬 더 많은 RAM을 가질 수 있습니다. 짧게 말하면, 과거에 컴퓨터는 32 비트를 사용할 때 주소를 표현하기 위해, 바이트의 가장 큰 숫자는 당신이 대표 수 그 상자 안에 만약 당신이 32 비트가 있다면 요? 2 32 4 억 있기 때문에, 오른쪽, 억​​ 4 그럼. 이 숫자는 과정에서 반복되었습니다. 만 32 비트를 가지고 있으므로 경우에 셀 수 가장 높은 번호는 약 4,000,000,000. 하지만 그게 몇 년 전까지 컴퓨터의 기본 제한했다 만 4,000,000,000만큼 높은 셀 수 있다면 때문에, 당신은 RAM의 8기가바이트 또는 RAM의도 5기가바이트을 구입하는 경우는 문제가되지 않습니다 그 높은 셀 수없는 때문에 쓸모가 없었습니다. 당신은 컴퓨터의 메모리의 처음 3 또는 4 기가 바이트에 액세스 할 수 있습니다. 지금은 저것이 문제의 덜, 당신은 맥북 프로와 Dells을 구입하실 수 있습니다 8 기가 바이트 RAM 혹은 그 이상 요즘으로. 나는이 프로그램에 아주 단순히 포인터를 할당한다면, 포인터, S라고 실제로 우리가이 레이어 뒤로 껍질을해야하기 때문에이 화면에 다음과 같이 보일 수 있습니다. , 제가​​ 말했듯이 문자열을 유지하지만, 월요일, 문자열은 정말 숯불 *입니다 일부 문자의 주소입니다. 그래서 우리가 지금 GetString을 사용하여 계속에도 불구의이 꺼져 훈련이 휠을 봅시다. 그래서 S 선언 한,이 메모리 덩어리, 32 비트입니다. 기본적으로 메모리에 여기에 무엇입니까? >> [안 들리게 학생 응답] 그게 뭐야? >> [학생] 쓰레기. >> 쓰레기. 그렇지. 당신은 프로그래머가 변수에 값을 넣어하지 않으면 누가이 몇인지 아는 사람? 때때로 당신은 운이하고 10 살인데, 이는, 좋은, 깨끗한 기본값 종류입니다 우리가 월요일 본으로하지만, 가끔이 완료 말도 안돼 어디에서 온 일부 정말 큰 양수 또는 음수? 그래. 이전 >> [학생] 기능. >> 그래. 종종 기억 때문에 앞으로 불려 갔어 기능 당신은 메모리에 함수를 호출로, 그들은 바닥에서 더 많은 공간을 차지 그리고 곧 함수의 반환 등, 그 메모리가 재사용됩니다 라는됩니다 다음 사람에 의해, 누구는 메모리의 동일한 슬라이스를 사용하고 있습니다. 그리고 당신은 거기서 왼쪽으로 쓰레기, 이전 값을 한 경우 우리는 정말 우리가 아무 것도 넣지 않은 경우 어떤 값을 갖는으로 s를 착각 할 수도 있습니다. 그럼이 시점에서 우리 RAM은 다음과 같습니다. 지금 7 호선의 오른쪽에 우리는 GetString를 호출하는 있는 우리는 주 지금 봤는데,하지만 정말하고 GetString입니까? CS50 직원이 작성한 GetString하는 것은 약간의 지능이다 거기에 사용자가 입력 키와 조회수가 입력 시작 즉시로 얼마나 많은 키 입력은 사용자 히트 한 GetString는 숫자 중에 얼마나 많은 문자 나에 대한 RAM을 할당 할 필요는 없어. 그리고 곳 RAM은에서 유래 누가 알 겠어? 당신의 컴퓨터의 2기가바이트 또는 메모리 년대에 어딘가에 있습니다. 그러나의 컴퓨터가 바로 여기 HELLO라는 단어를위한 공간을 발견했다고 가정하자. 제가 입력 한 단어는 H-E-L-L-O했습니다. 그리고 우리가 문자의 순서로 그려하는 경우, 우리는이처럼 그려 수 있습니다. 하지만 1 추가 일을해야합니다. 어떻게 C에서 문자열의 끝 부분에 속해? 우리는 \ 0로 쓰기 널 (null) 문자. 그것은 기술적으로 번호 0 만, 역 슬래쉬는 모든 명확하게 이 말 그대로 숫자 0, 정수 0입니다; 당신이 키보드에 입력 할 수있는 예를 들어, 견적 - 인용을 끝 맺다의 영에 대해 아닙니다. 그래서이 HELLO입니다. 그리고 우리는 월요일에 무슨 말을 못했다 GetString 같은 기능을 실제로 이러한 모든 주 반환입니까? 그런 일이 실제로 의미하지 않기 때문에 그것은 본질적으로 문자열을 반환 없어 문자열은 존재하지 않기 때문에. 그들은 CS50 라이브러리에서 제조의 일종이야. 더 기술적으로 어떻게 정말 문자열입니다? >> [학생] 그것은 첫 문자입니다. 그렇지. 하지만 사용자가 들어 입력 한 단순히 첫 문자의 주소입니다 그래서, 만약 바이트 수 (123)에서 다음 바이트 124 번에서 그걸 종료 HELLO 내 말을, 125 126, 등등, 최대의 0에서 방금 번호 제 바이트 경우, 어떤 정말 GetString가 반환 것은 문자 그대로 수 (123)입니다. 그래서 S에 넣어됩니다 것은 숫자 (123)가 아닌 문자 H 아닌 단어, HELLO입니다 단순히 나는 HELLO의 첫 글자를 찾을 수 있습니다 주소를. 그러나 충분히 같지 않습니다. 나는 문자열이 아닌 문자를 물었다. 그럼 어떻게 나 컴퓨터는여보세요 가지 H와 같이 알 수 있습니까? 우리가 계약의 종류는 무엇입니까? 그래. [학생] 한번 더 문자를 찾을 수 자체를 말하는 유지합니다. 정확히 >>. 당신은 문자열 다루고된다이 인간 컴퓨터 대회가 있어요 그렇지 않으면 지금 숯불 별로 알려진, 당신은 단순히 파악해야 삶의 모든 문자열의 끝 정말 그냥 루프와 그 위에 반복하는 것입니다 곳 잠시 루프, 어쨌든, 그래서 당신은 문자열의 끝을 찾을 때 이제 그에서 추측 할 수, 오, 전체 단어 HELLO했다. 이전 프로그래밍 경험을 가진 분들이 자바로 알 수도 당신은. 전화 길이와 다른 프로그래밍 언어에서 길이 또는 이와 유사한를 호출 할 수 있습니다. 언어 많이, 특히 상황이 객체 지향 언어라는 있기 때문 이예요 뭔가의 길이는 데이터 자체의 작품의 캡슐화 내부의 종류입니다 많은 우리 캡슐화 ID와 이름과 월요일에 학생의 내부 가옥이 좋아요. 그러나 C는 훨씬 낮은 수준입니다. 당신이 전에 그 조건을 들었는지 아무 개체 나 클래스가 없습니다. 당신이 가진 모든 정말 메모리 주소입니다. 그래서이 흥미로운 데이터 구조를 나타내는의 옛날 방식의 일종이다. 당신은 첫 번째 문자의 주소 등의 시작 값을 가지고 그리고 모두가 따라 할 것에 동의하는 단순한 임의의 규칙. 따라서 문자열 길이가 구현되는 방법, 우리는 제안 했어? 여러분 중 일부는 지금 몇 번 사용했습니다 나 strlen, 나 strlen. 그것은 바로, 아주 간단한거야? 이 코드 2 줄 같아. 그것은 아마 추가 지역 변수와 함께 거의 일종의을위한 루프입니다. 그러나 나 strlen은 \ 0를 찾아 다음 포인터를하고 있습니다. 그리고 빨리 그것을 발견으로, 그것이 해당 문자열에서 납치 단계의 총 수를 반환 할 수 있습니다. 그래서 우리는 다음에 무슨 일이 일에서 추론 할 수 있습니다. 나는 10 호선에서 수행 한대로 나는 t를 선언 한 후 가정 해 보겠습니다. 이 일부 쓰레기 값입니다. 누가 처음 알아? 그러나 10 줄의 오른쪽에 다시 GetString 전화 했어. 이 문제가 끝나는 장소를 누가 알 수 있겠어요? 하자 임의로 운영 체제가 여기에 오는 이상을위한 공간을 찾을 수 있다고합니다. 나는 다시 우연히 H-E-L-L-O를 입력 할 일 그래서 우리는 그림의 같은 종류를 그릴 수 있습니다. 하지만 다시 그려야이 사진을 표시 한 사실은 고의적 인 것입니다 그 때문에 이것보다 HELLO 다른. 그래서 여기이 장소 456 일 수도이 457이며, 등등. 물음표 한 번있는 곳 그래서 넣어주지? 이 경우 456합니다. 우리는 오늘 이후 때문에 정말 임의의 숫자를 선택하고 우리는 아무것도 주소가 무엇인지에 대해서 왜 그렇게 신경을하지 않을거야. 우리가 걱정하는 건 우리가 HELLO 같은 데이터의 일부 부분의 주소를 알아낼 수 있다는 것입니다. 그래서 정말 메모리 주소에 대해 얘기 할 때 대부분의 사람들은 컴퓨터 과학에서하는 일 그리고, 특히 포인터에 대해 얘기 이 물건이 실제로 어디에 무슨 상관 - 123 것 자체가 귀찮게보다는 우리는 단지 몇 가지 숫자 주소 것을 알고 - 우리는 세계를 단순화하고 단지의 해당 문자를 가리키는 말 그리고 t는 문자를 가리키고 있습니다. 그리고 화살표 있다는 사실은 매우 의도적이다 말 그대로 지금 s이 (가) H와 t에서 가리키고 있기 때문에 또 다른 H에 가리키고 있습니다 하루의 끝에서,이 주소가 무엇인지 상관,하지 않기 때문에 하지만 우리가 코드의 일부 조각을 그 주소를 표현 할 수있는 능력을 가지고이 문제를 않습니다. 우린 단지 아직이 주소를 조작하지 않은 그래서 우리는 우리가 끼어 들어도와 포인터와 함께 일을 분류 할 수있는 곳이 표시됩니다 하지만 말 그대로 12 현재 행에 대한 어떤 값이 우리가 비교 아르 12 호선이 이야기에 따라? 우리는 456-123 동일한 같다 건가요? 그리고 확실히 경우 없습니다. 심지어 개념적으로,이 포인터는 확실히이 동일하지 않습니다 , 당신은 두 번 GetString라고하며, GetString 영리 슈퍼 영웅이 될하려고하지 않기 때문에 가 실현하려고하지 않습니다, 오, 당신은 5 분 전에 HELLO 입력, 내가 전에 준으로 나에게 그 같은 포인터를 주자, 그냥 메모리의 새로운 덩어리 당신이 그것을 매번 전화 할 때마다 할당합니다. 우리는이 문제를 얼마나 해결하나요? 높은 수준되면 난 문자열 HELLO HELLO을 비교하고 싶어 - 나는 포인터 상관 없어 - 내가 질문에 대답을 어떻게해야할까요, 사용자는 같은 일을 입력 거죠? 무슨 일이 필요한거야? 그래. [학생] 기능을 사용합니다. >> 그 상자의 기능을 사용할 수 있습니다. 나는 strcmp, S-T-R-C-m-P라는 함수를 사용할 수 있습니다 문자열 비교라고 말하는 축약 버전입니다. 그리고 우리가 들어갈 경우, 예를 들어, 오늘날의 유인물 중입니다, 2를 비교 나는 정확히 않습니다. 나는, 26 정도까지 아래에 다른 모든 1 호선에서 같은 유지 지금이 부분은 조금 변경되었습니다 확인합니다. 가 잠시 선 28 무시하고 이것에만 신경을 보자. 우리는 str을 비교는 않는 월요일 뭐라고 했어요? 그것은이 경우에는 두 포인터, s 및 t을 복용하는 과정을 처리 정렬 거의 그 두 글자에 그 손가락을 넣어 과가 수행해야하는 것은 for 루프 동안 루프 나 같은 것입니다 그리고이이 같은하다고 말한거야? 그렇다면,이 손가락이나 앞으로 포인터를 이동합니다. 이러한 동일,이 같은이 같은, 이 같은,이 같은? 그리고 오, 오, 나는 s와 t 모두에서 문자열의 끝에서입니다. 어떤 모순을 발견하지 않았습니다. 예, 문자열은 동일합니다. 두 문자열이 같은 경우와는 str, 분명히이 수익을 어떻게 비교합니까? 제로. 그럼 0이 경우 좋은 이유는 -1 또는 1을 반환하는 경우 그 친구는 단지 t 알파벳 순으로 전 또는 t 뒤에 오는 일이 있다는 것을 의미합니다. 그 이유는 문자열이 앞에 오는 정보를 알려 함수가 유용 할 것 또는 사전에 후? [학생] 검색하는 중입니다. >> 검색 및 정렬. 그럼 당신은 바이너리 검색 또는 거품 정렬과 같은 일을 또는 정렬 병합 할 수 있습니다 당신은 일을 비교해야 곳. 지금까지 우리는 모서리를 잘라 종류가 있어요 만 정렬 이야기 숫자의 맥락에서 얘기하고 친절하게 쉽게, 때문에 하지만 확실히 문자열, 사과와 바나나를 비교할 수 사과는 마찬가지로, 바나나 앞에 와야하는 것으로 알려져 경우 때문에, 당신이 비디오에 병합 정렬을했던 롭과 같은 메모리에 주위에 문자열을 이동할 수 있습니다 우리는 선택 정렬, 삽입 정렬, 풍선 정렬과 무대에서 여기 했어요. 어디 다른 우리는이 걸릴 수 있습니다? 의이 일을 해 보자. 의하자 일종의 잠시 동안 그 수업을 잊지 지금 시도하고 다음을 할 1.c 복사합니다. 라인 21 나는 인쇄 무언가를 말 그때는 사용자의 문자열을 나타납니다 그럼 내가이 일을 알아보고 있어요. 우리는 정말 아직이 버릇이라도,하지만 지금은이 작업을 수행 보낼 수있다. 다시이 층 껍질을 벗기면 실제로합시다. 이건 정말 숯불 *입니다. 이 사람은 정말 숯불 *입니다. 그럼 S == NULL 여부를 확인 할 무엇을 의미합니까? 이 판명 당신은 GetString 같은 함수를 호출 할 때 이상 일반적으로 단지 몇 가지 메모리를 제공하는 컴퓨터를 물어 뭔가 잘못 갈 수 있습니다. 당신 미쳤어 메모리의 테라 바이트의 컴퓨터를 물어볼 수 그냥 컴퓨터에 존재하지 않는 메모리의 바이트 조를 요청하여, 하지만 GetString 및 기타 기능은 너 한테 소리지르 중 일부 방법이 필요합니다 당신은 너무 많이 요구 한 경우. 더 많은 메모리를 요구 한 경우 그리고 GetString은이 작업을 수행하는 방법입니다 그 슈퍼, 슈퍼 낮은 확률이라도 컴퓨터에서 사용할 수있는 것보다 우리는 모두 입력을 누르 다음 조 문자를 입력하고 갈 수 없기 때문에 하지만 할 수 있지만 낮은 확률, 난 여전히 경우를 대비해서 그것을 확인하려면 그리고 특별한 가치 GetString, 답변, 및 기타 기능 반환하는 뭔가 잘못됐다고 경우 모두 대문자로 NULL입니다. 그리고 NULL 무엇입니까? NULL 그냥 포인터를 표현하기 위해 발생합니다. 이 메모리 주소 0입니다. 이 내 컴퓨터의 메모리 인 경우 세계, 그 임의로 결정 - 당신이 알아요? - 우리는 모든 컴퓨터의 메모리가 단 1 바이트를 뺏으려고하고,이 위치 0입니다. 우리는 그것을 NULL의 별명을 부여 할거야, 우리는 약속 할거야 우리는 실제로 실제 데이터를 입력하지 않겠다고 우리는 임의의 특별한 가치, 0, 일명의 NULL이 필요하기 때문에 뭔가 일이 잘못되면 Google은 사용자의 소리 할 수​​ 있도록. 그렇지 않으면 0 여기서 뭔가를 넣어 의미 인지도 몰라요 아니면 뭔가 잘못되었을 의미합니까? 우리는 모두 NULL 의미 아무것도 반환되지 않았습니다 동의해야 실제 주소가 반환되지 않았습니다. 자, 여기 나는 그냥 내 인간의 규칙을 채택하는거야 주에서 1을 반환 뭔가 잘못되면. 주의 반환 대회가 0 좋은 경우를 반환하는 것입니다 때문 이예요 1 또는 다른 값이 나쁜 경우. 그러나 GetString 및 NULL 메모리 반환에 계약이 뭔가 나쁜되면 한 기능입니다. 좋아요. 그래서 불행히도, 선 27, 그게하지만 슈퍼 간단한 완전히 문자열을 복사하지 못합니다. 이유는 무엇입니까? 우리는이 다음과 같이 볼 수 있습니다. 나는 s의 사본을 만드는하고 t 전화 할 줄 27에서 소유권을 주장거야. 그래서 2 문자열이 시간에 대한 사용자 의견을 묻는 게 아니에요, 난 그저 s의 값을 말 뿐만 아니라 t에 넣어해야합니다. 이제 막 29 이후 내가 뭘하고있는 거지 줄이 얼마나 깨진 입증 하는가? t의 길이가 0보다 큰 경우 우선 확인하고 있어요. 거기에 어떤 문자열이 있어요. 사용자는 인치 무언가를 입력 분명 선하고 32, 무엇입니까? [안 들리게 학생 응답] >> 오른쪽. 당신은 가지 내가하는 일의 말에서 유추 할 수 있습니다. 그러나 엄밀히 말해서,이 뭐하는 거지? t는 [0] 무엇을 제시 하는가? [학생] 0번째 문자. >> [Malan] 0번째 문자. 또는 더 인간 같은 t의 첫 번째 문자, 그 무엇이든간에, H 어쩌면 이번 케이스는 아니군요. 그리고 toupper는 말하지 않습니다. 그것은 t의 0번째 문자를 capitalizes하고 그것을 변경합니다. 이 t의 0번째 문자를 의미합니다 그래서,이 대문자하기 그 같은 위치에 다시 넣어. 제가 소문자로 인사 입력하면 그럼, 그 수도 H.에 소문자 H을 변경해야합니다 그러나 문제는 라인에 35 제가는 건 36 우리 s와 t에 인쇄이라는 것입니다. 그리고 육감이 뭐죠? 난 정말 모두 소문자로 인사 입력 있는지 무엇을 할까? 어떻게 인쇄한다는거야? >> [안 들리게 학생 응답] >> 그게 뭔데? [학생] 빅 H 나머지 작은. 작은 >> 큰 H 나머지 어떤 용도로, s 또는 t? [학생] 모두 있습니다. >> 둘 다. 그렇지. 그럼 여기서 무슨 일이 벌어 보자. 내가 가서이를 컴파일한다. 이 copy1하므로 copy1을합니다. 괜찮아요. 소문자 인사 : 저 어서 가서 copy1를 실행 입력, 뭔가 말을 듣지 확대. , 그것은 복사를 대문자로 표기하지만, 분명히뿐만 아니라 원래를 대문자로 표기 어떤 지금은이 이야기에서 무슨 일이 있기 때문에? 라인 27에서 I는 실제로는 문자열을 복사 할 것 같지 않아 하지만 직관적 경우가되는 기대했을 수도하더라도, 이 그림에 대해 생각한다면, 어떻게 정말 나는 짓을 한거야? 사진의 절반은 동일합니다. t 아직 이야기에 존재하지 않도록 그럼 다시 시간을 몰게. S 그 이야기에 존재 수 있지만, 가자여이 시간을 소문자. 그래서 실제로 인치 입력 한 저 드릴게요 여기이 경우에서 우리는 H, E, L, L-O를 갖추고 있습니다. 우리는 문자의 순서로 그려 줄게, 내 구분 라인을 넣어 내 \ 0. 그래서 우리가 24 틱을 통해 가능한 한 빨리 1 호선과 같은 곳이며, 어림 잡아서, 실행하고 있습니다. 이건 내 메모리의 그림입니다. I 줄 27에 도착하면, 어떤 일이 벌어 질까요? 전 맘에 들어요, 난이 사각형으로 그려 줄게 포인터를 얻을. 그것은 t라고. 그리고 기본적으로 그 값이 뭐야? 누가 알 겠어? 일부 쓰레기 값입니다. 그래서 그 거리에 물음표와 같은 추상적드립니다. 그리고 곧 선 27 오른쪽은 실행으로 내가이 t 내부 넣는 이유는 무엇입니까? S에 같은 일. 잠시 동안 우리는 화살표의 추상화를 제거하고 우​​리 말한다면 오,이게 당신이 t는 초, 세미콜론를 얻을 수 말할 때, 메모리로드 주소 123입니다 당신은 문자 그대로 여기에 123을 높이는 데 큰 도움이됩니다. 우리가 가지 사진과 함께 다시 세계를 단순화 지금한다면, 만약 당신이 정말 한 것은 당신의 세계에 또 다른 화살표를 추가 그 t에서 같은 정확한 문자열로는 눈치입니다. 그러니까 줄 31 32 실은 t [0] 변경에 대해 갈 때, t이 무슨 날인지 [0] 지금은 확실히 동의어? S [0] 그래서 그 모든 상황이 있습니다. 그리고 이런 종류의 불구하고 느낌이 약간 낮은 수준과 마법 그리고 이런 종류의 아마 직관적이 단지 성공 했어야 것 같아요 - 전에 일의 사본을 만들어 봤는데 그냥 일 - 당신이 실제로 문자열 게 뭔지에 대해 생각한다면, 그것은 숯불 *입니다. 그게 무엇인가? 그것은 어떤 문자의 주소입니다. 그리고 아마도 더 많은 의미가 당신이 뭔가를하려고 할 때 이와 같은 슈퍼 겉보기에 간단한, 당신이하고있는 모든 복사 메모리 주소입니다. 당신은 실제로는 문자열 자체와 아무 짓도 안하고 있습니다. 당신이 모르는 경우에도 당신은 코드에이 문제를 해결 방식을 높은 수준의, 개념적, 우리는 분명히 s의 진정한 사본을 강타하기 위해 어떻게해야하나요? 그래. >> [학생] 그것에게 새 위치를 줘요? 정확히 >>. 우리는 t에게 새로운 위치를 제공해야합니다. 우리는 어떻게 든 우리가 메모리의 새로운 덩어리를하는 세계를 만들 필요가 단지 명확성의 위해 바로 이것 아래 그릴거야,하지만이있을 필요가 없다. 그러나 같은 크기이어야합니다, 그래서 제가 같은 장소에서 이러한 수직 라인을 그릴 수 있습니다. 이 처음 모든 쓰레기 인 경우는 괜찮아요. 누가가 발생했습니다인지 아는 사람? 내가 원하는 그러나 1 단계 많은 메모리로 내놔해야 할 것입니다 인사의 사본에 맞게, 다음, 여기 H를 복사하는 방법을 여기에 전자를 파악 여기 등등 리터. 세부 정보 중 일부가 여전히 추상적 경우에도 그러나 이미 너무 눈에 띄어서 기분이해야합니다. 이 일에이 문자열을 복사하려면, 그냥 루프 나 while 되풀이을위한 또는 당신은 모든 더 익숙하게 한되는 것을. 그럼 이렇게 해보자. 저 copy2.c로 가자. copy2.c에서 우리는 라인 27를 제외하고 거의 동일한 프로그램을 갖추고 있습니다. , 조금 복잡한 보이는,하지만 우리는 조각으로 조각을 내려 어기면 왼쪽은 동일합니다. 숯불 * t은 물음표와 함께이라도 메모리에이 일을 만듭니다 우리가 아무 생각이 없기 때문에 기본적으로이거야. 오른쪽에 우리는 이제, 새로운 기능, malloc을 소개하고 메모리 할당을 위해, 나에게 메모리를 제공 그리고 무리가 소요 얼마나 많은 인수, 얼마나 많은 괄호 안의 일 있었나요? 나는 1과 2의 murmurings을 듣긴했는데 그냥 1입니다. 괄호 안의 단 1 가지가 의미없이 쉼표가 없습니다. 다른 괄호가 비록, 내가 강조하게 가장 바깥 쪽 괄호 안에있는 건하고,이 표현은 다음과 같습니다 (나 strlen (들) + 1) * sizeof (숯불). 우리가 실제로 통해 생각한다면 그럼, 저에게 s의 길이를 제공 답니다. 왜 길이에 1을 추가하지만인가? >> [안 들리게 학생 응답] 그렇지. 우리는 꼬리에서이 사람을위한 공간, 더 영어​​ 의미가 없다 여섯 번째 문자가 필요 하지만 특별한 프로그래밍 의미를 가지고있다. 그래서 우리가 그 일에 대한 + 1이 필요했기 때문에 나 strlen 반환 길이의 인간 예상, 안녕하세요 5, 당신에게 추가 널 문자를 제공하지 않습니다. 그래서 수동으로 + 1이 추가 할 수 있습니다. 그리고 이것은의 * 크기는 (자), 우리는이 전에 보지 못했어요. 이 기술적으로 기능하지 않습니다. 단지 어떤 크기 것은 컴퓨터에 일부 데이터 형식입니다을 알려줍니다 특수 키워드의 현실에서 있기 때문에, 우리 중 일부는 32 비트 컴퓨터를 갖추고 있습니다. 집에서 꽤 오래된 컴퓨터를 가지고 있고, 그것은 단지 포인터를 나타 내기 위해 32 비트를 사용합니다. 나는 데이터 형식의 크기를 한 경우 그리고, 그것은 32 비트 수 있습니다. 내 새로운 멋진 컴퓨터를 사용한다면, 저는 64 비트의 값을 돌려 수 주소 같이하십시오. 따라서이 경우, 단지 슈퍼 안전을 위해, 우리는 같은 하드 코드 뭔가를하지 않을거야 - 그래, 우리가 지금까지 말을했는지에 따라 문자의 크기를 무엇입니까? 우리는 거의가 1 바이트이고, 그 이사회에서 거의 사실이야 말로 말했습니다. 다시 한 번, 가정은 나쁜 경향이 있습니다. 사람들이 당신이 의도하지 않은 방식으로 소프트웨어를 사용하는 경우 그들은 버그가 소프트웨어에 연결되어 있습니다. 그럼 가자 추상적이 거리에 있으며 더 많은 총칭 말 나는 기억이 많은 덩어리가 필요 메모리의 각 덩어리는 문자의 크기에 상응해야 이 경우 1 같은 사실에있는 것입니다,하지만 그것을 작성하는 더 일반적인 방법입니다. 단어가 인사하는 경우 그래서, 얼마나 많은 바이트 malloc 무리가 인사에 대한 할당합니까? [학생] 여섯. >> 여섯. 우리가 화면에 물음표가 그대로 많은. 그리고 지금 GetString의 이해를 바탕 같아요 걸릴 malloc은 아마도 무엇을 반환합니까? >> [학생] 주소를 입력합니다. 어떤 주소? 메모리의 첫 번째 청크의. 우리는 뭐야이 아무 생각이 없기 때문에 다른 기능 이전에이 메모리를 사용하는 것 같다. 그러나 malloc은 GetString 같은 메모리의 첫번째 바이트의 주소를 반환 당신을 위해 정해 것을. 그러나, 그런 일이 수행하지 않는 것은 백 슬래시 널 문자로이 기입되어 있습니다 ints, 문자열, 배열, : 당신이 아무 것도 할당 malloc를 사용하여 아웃이 변하므로 수레, 학생 구조. 당신은 완전히 총칭 malloc을 사용할 수 있습니다. 건 상관 또는 당신이 메모리를 할당하고 있는지 알고 필요가 없습니다. 그럼 \ 0 넣어 mal​​loc에​​ 대한 주제 넘은 것 메모리의 모든 덩어리의 끝에서 당신을주고 있어요 이 \ 0은 정말 문자열을위한 대회이기 때문이다. 이것은 ints 사용이 아니라,이 수레를 사용하지거야,이 학생들을 위해 사용하지있어. 그리고 malloc으로 잡았다는 부담이 당신을 완전히 프로그래머 점입니다 당신이 할당 얼마나 많은 바이트를 기억하고 영원히 루프에를 사용하지 또는 동안 루프와 당신이 주어진 한 메모리의 청크의 경계를지나 이동합니다. 빨리 메모리를 할당 같은 다른 방법을 넣어, 당신이 운영 체제를 요청할 수없는 오, 그런데,이 얼마나 메모리의 청크의 큰 였어요? 당신이 그 값이 필요한 경우 기억 귀하가 전적으로입니다. 그래서이 메모리를 사용하는 진행 방법을 보자. 라인 28 29 왜 내가이 짓을하는거야? 그냥 총 정신 검사. 뭔가 잘못되었을 경우를 대비해서, 나는 기억의 일부 미친 금액을 요청 또는 너무 많은 것을, 그냥 메모리가 부족하여이 아니라는 것을 컴퓨터에서 실행 그런 일, 나는 적어도 NULL인지 확인하고 싶습니다. 현실에서, 대부분의 컴퓨터는 당신에게 환상을주는 것이다 모든 프로그램 귀하의 RAM의 전체를 사용할 수 있습니다, 그렇다고해도, 아마 어떤 미친 긴 문자열에 사용자가 유형을한다면 그들은 나쁜 사람이라 그리고 사실은 그에 프로그램이나 해킹을 중단하려는 당신은 적어도 malloc의 반환 값을 확인 하시겠습니까과는 null 같습니다 여부를 지정합니다. 그리고 그렇게되면, 그 경우에 무엇을해야하는지하지 않기 때문에 그냥 지금 그만 두지. 어떻게 문자열을 복사하려면 어떻게해야합니까? 이 작업을 수행 할 수있는 몇 가지 방법이 있습니다. 이 str을 C 함수를 복사 만, 우리는이 옛날 방식으로 할 것이 간단한 됐네요. 먼저 저 s의 길이가 무엇인지 생각해 보자. 나는 루프에 넣고 수 대신 그냥 명확성을 위해 여기를 넣어. 따라서 n은 이제 분명 5 원래 문자열의 길이를 저장합니다. 그런 다음 내 용 루프에 나는 N까지에 0에서 반복 해요 각 반복에서 내가 할게요 님의 [I] t의 안쪽에 [I]. 그게 내가 전에 문자열에서 포인팅 제 2 손가락으로 암시거야. 루프이 이런 식으로 반복으로, 여기에 H를 복사 할거야 여기에, 난 여기에에 전자 제품이 있기 때문에,이 t이다. 그리고 마지막으로, 선 35에 왜 이런 짓을하는거야? 본인은 문자열 t를 마무리하고 있는지 확인해야합니다. 그리고 명시 적 영웅이 될하는 데 이런 식으로 했어요. 하지만 당신이 있다면,이 일을하는 다른 방법을 사람을 제안합니다. 정말 라인 35 필요하지 않습니다. 이 작업을 수행 할 수있는 다른 방법이 있지. 그래. >> [안 들리게 학생 응답] >> 다 들리게 말해. [학생]보다 작거나 같다. 정확히 >>. 우리는보다 작거나 일반적으로 나쁜 된 N,와 같은 말을 할 수 우리가 계산하는 일에 동일한에 가서 거의 항상있어서 우리는 너무 멀리 한 단계를 이동합니다. 하지만 잊지마, 우리는 얼마나 많은 바이트를 할당 할거야? 우리는 6 총하므로 5 + 1 s의 나 strlen을 할당. 따라서이 경우에는 우리는 이런 일을 할 수 우리는 매우 말에 그냥 인사뿐만 아니라 \ 0하지 복사하고 있도록. 또한, 우리는 strcpy, str을 복사라는 기능을 사용할 수 하지만 그건 거의만큼 재미 않습니다. 하지만 그런 놈들은 후드 아래에 전부거든요. 그런 다음 마지막으로, 우리는 이전과 같은 일을 할. 나는 t를 대문자로하고 나서 원래이와 복사가 그런 식으로 보이는 것 같습니다 주장한다. 그럼 지금 이렇게 해보자. 날 여기에 가자. COPY2하십시오. 우리는 확대하고 COPY2를 실행합니다. 나는 소문자로 인사 입력에 갈 때 실제로 나는 원래로 인사 소문자 얻을 하지만 복사본에 대한 안녕하세요 자본. 하지만 난 아직 안 끝났어요. 여기 한 마지막 일을해야합니다. 46 47 명확하게 메모리를 자유롭게 있지만, 그 사실은 무엇을 의미합니까? I 줄 46 줄 47 전화하여 생각, 무슨 짓을하는거야? 그게 무슨 효과가 있습니까? 그래. [안 들리게 학생 응답] >> 맞아. 당신은 요,이 메모리 덕분에 운영 체제를 얘기하고 있습니다. 이제 다른 사람을 위해 사용할 수 있습니다. 여기이 쓰레기 값의 완벽한 예입니다. 난 단지 2 곳에서 인사라는 단어를 적어이 메모리를 사용했습니다 여기, 여기, 여기, 그리고 여기. 그래서이 H, E, L, L-O-\ 0입니다. 하지만 난 줄 46 줄 47 전화, 당신은 그림의 관점에서가 어떻게되는 줄 알아? 사실, 기다려,이 사진은 예전의 하나입니다. 우리가 복사본을 만들되면,이 사람은 실제로 여기 가리키고있다 그래서 다시 번호를 제거하고 단지 추상적 거리에 우리의 화살로 까. 내가 무료로 전화하면 어떻게이 사진에 어떻게됩니까? [안 들리게 학생 응답] >>조차도. 나는 s와 t에 무료로 전화하는 경우 - 트릭 질문의 종류 -이 사진은 전혀 변경되지 않습니다 을 호출하고 호출하기 때문에 t, 그냥 운영 체제를줍니다 이봐 요, 당신은 다시 메모리를 사용할 수 있지만이 null로 변경되지 않습니다 또는 일부 특수 문자는,이 설정을 변경하지 않습니다 그것은 H 또는 전자 또는 다른 어떤 두 장소에서 L 또는 L 또는 O를 변경하지 않습니다. 그림의 관점에서, 최대한 빨리 무료, 아무것도 변경 사항을 전화로. 그리고 거기에 쓰레기 값의 출처를 잡고 있기 때문에 만약 내가 나중에이 프로그램에 그 GetString 또는 malloc 또는 같은 더 많은 메모리 운영 체제에게 과 운영 시스템은 물론, 내가 일어 단지 해방 메모리의 12 바이트를 가지고 있다고 이러한을 사용하여, 어떻게 당신은 전달 할거야? 당신은 우리가 일반적으로 그릴 것이라고 메모리의 덩어리를 건네 할 것 물음표와 함께, 그러나 그 물음표은 무엇입니까? 그들은 H, E, L, L-O, H, E, L, L-O 될거야. 이러한 즉시 해당 메모리를 확보로 새로운 쓰레기 값입니다. 실제 의미도 여기에 있습니다. 이 RAM과 무슨 일이 있지만, 컴퓨터 실제로 디스크 같은 일을 할. 우리는 과학 수사에 초점을 맞추고 미래의 문제 세트 특히 이것에 대해 얘기하자. 당신이 바탕 화면에 민감한 금융 파일이있는 경우하지만 어떻게 실제로 발생 또는 일부 스케치 JPEG 그리고 당신은 당신의 휴지통에 끌어 당신이 휴지통 또는 휴지통에 끌어하면 어떻게됩니까? 당신은 내가 무엇을 말하고 있었는지 알고 있었다. [웃음] 당신이 휴지통 또는 휴지통으로 그 증거를 괴롭혀하면 어떻게됩니까? [안 들리게 학생 응답] 음,주의. 당신이 그렇게하면 어떻게됩니까? 짧은 대답은 그래, 아무것도 아니다? 스케치 또는 민감한 파일은 여전히​​ 당신의 하드 드라이브에 어딘가에 앉아있다. 우리 대부분은 적어도 당신이 휴지통을 비울해야하는 어려운 방법을 배웠습니다 또는 휴지통 실제로 파일을 삭제합니다. 그리고 실제로, 당신은 마우스 오른쪽 버튼을 클릭하거나 쓰레기를 클릭하여 관리 할 때 수 또는 파일, 휴지통 비우기이든 뭐든간에를 선택 당신은 실제로 쓰레기 수거나 실제로이 그림에 무슨 일이 휴지통, 비어? 더 아무것도. 그럼 아무는 실제로 디스크에 변화가 없습니다. 우리가 일시적으로 빗나가 다 쓸 경우 그리고 - 난 단지이 다시 사용합니다. 그래서 지금 그 이야기는 프로그램이 존재합니다 RAM에서 변화 당신은 디스크에 그들을 실행하는 동안 그들이 장기적으로 저장되는 위치, 누가 전력은 지금,을 간다해도 - 우리는 앞으로이 다시 올거야 - 우선은이 컴퓨터의 하드 드라이브 내부를 나타냅니다 척 때문에 과거에 그들은 많은 플로피 디스크처럼 원형 디스크로 사용됩니다. 당신이 민감한 엑셀 파일을 가지고있는 경우 그래서, 메모리의 덩어리를 걸릴 수 있습니다 컴퓨터의 디스크에, 그냥 같은 임의의 1 초와 0s을 그릴거야. 당신이 휴지통으로 그런 식으로 파일을 드래그 할 때 또는 bin을 재활용 할 수 애플과 MS가 단지 결정했기 때문에 그대로 아무 일도 발생하지 않습니다 휴지통은 안돼하고 휴지통 단지 임시 자리 표시 자입니다. 아마 결국 OS가 당신을 위해 비우되지만, 일반적으로는, 아무것도하지 않습니다 당신이 공간이 정말 저질이야 적어도 때까지. 그러나, 휴지통 비우기 또는 빈 휴지통으로 갈 때, 마찬가지로, 아무것도이 사진에 변화가 없습니다. 그런 일이 모두 다른 사용자의 컴퓨터에, 테이블의 일부 종류가 있습니다. 그 말은, resume.doc, 말의하자 있다고 약간의 컨닝 시트 같은 종류의입니다 때문에 하드 디스크의 위치 123에서 살았 Microsoft Word 파일의 이력서, 하지 메모리가 아닌 RAM에 있지만 하드 디스크에, 그리고 456에서 스케치 JPEG 생활 및 엑셀 파일 789에서 또는 어디든지 살고있다. 당신이 실제로 휴지통 또는 휴지통을 비우는하여 파일을 삭제하면은, 이 그림은 변경되지 않습니다. 하드 드라이브에 0s와 1S 어디 가지 마세요. 그러나이 테이블 종류의이 작은 데이터베이스가 변경됩니다. 파일이 어떤 의미에서 삭제 것처럼 당신의 이력서를 삭제하면, 그것은이다 그 것은 하드 드라이브에 사는 곳 있지만 모든 컴퓨터는 잊지 않습니다. 이력서 또는 다른 파일을 작성 0s와 1S은 여전히​​ 그대로입니다. 실수로 이런 짓을하면, 0이 아닌 확률은 여전히​​이 당신은 노턴 유틸리티 또는 일부 상용 소프트웨어를 사용하여 데이터를 복구 할 수 인생에서 누구 목적은 0s, 말하자면 고아 된 1 초 찾을 수 있습니다 여기 잊어하지만 다시 데이터를 얻을 수 있도록, 여기를 떠났다. 또는 경찰이나 FBI와 법정 수사 당국은 실제로 하드 드라이브를 걸릴거야 실제로, 0s 및 JPEG 파일과 같은 모양, Excel 파일과 같이하는 1 초에 패턴을 찾아야 그리고 그들에게 컴퓨터가 거기를 잊은 경우에도 그런 식으로 복구합니다. 그래서 우리는 앞으로 논의 되겠지만, 데이터를 삭제하는 정말있는 유일한 방법은, 로 파일이나 하드 디스크를 문질러거나 닦아 것입니다 - 당신은 정말 0s와 1 초를 제거 할 수 없습니다 그렇지 않으면 당신은 기가 바이트 하드 드라이브로 시작 테니까요 당신은 지속적으로 삭제 된 경우 그리고 당신은 메가 바이트 하드 드라이브와 함께하고 말 거예요 문자 그대로, 0s와 1 초. 당신이 정말로 당신의 흔적을 충당하기 위해 원한다면 그럼 당신은 어떻게 하겠니? 그리고 근본적인 문제는 여전히 0s와 디스크에 1 초이 뭐야? 당신이 물리적 장치를 깰 것이라고 gesticulating 사람을 참조하십시오. 그 작동합니다. 그 비싼 솔루션의 종류면 [웃음]하지만, 어떻게 더 합리적인 것입니까? 그래. >> [학생]를 덮어 씁니다. >> 뭘를 덮어 쓰시겠습니까? >> [학생] 기타 데이터입니다. 다른 데이터입니다. 당신은 0s 또는 1 초 또는 모든 0s, 모든 1 초를 사용하여 디스크를 덮어 쓸 수 있습니다. 그리고이 소프트웨어의 일부가 무엇을 실제로입니다. 당신이 소프트웨어를 구입하거나 무료 소프트웨어를 얻을 수 있습니다 심지어 덜 때문에 Windows에서이 일 맥 OS에 내장 안전하게 삭제 할 수있는 기능입니다. 오늘 모든 실행 홈으로하려는 경우 사실, 당신은 Mac을 가지고이 작업을 수행하는 경우 당신이 가진 경우 휴지통에있는 물건이, 당신은, 보안 휴지통 비우기를 할 수 있습니다 이는 정확히 맞는다. 오히려 여기에 단지 지우기 파일보다는, 0s와 1S 여기를 삭제하지 않습니다 대신, 그냥 0s과 점, 점, 점에, 예를 들어, 그들 모두를 변경합니다. 따라서 미래 psets 중 하나는 실제로 의도적으로 데이터를 복구하는 것입니다 - 우리가 캠퍼스에서 사람, 장소, 사물의 촬영 한 사진 하는 우리는 디지털 카메라의 메모리 카드를 법정 이미지가 될거야 이는 동일한 생각입니다 - 당신은 실제로 찾기 위해 도전해야 할 것 귀하의 하드 드라이브에 JPEG 파일을 나타냅니다 패턴, 많은 그의 이메일이 전 학생 같은 몇 주 전에 읽었 어 동생의 사진을 복구합니다. 왜 우리가 여기로 5 분 휴식을 취하지 않으며, 우리는 메모리에 대한 자세한으로 재편성됩니다. 그래서 여기 일이 좀 정신을 굽힘받을 곳이지만이 매우 강력한 단계입니다 이 모든 자세한 내용을 이해하게 되었 지요. 여기 pointers.c라는 프로그램입니다. 오늘의 샘플 코드 중 하나입니다. 처음 몇 줄에 22을 통해 19, 우리가하는 모든 GetString 같은 상태가됩니다 및 S에 저장, 주소를 반환. 이제부터 pset도 3에 대한 당신이 원하는 경우 만 pset 4에 어디서 자신을 물러나게 훈련 바퀴를 만들 수있어 문자열이 더 이상 존재한다는 가정 할 이유가 없습니다. 확실히 그냥 숯불 * 말을 시작 됐어. 옆으로, 온라인 참고 문헌과 책에서 당신은 종종 변수 옆에있는 별표를 볼 수 있습니다. 당신은 그것의 양쪽 주변의 공간을 볼 수 있습니다. 사람들의 모든 기능적으로 정확합니다. 지금은하지만, 우리는 슈퍼가 명확하게이 방법을 표준화합니다 그 문자 *는 문자 포인터를 말하는 것입니다. 그것은 데이터 형식입니다. 그리고 변수의 이름은이 경우 s입니다. 그래서 우리는 문자열을 늘어 놓던하고 우리는 S라고했습니다. 그리고 여기 난 사실 속임수 약간하고있어 사실을 알아야한다. 이것은 슈퍼 간단한의 종류입니다 포인터 산술을라고합니다. 단지 포인터에 번호를 추가하고 빼야 의미합니다. 그러나 실제로 작동합니다. 이 프로그램은 확실히 같은 최종 결과 그 한 줄에 문자열의 한 문자를 인쇄 - 그냥 그래서 우리는이가는 곳, 부패 포인터를, 포인터를 실행, 제가 확대시킬 수 지금 HELLO와 타입 입력 그런 일에 저에게 종류를 알려 그리고 한 줄 당 1 문자를 출력합니다. 최대 초 전 때까지, 우리는 대괄호 표기법으로이 작업을 완료 한 것입니다. 우리는 루프에 대한을 보내고있는 우리는 s의 printf하고 싶어 [I] 우리는 또 한번, 또 한번하고 또 그 짓을 할 거라고 각 줄의 끝에 백 슬래시 N으로. 그러나이 프로그램은 다릅니다. 이 프로그램은 말 그대로 산술을 사용하고 있습니다. 그래서 여기 무슨 일이야? 이 루프도 실행하기 전에 먼저, 무엇을, 분명히해야 할 것은, S는 실제로입니까? S는? >> [학생] 주소를 입력합니다. >> 주소. 그리고 인사의 경우의 주소입니다, 그 단어의 첫 번째 문자가되는데,이 H입니다. 그래서 s은 (는)이 특정 예제에서, H의 주소입니다. 그럼을 어떻게 의미 + 내가? 음, 내가 루프이에 0에서 시작합니다. 우리는 몇 번 했어. 나는 분명히 문자열의 길이까지 갈 수 있습니다. 따라서이 루프의 첫 번째 반복에, 난 분명히 0입니다. 오히려, S +0- - 그 분명 단지 s의 - 그래서이 표현이 s이 (가) + 내가 말하고 있습니다. 그럼 * 여기의 무엇인가? 이제 우리는 약간 다른 방식으로 별표를 사용하고 있습니다. 내가 가서 우리가 t와 s의 사본 얘기를했기 때문에 t을 제거 보자. 이제 우리는을 포함하는 이야기를하고 싶습니다. 그 전에 한 매우처럼 그리고 지금이 순간에서 입력 문자열을 가진 후, 우리의 세계가 보인다 단지 s는 H의 주소를 저장하고 더 일반적으로 인사 문자열에서 가리키고있는. 지금 * 같은 라인을 할 경우 (S + I), 이것 좀보세요 까. 따라서 * (S + I). 이 0이기 때문에 저를 단순화하자, 그래서이 * (S +0)입니다. 음, 잠깐만 요. 더 단순화합니다. 이 * (S)입니다. 자, 이제 괄호 바보의 종류, 이제 그냥 할 * S 보자. 따라서이 루프, 강조있어 해당 줄, 26의 첫 번째 반복에서 이 인쇄에 거의 동일합니다. * s의 데이터 유형은 무엇입니까? 별은 S 자체에 옆에서 일어나는 이러한 맥락에서, 때문에 하지만 더 구체적으로, 우리는 더 이상을 선언 없기 때문에 우리는 더 이상 변수를 만들어 낸 게 아니군요, 라인 (26)에서 숯불 *에 대한 언급은 없습니다 키워드 문자열에 대한 언급이 없어, 우리는, S라는 변수를 사용하는 지금 별이 의미를 혼동 보면 약간의 차이가 있으며, 밝혀졌다. 여기 * s은 (는)이 무엇이든 s의 주소와 인쇄로 이동을 의미합니다. 그럼 s는 여기 * S는 - 정렬 낙하산과 사다리 등의, 화살표를 따라 - 여기. 그래서이 * s입니다. 그러니까 줄 26에서 해당 루프의 첫 번째 반복에서 무엇을 인쇄됩니다? 나는 문자에 대한 자리 표시 자입니다 % C를, 인쇄 다음 새 줄에 \ N. * (S + I) 전 0 이번이입니다. 그래서 숯불 I는 % C을 위해 배치합니까? H. 이가는 곳 아마 당신은 볼 수 - - 루프의 다음 반복에서 다음 반복 난 분명히 1,이 방법들 +1, 이제 별 말을해야하기 때문 그리고 지금은 괄호를 필요합니까 메모리 주소의 1로 이동합니다. S는 무엇입니까? 의 시간에 롤백이 화살표가 지금 실제로 전혀 도움이 안 되는군한다고 가정 해 보겠습니다. 이 번호 (123)를 저장 있다는 말을 더 구체적으로 보자 이 문자열의 시작은여보세요,이 주소 123 있기 때문에,이 등등 124이며,. 그래서 S +1 말 두 번째 반복에, 그 123 일을 말하는 것입니다 그렇지 않으면 124로 알려진 문자가 두 번째 반복에 인쇄됩니다 그래서? 메모리 주소 124에 E. 우리가 여기에 오기 전에 다음 + 다시 125, 126, 127,이 루프는 고맙게도 중지 난 내가 너무 높이 포함되지 않도록하기 위해 나 strlen을 사용 때문입니다. 그래서 역시입니다. 다시, 우리가 일주일 전에 짓을 한 단 것처럼입니다. 우리가 모두 싶지 않아하더라도 내게 줄에 아래를 써라. 이 이렇게 지금 동일합니다. 그래서 우리가 주를 전화 해 봤는데 전화로 S는 문자열하더라도, S는 정말 숯불 *입니다. 우리가 슈퍼 항문되고 싶어한다면, 그것은 특정 문자를 작성하는 정말 적합하다고 이 숫자 주소와이 별 연산자를 사용하여 i 번째 위치에서, 솔직히이 너무 청소기입니다. 그래서이 나쁜되지 않습니다. , 이유는 여기에 라인 27을 중지 없습니다하지만, 26 기능적으로 동일합니다 그리고 우리가 지금까지 논의 된 것으로 정확히 이유로 기능적으로 동일입니다. 그리고 마지막으로, 29는 것이 좋습니다. s의 무료 호출하면 이제 GetString이 준 메모리를 돌려주는한다는 것을 의미 다시, 나는 주 동안 GetString, 월요일 언급으로하기 때문에 코드에 버그를 소개하고 있습니다. 주 코드는 메모리 누수을 가지고 상기 당신은 메모리 GetString을하려고 했어요하지만 다시 제공을받은 적이 없어. 그리고 의도적으로 pedagogically 회사로 선정되었다 그 이 조기에 생각이 너무 많아 때문입니다. 하지만 지금 우리는 더 대칭가 필요합니다. 당신은 메모리에 컴퓨터를 요청한 경우와 같은, GetString의 경우입니다 같은 경우는, malloc에​​ 분명합니다 당신은 pset 4 이후에 무료로 이러한 메모리 지금해야합니다. 이 정수 n을 말하는 다릅니다 확인할 수 있습니다. 당신은 GetString 전화를하지 않았기 때문에이 해방 할 필요가 없습니다 당신은 malloc를 호출하지 않았습니다. 결국 우리가 보게 될, 심지어 당신은 GetInt라고하면 당신은 실제로 정수를 주위에 전달 할 수 있기 때문에 GetInt 당신을 위해 메모리를 할당하지 않습니다 우리가 주 동안 해왔 막 방식 수레와 문자. 정말 그들은 여러 문자의 결합이기 때문에 문자열은하지만, 특별한 있습니다. 그래서 그들은 문자와 수레와 ints에서 다른 고 좋아요. 그러나 우리는 오래 전부터으로 돌아올 거예요. 질문 한 후 포인터의 시작에? 그래. [안 들리게 학생 질문] 아, 아주 좋은 질문입니다. C는 실제로 당신을 위해 일하는 몇 가지 중 하나는, 그이 편리합니다 그것은 크기가 데이터 형식입니다 당신에게 밖으로 떠날 수 있습니다 그리고 당신 곱셈의 종류 않습니다. 거의 항상 문자는 1 바이트이기 때문, 문자의 경우 관련이 그래서 그냥 작동합니다. 그러나 토론의 위해서 당신은 실제로 정수를 인쇄 된 경우 그리고 당신은 어떤 값의 정수로 지목 된 그 방법을 찾아 인쇄하려는 int는 4 바이트입니다 * 난 그냥 때문에이 유사 + 4 수행 할 필요가 없습니다 것입니다. 포인터 산술 C와 컴파일러가 당신을 위해 모든 계산을 할 것을 의미합니다. 당신이 걱정해야 할 모든 인간의 감각의 종류에있는 계산입니다. 그래. [학생]이 (가) 당신이 루프에 대한 내부 문자열을 선언하는 경우, 당신이 나중에 확보해야합니까? 좋은 질문입니다. 당신은 루프의 문자열 내부에 선언하면 나중에 확보해야하는 이유는 무엇입니까? 당신은 당신이 GetString이나 malloc으로 할당되는 메모리 처리해야 할 것입니다. 당신이 뭔가를 원하는 말한다면 - 모든 코드가 관련되어 있으므로 내가 지금 중괄호를 넣어 보자. 이 같은 buggily에도 불구하고 무언가를, 그랬다면, 숯불 * t = s의 t는 malloc 또는 GetString의 언급을 포함하지 않았기 때문에 당신은 무료로 t 할 필요가 없습니다. 이 짓을 반대로하는 경우 GetString는 다음 네, 당신은 무료로 t해야합니다. 그리고 사실, 할 유일한 기회 범위의 동일한 문제에 대해,이 루프 안에서 지금 우리가 과거에 논의 한. 그렇지 않으면, 메모리를 할당 메모리를 할당 메모리를 할당했을 그리고 프로그램의 끝에서, 그 루프의 외부에 있기 때문에 t는 존재하지 않지만, 당신은 운영 체제를 말하지 않았어 당신은 더 이상 메모리를 필요로하는 것이 었죠. 그리고 오랜 전에 pset 4 5 우리는 Valgrind라는 프로그램을 장비합니다 이는, 그것은 마법 인터페이스 다소있어 점에서 정신에 GDB와 비슷합니다 그러나 인생의 목적은 당신을 도와 것입니다. 그리고 Valgrind 앞으로 프로그램을 검색하는 프로그램입니다 메모리 누수를 찾는, GetString 또는 malloc의 여부, 있는 우리는 많은 CS50 라이브러리를 사용 중지로 모두 더를 사용하여 시작합니다. 우리는 마침내 우리 이제 어휘의 종류와 이론의 정신 모델의 종류가 이 깨진 프로그램을 해결하기 위해되는. 그래서 깨진 프로그램에, 스왑은 스왑의 내부 작동 메인은 ​​x와 y, 리콜에 전달하기 때문에 실제로, 주에서 일한 적이 이들은 말하자면, 값으로 전달되었다. 그 중 사본은 교환 주어졌습니다. 스왑 년 말까지, a와 b가 참으로 교환되었습니다, 하지만 물론 우리는 월요일에 논의​​으로 x와 y는 본 적이 없었습니다. 그래서이 사람은 실제로 솔루션입니다 것으로 녹색으로 제안합니다. 그리고 사실, 난 그냥 일치하도록 내 별을 이동하게 하더라도, 다시 기능적으로이 중요하지 않습니다. 언제, 왜 상관있어 앞으로 주에서 우리는 설명 할 수 있습니다. 따라서 녹색으로 지금은 솔루션입니다. 난이 별을 모두 가지고 있기 때문에 솔직히, 이건 훨씬 참 보입니다. 한 가지만을 지적 보자. 이 정수 * a와 int는 * B라고 여기 최고의 항상이 같은 근본적으로 같은 일을하고 있습니다. 그것은 교환이 인수 또는 매개 변수를 선언합니다 정수 포인터가있는 첫 번째는이라고 두 번째는 b라는 정수 포인터입니다. 이 시점에서 새로운 점은 스타가 거기에 있다는 사실입니다. 그게 무슨 뜻 이죠? 이 정수가 아닙니다, B는 정수가 아닙니다. 이 정수의 주소이며, B는 서로 다른 정수의 주소입니다. 나는 C가 사용자에게 혼란을 도착 인정 곳 여기선이 있습니다. 이제 우리는 스타를 사용하고 있지만,이 맥락에서 다른 의미가 있습니다. 우리가 여기있는 한 우리는 포인터를 선언하지 않았기 때문에 것은 여기에 우리는 세상을 dereferencing 있습니다. 따라서 기술적으로, 스왑의 내부의 제 1, 제 2 및 제 3 라인의 맥락에서의 별 단지 의미 역 참조 연산자는, 거기로 가야합니다. 내 손가락이 H에있는 화살표를 따라, 그래서 마찬가지로 * 수단은 해당 주소로 가서 나를이 INT를 찾습니다. * B 수단이 주소로 가서 거기에 뭐가 저를 전달합니다. 그럼 월요일 이제 프레임 스택을 사용하여 사진을 다시 그리기하게, 하단의 하나는 메인이 될 것입니다 상단 하나는 스왑 될거야 우리의 세계는이 같은 월요일 같은데 있도록. 여기에 주요 사용 할 것을 메모리의 덩어리입니다. 프로그램이 단 2 변수가 있다는 월요일부터 기억, 하나는 x와 y라는 하나라고, 그리고 난 거기에 숫자에게 1과 2를 넣어했다. 지금은 같은 교환 전화를 할 때 월요일에 한, 내가이 프로그램의 붉은 색 버전을 사용하는 이전하면되는데,이,이 모양 I 2 매개 변수 a와 b를 가지고, 우리는 여기와 여기에 뭘 썼는데? 단 1과 2는 말 그대로 X와 Y 복사합니다. 오늘 우리가 그를 변경합니다. 오늘은 대신 ints를 전달의 a와 b 우리는이 주소를 전달하는 것. 이러한 주소는 ints를 가리 키도록 어떻게, 그러나 그 주소는 자신을 ints하지 않습니다. 그들은 주소입니다. 그것은 대신 우편 주소 같아요. 이제 우리는 자신에게 화면에 좀 더 자세한 정보를 제공해야합니다. 가 오늘 하루 종일로 내 컴퓨터의 메모리입니다. 이제 우리는 몇 가지 임의의 번호 체계가 필요합니다. 그래서 메모리 주소 123, 124입니다, 그냥 우연히, 방금 뭐라고 까. 보자은 그냥 125입니다라고이 126이며, 등등,하지만 완전히 임의의입니다. 우리는 기억의 일부 번호 체계가 필요합니다. 그래서 저는 실제로 x와 y에 통과 할 때, 나는 x와 y에 전달 않을거야, 나는 X의와 y의, 말하자면, 우편 주소에 전달거야 그래서 뭐 여기와 여기에 저장됩니다 것은 1과 2은 아닐지라도 것은, 내 작은 텍스트를 볼 수 있다면, 어떻게 여기와 여기에 전달됩니다? [안 들리게 학생 응답] >> 맞아. 123 여기에 넣어됩니다 및 124이 여기에 넣어됩니다. 이제 때문에, 맨 위에 여기이 매우 첫 번째 방법으로 별표를 사용 내 프로그램이 방금 분명 정수인데도, 그 123 및 124을 알고 모든 인간이 발견 할 수있는, 그들은 주소, 숫자 주소로 해석해야합니다. 그들은 ints과 자신의하지 않은, 그들은, 주소 야 내가 명시 적으로이 별을 넣어했기 때문에 그입니다. 이제 어떻게 여기에 무슨 일이 실제 코드의 제 1, 제 2 및 제 3 행에? 의이 그림의 나머지 부분을 그려 보자. TMP는 그냥 월요일에 있었던 것입니다. TMP에 관한 건 특별한 게 없습니다. 단지 지역의 32 비트 변수이며, 내부, 나는 분명히 *의 값을 저장하고 있습니다. 자, 내가 말한다면 tmp를 =, 여기서 무엇을까요? >> [학생] 123. 123. 하지만 그건 내가하고있는 일 없습니다. 나는 TMP를 말 = *. 스타 수단 거기에 이동합니다. 그래서 여기가 123입니다. 어떻게 거기에 가지? 화살표가 척. 음, 저기, 1입니다. 하니까, tmp 디렉토리에 무엇을 저장됩니다? 그냥 1. 따라서 즉, tmp 디렉토리는 *, * 수단에 현재 주소로 이동 것은, 어떤 무리가 123입니다. 자, 여기서 우리가 위치 123에 있습니다, 난 숫자 1을 참조하십시오 그래서 나는 거기에 숫자 1을 넣어거야. 지금은 2 호선에 무엇을해야합니까, * = * B? 무슨 지금 때문에이 녀석은 좀 더 관련 있나? 이 123입니다. 따라서 *은 어디 있죠? 마우스 오른쪽 전에 어디 있었는지. 그럼 거기에 이동합니다. 좋아요. 이제 마지막으로, 그리고 마지막이, ​​바라건대, 이해되기 시작합니다 * B는 B에 어떤 의미? 124. 그래서 2입니다, 거기로 갈해야합니다. 그래서 어디까지 무엇을 입력해야합니까? * B는 *로 전환하기 때문에이 여기에 저장됩니다. 그래서 그걸을 다하겠습니다. 그리고 당신은 이미 우리가 너무 가까이, 아마도 볼 수 있습니다 처음으로 제대로이 바보 같은 간단한 문제를 해결하는 지금 우리가 여전히 X가 무엇인지에 대한 기억이 있기 때문은, 우리는, Y의 보면 2 장을 가지고 하지만 3 호선 지금 * B는 말합니다. 그래서 여기 B입니다. * B 수단 거기에 이동합니다. 그럼 위치는 124 어디있어? 여기 분명 있습니다. 그래서 여기에 무엇을 입력해야합니까? 물론, tmp를 입력합니다. 그래서 지금은이 작업을 수행합니다. 그래서 여기에 하나 여기이 있습니다. 그리고 지금 무슨의 모든 123 124 및 1? 즉시 스왑 수익 등이 기억을 잃은만큼 좋은 즉시 스왑 반환, 운영 체제 등 때문에 미래에 다시 메모리를 사용하여 무료입니다. 이 소위 스택의 맨 아래에있는 만 메인 메모리는 주위에 넣는다. 그래서 우리는 드디어 이제 작업 버전이 있습니다. 저 swap.c로 이동하여 다음 사항을주의하자. 프로그램의 상단에 내 프로토 타입이 될 변경 한 정수 * a와 int는 * 나. 내가 나빴어 빨강,에서 좋은 녹색,로 이동하도록 변경 유일한 자, 오늘은이 별을 추가됩니다. 하지만 여기에서 그 자체를 교환 알았다했고, 그냥 슬라이드에 뭔지 붙여 넣습니다. 여기 스타가 여기 스타 - 그 프로토 타입을 일치 - 다음이 모든 일 현재 tmp를 제외한 별이 임시 변수의 사용 때문에, 새로운 아무것도 없습니다. 난 그냥 정수에 대한 임시 저장소가 필요합니다. 그래서 우리는 거기에 별 필요가 없습니다. 우리가 임의의 경계 이러한 종류의를 건너 수 있도록 우리는 별이 필요합니다 내 컴퓨터의 메모리에 이러한 두 프레임 사이에 있습니다. 그러나 마지막으로 변경하는, 당신은 이미 희미했을 수 있습니다. 다른 어떤 라인은 이제 분명 다른가요? >> [학생] & X. 그래, 25 나는 일에 변경해야하는 코드의 마지막 줄입니다. 일주일 전, 심지어 월요일에 라인 25과 같이 보니, x와 y를 교환 당신이 말하는 경우 때문에이 방금 깨 된 스왑 (X, Y) 당신은 그때는 그 일을하고있어, 교환 x와 y의 사본을 제공하는 것입니다 하지만 실제로 x와 y 자체를 변경하지 않을 거에요. 이 코드에서 앰퍼샌드와 전에 문자를 본 적이 않더라도 단지 맞춰보세요. 앰퍼샌드는 분명히 무엇입니까? [학생]의 주소​​로 이동합니다. >> 주소는 이동합니다. 따라서 앰퍼샌드 저에게 X의 주소를 제공 답니다. 그곳이 어딘지 누가 알 겠어? 그것은 123로 발생합니다. 난 상관하지 않습니다. 나 한테 X의 주소를 제공합니다. & y는 나에게 Y의 주소를 제공 의미합니다. 그리고 이야기를 그림과 완벽하게 일치 그 시점에서 우리는 잠시 전에 끌었다. 처음이 공부를 시작했을 때 나는 나에게 확실히 포인터를 인정합니다 확실히 주변에 내 마음을 포장 할 수있는 아주 힘든 일 중에 하나 있었다. 그러나, 우리가 일을 이러한 종류의와 함께 계속 연주 특히, 실현 당신은 이러한 슈퍼 간단한 정렬로 다운 어기면 지적 문제를 재미 단지 포인터와 혼란에, 주변의 답을 번호를 이동 정말이 아주 기본적인 역학에서 파생 될 수 있습니다. 여기 주소입니다. 별과 함께 이동합니다. 또는 반대로, 여기 앰퍼샌드입니다. 주소가 실제로 무슨 생각 해보세요. 괜찮아요. 어디이 메모리의 모든부터 오는 거죠? 우리는이 사진이 몇 번 그려 봤는데, 난 우리가 그에게 다시 돌아올 거라고 약속 유지 하지만 여기서 컴퓨터의 메모리의 표현입니다 그는 여기에 좀 더 라벨의 칠판보다입니다. 상단에있는 텍스트 세그먼트는 프로그램에 대하여 무엇을 제시 하는가? [안 들리게 학생 응답] >> 죄송합니다? 다시 말해. [학생] 실제 프로그램. >> 실제 프로그램. 0s 및 C 코드를 작성 후 컴파일 한 1 초 후 실행 꽝 그래서 및 최대 0s와 1S 끝을 생성하는 것은 메모리에 거기에 집어 넣하기 두 번 Mac 또는 PC에서 아이콘을 클릭 할 때 이유 또는 0s와 1S 디스크에서 해당 프롬프트에 마리오 같은 명령을 실행 컴퓨터가이를 조작 할 수 있도록 메모리에로드하기 더 신속하게 실행합니다. 따라서 초기화 데이터 및 초기화되지 않은 데이터는, 우리는 그 얘기는 거의하지 않습니다 하지만 그는 전역 변수입니다. 초기화가에 값을 준 전역 변수를 의미한다 초기화되지 않은 아직에 값을 제공하지 않은 전역 변수를 의미합니다. 그럼 난 완전히에 내 손을 흔드는 것이 환경 변수는,이 하지만이하고있는 사용자 이름과 같은 저장 일 낮은 수준의 세부 정보 및 기타 종류. 그러나 당신의 기억의 레이아웃 juiciest 조각을 스택과 힙이라는 것입니다. 다시 스택은, 분명히, 함수가 호출 될 때마다 사용되는 메모리 지역 변수가 있습니다 때마다 그리고 때마다 매개 변수는 주위가 전달되고있다. 그 모든 스택에 발생합니다. 힙 우리가 얘기를하지만, 힙을 사용하는 추측을하지 않았습니다. 메모리 만 다른 덩어리. 그것은 상단에 여기 그려 질 일이지만, 임의의 그림 대회입니다. 누가 무리가 주 동안 힙에서 메모리를 사용하고있어? 그것은 기술적으로 당신 만 간접적 있습니다. >> [학생] GetString. GetString 및 malloc. 자, 이제 근본적인 차이가 있습니다. 당신이 메모리를 필요로하면, 그냥 변수를 선언하는 지난 몇 주 동안 알아. 당신은 메모리를 많이해야하는 경우, 오른쪽 안쪽 함수의 배열을 선언합니다. 당신은 로컬 내부 함수의 변수를 선언하면 우리가 직면 보관 한 문제입니다 즉시 함수의 리턴으로, 어떻게 메모리와 그 변수에 어떻게됩니까? 그 뿐이에요는 당신이 더 이상없는거야? 그냥 개념적으로 정렬 사라집니다. 그것은 분명, 물리적으로 아직도하지만 더 이상 사용할 수있는 권리가 없습니다. 당신이 인생에서 기능을 작성하려는 경우 이건 분명히 문제가됩니다 실제로 메모리를 할당하고 즉시 돌아주지 않는. 점에서 사례 : 삶의 GetString의 목적은 사전에 아무 생각이없는 것입니다 어떻게이 키보드에 입력하는거야 문자열의 큰 그러나 그 데이비드 나 인사를 잡아 메모리를 할당 할 수있어 사용자가 들어 입력 한 수도 또는 전체 에세이 그럼 GetString는 malloc을 사용하고 있습니다. Malloc 따라서이 아닌 스택을 사용합니다; 대신에 힙 불리는이 물건을 이용하고 있어요. 메모리에 대한 서로 다른 아무 것도 없습니다. 그것은 빠르게 또는 느리게하거나 그런 건 없습니다. 이 다른 위치에 단지 물리적으로입니다. 그러나 규칙은 그 힙에 할당되어있는 메모리 당신이 연락 할 때까지 널 떠난다되지 않습니다 - 맞춰보세요 - 무료입니다. 대조적으로, 모든 메모리는 당신이 배열을 선언하여 스택에 요청 또는 우리가 주 동안 일을 한 것 같은 변수를 선언, 그건 기본적으로 스택에 끝납니다. 그게 그 rarer의 경우에 시간이 큰 90 %를 작동하지만, 당신은 메모리를 할당하고 주위에 유지하려는 다음은 malloc 같은 함수를 사용해야합니다. 아니면, 우리가 결과적으로 malloc을 사용하여 GetString 같은 기능을 사용했습니다. 이 파괴 한 후 빙키에서 들여다 봐도 어디 있는지 봅시다. 앞으로 그에게 돌아올 거예요. 다음은 첫 2 라인에 무엇을 수행하는 슈퍼 간단한 프로그램입니다? 영어로, 코드의 이러한 첫 2 줄 안에 주요 무슨 말을해야하나요? [안 들리게 학생 응답] 조심하세요. 그것은 나에게 X 또는 Y의 주소를 제공하지 않습니다. [학생] ints에 포인터를 부여합니다. >> 좋아. 정수 나에게 두 포인터를 제공합니다. 즉, 저에게 오늘 그림을 보관하는 메모리의 2 덩어리를 제공 할지라도 사각형으로, 지금 삭제. 나에게 메모리의 2 덩어리를달라고, 하나는 X라고, 하나는 Y라는 - 이전 그들을 s와 t라고 - 메모리의 청크의 종류는 무엇인가? 이 주소를 저장하는거야. 이 유형 INT의 *의입니다. 따라서 정수의 주소는 결국 X에서 살 것이다 정수의 주소 결국, Y에 살 것이다 하지만 처음에, x와 y의 내부 뭐죠? 누가 알 겠어? 쓰레기 값. 이 포인터와는 아무 상관이 없습니다. 우리는 거기에 실제로 무엇이 있는지 알고 뭔가를 넣어하지 않은 경우? 이제 X. 무슨 일이됩니까? x는 포인터이기 때문에 지금은 합법적입니다. 이 정수 *입니다. 그래서 X에서 메모리의 일부 청크의 주소를 넣을 수 있습니다 의미한다. malloc은 무엇을 반환합니까? 완벽한는, 주소를 반환 메모리의 전체 덩어리의 첫 번째 바이트의 주소. 이 무리가 어플라이언스에, 예를 들어, 얼마나 많은 바이트를 할당입니까? 정수의 크기는 무엇입니까? 4. 당신은 주 1 다시 생각한다면, 그것은 항상 기억하는 것이 중요 슈퍼 아닙니다 하지만이 경우는, 4 바이트를 아는 것은 중요한 일이다. 그래서이 힙 4 바이트에 할당되어 있습니다 그리고 임의로 나에게 첫 번째의 주소를 반환있어. 지금, x는 뭐하는 거지? A * X = 42이 뭐하는거야? 우리는 쓰레기 값과 같은 X를,이 이야기의이 시점에서하는 경우 이 지금은 라인 3에서 I는 4 바이트를 할당, 이제 어떤 쓰레기 값이 Y입니다. 이 사진은 본질적으로이 것 같습니다. 이 임의의 주소 123 인 경우 또는 더 구체적으로, 이곳은 우리의 이야기가 현재의 모습입니다. * X = 42 지금 무슨 뜻 이죠? 주소 (123)로 이동하여 수 거기에 42 넣어 의미한다. 우리가 문자열을 다하고 않아서이 라인을 그릴 필요가 없습니다. 난 그냥 이렇게 서면, 그리고 데모의 위해어야 정수 가지로 42, 4 바이트를 공간을 많이 차지합니다. 수 있도록 거기에 무슨 일이 일어 났는지 만, 문제가 지금 거기입니다. * y는 = 13. 무슨 일이 일어날거야? 문제는 우리의 단순화 된 세계에서 * Y 것은 단지 Y의 주소로 이동을 의미합니다. Y에 무엇입니까? 그것은 어떤 쓰레기 값입니다. 그럼 쓰레기 값이, 그런 미친 짓 5,551,212 것을의는 가정을 해. * Y 수단은 5,551,212를 해결하기 위해 이동합니다. 그래서 여기 똑같아. 그것은 예를 들어, 존재하지 않습니다. 따라서 * y는 제가 여기에 13을 끌기 위해 노력하고있어 13 의미를 얻을 수 있습니다. 그것은 존재하지 않습니다. 나는 칠판의 세그먼트를 초과했습니다. 무엇을 어떻게해야합니까? 제가 메모리에 넣어하려고하기 때문 암호화 된 메시지 분류 오류 존재하지 않는 장소에서 13과 같은 값입니다. 프로그램의 나머지 부분은하지 않는 그 시점까지 좋아,하지만 할 일이 있습니다. 그럼이 이야기를 봅시다. 우리는 우리가 마법에 대해 이야기 한 후에 다시 올게요. 의이로 돌아가서 빙키라고이 일을 함께 체결하자, 어느 리콜, claymation 놀고 집에 앉아있는 스탠포드 교수 정확히 같은 프로그램의 이야기를합니다. 이건 그냥 길이 약 3 분입니다. 여기 빙키 있습니다. [비디오에 남자 스피커 안녕 빙키, 일어나. 이 포인터 즐거운 시간입니다. [빙키] 그게 뭔데? 포인터에 대해 자세히 알아보십시오? 아, 케이크! [남성 연사는 자, 시작하려면, 우리가 몇 포인터를해야 할 것 같아요. [빙키] 좋아. 이 코드는 정수를 가리 킵니다 수있는 2 개의 포인터를 할당합니다. [남성 스피커] 좋아요. 글쎄, 난 2 포인터를 참조하십시오,하지만 그들은 아무 가리키는되지 않는 것 같습니다. [빙키] 그래, 맞아. 처음에는 포인터가 가리키는되지 않습니다. 그들은 가리 일이 pointees라고하고이를 설정하면 최대 별도의 단계입니다 수 있습니다. [남성 스피커] 아, 맞아, 맞아. 나는 그렇게 알고 있었다. pointees은 별도입니다. 음, 그럼 당신은 pointee를 할당합니까? [빙키] 좋아. 이 코드는 새로운 정수 pointee을 할당하고,이 부분은 X가 가리 키도록 설정합니다. [남성 스피커] 이봐, 더 나은 보입니다. 그럼 뭔가를합니다. >> [빙키] 좋아요. 나는 역 참조 포인터 x를 그 pointee에 42 번을 저장하기드립니다. 이 마술은 내가 dereferencing의 마법 지팡이가 필요합니다. [남성 스피커] dereferencing의 마법 지팡이? 잘 됐네요. [빙키]이 코드가 어떻게 생겼는지입니다. 난 그냥 번호를 설정하고거야 ... [소리 터지는] 찾아 [남성 스피커] 이봐 요, 거기가갑니다. 따라서 X에서 역 참조하고하면 화살표가 pointee에 액세스 할 다음 이 경우에는 거기에 42를 저장합니다. 이봐 요, 다른 포인터, Y를 통해 숫자 13를 저장하는 데 사용하십시오. [빙키] 좋아. 난 그냥 Y를 여기서 가서 번호 13을 준비시킬 게요 그리고 단지 dereferencing 및 지팡이를 ... [윙윙 거리는 소리]와! [남성 스피커] 안녕 아, 작동하지 않습니다. 빙키, 말, 나는 y를 dereferencing하는 것은 좋은 생각이 아닌 것 같아 pointee를 설정하면 별도의 단계이기 때문에 그리고 우리가 그런 짓을 저질렀다고 생각하지 않습니다. [빙키] 음, 좋은 지적이야. [남성 스피커] 그래. 우리는 포인터 y를 할당하지만 우리는 pointee을 가리 키도록을 설정하지 않습니다. [빙키 흠, 아주 예민. [남성 스피커] 이봐 요, 당신은 빙키, 거기에 좋은 찾고 있습니다. 그렇게 문제를 해결할 수있는 X와 같은 pointee에 Y 점?주세요 >> [빙키] 그래. 나는 포인터 할당을 내 마술 지팡이를 사용합니다. [남성 스피커]는 전에 같은 문제가 생길인가요? [빙키] 아니,이 pointees을 터치하지 않습니다. 단지 다른과 같은 가리 한 포인터를 변경합니다. [소리 터지는] [남성 스피커] 오, 알 겠어요. X 같은 곳으로 지금은 Y를 가리 킵니다. 그럼 기다립니다. 지금 y는 고정됩니다. 이 pointee 있습니다. 그래서 당신은 13 이상을 보내 다시 dereferencing의 지팡이를 시도 할 수 있습니다. [빙키] 어, 알았어. 여기에 표시됩니다. [소리 터지는] [남성 스피커] 저기 좀 봐요. 지금 Y의 작품을 dereferencing. 포인터가 그거 pointee을 공유하기 때문에, 그들은 모두 13을 참조하십시오. [빙키] 네, 공유. 뭐든간에. 이제 우리 곳을 전환하는거야? [남성 스피커] 오, 전 우리 시간이 없어. >> [빙키]하지만 - [남성 스피커] 3 포인터 규칙을 명심 해. 번호 1, 기본 구조는 포인터를 가지고이며 pointee로 가리 킵니다. 그러나 포인터 pointee는 별도이며, 일반적인 오류는 포인터를 설정하는 것입니다 하지만 그것을 pointee를 제공​​하는 것을 잊지 수 있습니다. 번호 2, 포인터 dereferencing는 포인터에서 시작을 통해 그 화살표를 따라 그 pointee에 액세스 할 수 있습니다. 우리 모두가 아시다시피 pointee가있는 경우,이 만 작동 어떤 가지가 숫자 1를 지배 다시 가져옵니다. 번호 3 포인터 할당 한 포인터를 소요하고 변경 다른 포인터와 같은 pointee로 연결합니다. 그래서 할당 후 2 포인터는 같은 pointee를 가리 킵니다. 때로는 공유가 이름이야. 그리고 정말 모든 작업이 있습니다. 이제 안녕. 이 빙키입니다. 이 CS50입니다. 우리는 다음 주에 볼 수 있습니다. [박수] [CS50.TV]