[Powered by Google Translate] [제 4 - 더 편안한] [롭 보덴 - 하버드 대학교 (Harvard University)] [이 CS50입니다. - CS50.TV] 너희가 알지 못 경우에 우리는 퀴즈 내일을 갖추고 있습니다. 당신이 수업 시간에 본거나 수업 시간에 본 것 모두에 기본적으로 있습니다. 그게 그들이 아주 최근의 주제에 있는데도 포인터가 포함되어 있습니다. 당신이 적어도 그 중 높은 수준을 이해해야합니다. 당신이 퀴즈에 대해 이해하고 있어야합니다 수업 시간에 늦었습니다 아무거나. 당신이 그들에 대한 질문이있는 경우 그래서, 지금을 요청할 수 있습니다. 너희들이 질문을하지만 어디이, 학생 주도의 매우 세션이 될 것입니다 그래서 잘하면 사람들은 질문이 있습니다. 사람이 질문이 있습니까? 예. >> [학생]는 포인터를 통해 다시 갈 수 있나요? 나는 포인터를 통해 갈거야. 귀하의 모든 변수는 반드시 메모리에 살고 하지만 보통은 걱정하지 않습니다 그리고 당신은 X + 2와 y + 3 말 그리고 컴파일러는 것을 당신을 위해 살고있는 곳을 알아내는 것입니다. 일단 지금은 명시 적으로 해당 메모리 주소를 사용하고, 포인터를 다루고 있습니다. 따라서 하나의 변수는 과거의 어떤 주어진 시간에 하나의 주소에 살 것이다. 우리가 포인터를 선언하려면, 어떤 유형처럼 보이도록 무슨 일이야? 나는 포인터 p를 선언하고 싶습니다. 유형 어떻게 생겼는데? [학생] INT * P. >> 그래. 따라서 정수 * P. 그리고 어떻게 그것이 X로 연결하려면 어떻게해야합니까? >> [학생] 앰퍼샌드. [보덴] 지금 앰퍼샌드는 그대로 연산자의 주소라고합니다. 그래서 내가 말 & 때 x는 그 변수 x의 메모리 주소를지고있어. 그래서 지금은 포인터 P를 가지고 있고, 어디서든 내 코드에서 나는 * P를 사용할 수 있습니다 아니면 X를 사용할 수 있으며 동일한 일이 될 것입니다. (* P)​​. 이것은 무엇을하는거야? 그 별은 무엇을 의미합니까? [학생]이 그 시점에서의 값을 의미합니다. >> 그래. 우리가 보면 그래서, 다이어그램을 그리는 것은 매우 유용 할 수 있습니다 이 값을 4 가지고 있었던 X 용 메모리의 작은 상자,입니다 그러면 우리는, P에 대한 메모리의 작은 상자가 그래서 X에 P 점은, 우리는 P에서 x로 화살표를 그립니다. 그래서 우리가 말을 할 때 * P 우리는 P입니다 상자로 이동 말이야. 스타는 화살표를 따라하고 다음 바로 그 상자 원하는 건 뭐든지. 그래서 * P = 7 말할 수있는, 그리고 그 x와 그 7 변화의 상자로 이동합니다. 아니면 내가 말할 수 정수 Z = * P * 2, 혼란 그건 별, 스타 때문입니다. 한 별이 P를 dereferencing되어, 다른 스타 2로 곱한 수 있습니다. 난 그냥뿐만 아니라 X와 *의 P를 교체 할 수 확인할 수 있습니다. 당신은 같은 방법으로 사용할 수 있습니다. 그리고 나중에에 완전히 새로운 이야기로 P 지점을 가질 수 있습니다. 난 그냥 말할 수있는 P = &z; 이제 X를 더 이상 포인트를 주실없고, 그 z로 가리 킵니다. 그리고 * p를 수행하는 시간은 z를하고 같은입니다. 우리가 함수로 받고 시작하면 그래서이에 대한 유용한입니다. 그것은 뭔가 그 점 포인터를 선언하는 쓸모의 일종 이죠 그리고 당신은 그걸 그냥 dereferencing하는 당신은 처음부터 원래 변수를 사용하여이 있었을 때. 하지만 당신이 함수로 때 - 자, 우리가 어떤 기능 INT foo는이 말을 듣지 그 포인터를 소요 단 * P에게 = 6을 수행; 우리가 스왑과 전에 본과 마찬가지로, 당신은 효과적으로 스왑, 별도의 기능을 할 수 없어 C의 모든은 항상 값으로 전달되기 때문에 단지 정수를 전달하여. 이 포인터를 전달하는 경우에도이 값에 의해 전달하고 있습니다. 그건 아주 해당 값이 메모리 주소임을 발생합니다. 그래서 언제 내가 말할 foo는 (P), I는 함수 foo는에 포인터를 지나고 있는데 그리고 foo는 * P = 6을 다하고 있습니다; 내부의 그 기능이 너무, * P는 아직 X와 동일합니다 그렇게 함수 내에서 범위를 지정하지 않기하지만 그 함수의 내부에 x를 사용할 수 없습니다. 따라서 * P = 6는 내가 다른 함수에서 로컬 변수를 액세스 할 수있는 유일한 방법입니다. 또는, 음, 포인터는 내가 다른 함수에서 로컬 변수를 액세스 할 수있는 유일한 방법입니다. [학생] 가자 당신은 포인터를 반환하고 싶어 말한다. 어떻게 그걸 하죠? [보덴]는 정수 y를 = 3 같은 같이 포인터를 반환, 반품 및 Y? >> [학생] 그래. [보덴] 좋아. 당신은이 작업을 수행하지 않습니다. 이 나쁜 것입니다. 내가이 강의 슬라이드에서 본 것 같아 당신은 메모리의 전체 그림을보고 시작 곳에서 당신은 여기 메모리 주소 0 명있어 아래로 당신은 여기 32의 메모리 주소 4 기가 또는 2가 있습니다. 그럼 당신은 어떤 짐이 좀 있어서요 그리고 당신은 당신의 스택이 당신은 당신이 방금 성장에 대해 공부를 시작하여 힙을,있어. [학생]는 스택 위의 힙 아닌가? 그래. 힙은 상단에, 안 그래? >> [학생] 글쎄, 그가 정상에 0을 넣어. [학생] 오, 그 위에 0을 넣어. >> [학생] 아, 그래요. 면책 조항 : 아무 데나 CS50으로 당신이 이런 식으로 만날 수있을 거예요. >> [학생] 좋아요. 그건 단지 먼저, 스택을 표시 할 때 당신은 서로의 위에 물건을 쌓아 생각 스택을 생각하면 좋아요. 그래서 우리는 스택 스택은 평소처럼 성장 될 수 있도록 주위에 뒤집기를하는 경향이 대신 스택의 무기력. >> [학생]지라도 힙이 기술적으로도 성장하나요? 그것은 성장에 의해 당신이 무슨 말을하는지에 따라 달라집니다. 스택과 힙은 항상 반대 방향으로 성장합니다. 스택은 항상 성장한다는 의미에서 성장 높은 메모리 주소 및 힙은 아래 성장을 향해 점에서 낮은 메모리 주소를 향해 성장하고있어. 그래서 상단은 0이며, 하단은 높은 메모리 주소입니다. 그들은 단지 방향을 반대에서 성장하고있어 두. [학생]는 당신이 바닥에 스택을 넣어 말 때문에 난 그냥 그렇게 의미 그것은 스택에 대한 힙의 상단에 시작하기 때문에보다 직관적 인 것, 때문에 힙이 너무 자체의 상단에 있으므로 렸는데이야 - >> 그래. 당신은 또한 스택 이상도 성장하고 더 큰로 힙 생각하지만. 따라서 스택은 우리가 가지 성장 표시 할 것입니다. 그러나 사방이 달리 보이는이 상단에 주소 0을 표시 할 것이다 그리고 하단에 가장 높은 메모리 주소는,이 메모리의 일반적인 전망이다. 당신은 질문이 있습니까? [학생]는 당신이 우리에게 힙에 대해 좀 더 자세히 설명해 주실 수 있습니까? 그래. 나는 두 번째에 해당로 연결됩니다. 첫째, & y를 반환 이유로 돌아 가면 나쁜 짓이야, 스택에 당신은 모든 기능을 나타내는 스택 프레임의 무리가 어느가 호출되었습니다. 이전 일을 무시 그래서, 당신 스택의 최상위 (top)는 항상 main () 함수가 될거야 그 호출되고있어 첫 번째 기능입니다 때문입니다. 그리고 나서 다른 함수를 호출 할 때 스택은 아래로 성장할 것이다. 좀 기능, 푸 전화하고 자신의 스택 프레임을 도착하면, 그 일부 기능 바를 호출 할 수 있습니다, 그것은 자신의 스택 프레임을 가져옵니다. 그리고 바 재귀있을 수 있으며 그 자체를 호출 할 수 그리고 바의 두번째 호출은 자체 스택 프레임을 얻을 수 있다는. 그리고 이러한 스택 프레임에 무슨 일이 있었는지는 지역 변수 모두 그 함수의 인자의 모든 - 이 기능에 로컬로 범위를 지정하는 모든 일이 스택 프레임에서 이동합니다. 그래서 내가 바 같은 것이 기능입니다 말했을 때 의미 난 그냥 정수를 선언하고 해당 정수에 대한 포인터를 반환거야. 그럼 y는 어디 살아? [학생] y는 바에서 살고있다. >> [보덴] 그래. 어딘가 메모리의 작은 광장에서에서 Y가 littler 광장입니다. 내가 돌아올 & Y 때, 메모리의이 작은 블록에 대한 포인터를 반환거야. 하지만 때 함수가 반환, 그 스택 프레임은 스택을 쐈됩니다. 이 스택이라는 이유입니다. 당신은 그게 뭔지 알고있는 경우는, 스택 데이터 구조 같은거야. 또는 트레이 스택처럼, 항상 예입니다 메인은 ​​하단에 갈 것입니다, 다음 전화를 첫 번째 기능은, 그 꼭대기에 갈까요 당신이 전화 된 모든 함수에서 돌아올 때까지 당신은 주로 돌아갈 수도 없어 그는 그것의 상단에 배치되어 있습니다. 당신이 그랬다면 [학생] 지금 & Y, 그 가치는 사전 통보없이 변경 될 수 있습니다를 반환합니다. 예, 괘 - >> 그것은 덮어 될 수 [학생]. >> 그래. 당신이 시도 할 경우와 - 그건 완전히이에요 - 그 포인터를 반환하기 때문에이 또한 정수 * 바 것 그래서 그 반환 유형은 정수 *입니다. 이 함수의 반환 값을 사용하려고하면 정의되지 않은 행동입니다 그 포인터가 나쁜 기억을 지적 때문이다. >> [학생] 좋아요. 그래서 경우, 예를 들어, 선언 INT * Y = malloc (sizeof (int는))? 이게 더 낫다. 예. [학생] 우리는 휴지통으로 물건을 드래그 할 때 우리는하는 방법에 대해 이야기 그들은 실제로 삭제하지, 우리는 자신의 포인터를 잃게됩니다. 따라서이 경우에는 우리는 실제로 메모리에 여전히 값을 삭제하거나이 어떻게해야합니까? 대부분의 경우, 그것은 여전히​​거야. 하지만 그건 우리가 다른 기능 Baz도 전화를 어떻게 말한다. Baz도 여기에 자신의 스택 프레임을 얻을 수 있습니다. 그것은이 물건을 모두 덮어 쓰기 할거야 그리고 나중에, 이전에 가지고있는 포인터를 시도하고 사용하는 경우 이 같은 값 않을거야. 당신이 함수 Baz도라고하기 때문에 단지 변경거야. [학생] 그러나 우리는, 우리는 여전히 3 얻을 수 없겠죠 했을까? [보덴] 십중팔구, 당신은 겠지. 하지만 당신은에 의존 수 없습니다. C는 정의되지 않은 행동을 말합니다. [학생] 아, 그건 않습니다. 좋아요. malloc를 사용 유래 그래서 당신은 포인터를 반환 할 때이입니다. 난 사실드립니다 만 malloc을 반환 (3 * sizeof (int는)). 두번째로 우리는 더 많은 malloc으로 갈거야,하지만 malloc의 아이디어는 지역 변수의 모든 항상 스택에 이동합니다. malloced 아무는 힙에 간다, 그리고 영원히 항상 힙 될 것입니다 당신은 명시 적으로 해방 때까지. 그래서이 때 malloc 무언가를,이 함수를 반환 한 후 살아남을거야 것을 의미합니다. 프로그램이 실행을 중지 한 후 [학생]은 생존됩니까? >> 번호 좋아 그럼 그 프로그램이 모든 방법은 실행이 끝날 때까지있을거야. >> 예. 우리는 프로그램이 실행을 중지하면 어떻게됩니까 일의 세부 사항을 갈 수 있습니다. 당신은 날 기억해야 할 수도 있습니다,하지만 그건 완전히 별도의 문제입니다. [학생] 지금 malloc은 포인터를 만들어? >> 그래. Malloc - >> [학생] 내가 malloc는 포인터가 사용할 수있는 메모리의 블록을 지정합니다 생각합니다. [보덴]는 다시 그 다이어그램을 싶습니다. >> [학생] 그럼이 함수는하지만, 작품? [학생] 네, malloc 당신이 사용할 수있는 메모리 블록을 지정, 다음은 메모리의 첫 번째 블록의 주소를 반환합니다. [보덴] 그래. 그래서 언제이 malloc, 당신은 메모리의 일부 블록이 있대 그 힙 현재입니다. 힙이 너무 작은 경우, 힙은 증가 할 것이다 있으며,이 방향으로 자랍니다. 그러니 힙이 너무 작은한다고 가정 해 봅시다. 그럼 조금 성장하고 단지 성장이 블록에 대한 포인터를 반환 할 참이야. 당신이 무료로 콘텐츠, 당신은 힙에 더 많은 공간을 때, 그럼 나중에 malloc에​​ 전화하면 이전에 해제했던 그 메모리를 재사용 할 수 있습니다. malloc과 무료에 대한 중요한 점은 당신에게 완벽하게 제어 할 수 있다는 것입니다 이러한 메모리 블록의 수명 이상. 전역 변수는 항상 살아 있습니다. 지역 변수는 범위 내에 살아 있습니다. 가능한 빨리 곱슬 괄호를지나 이동으로 지역 변수는 죽었어요. 당신이 살아 할 때 Malloced 메모리 살아 당신이 발표 될 할 이야기를하고 출시하고 있습니다. 그 정말 실제로 메모리의 불과 3 종류입니다. 스택이 자동 메모리 관리가 있어요. 일이 자동으로 발생합니다. 당신은 INT X를 말할 때, 메모리가 정수 x는 할당됩니다. x는 범위를 나가면 메모리가 x는 복원됩니다. 그런 다음 동적 메모리 관리, malloc은 무엇일까요이있어 당신이 제어 할 수있을 때하는 것입니다. 당신은 동적으로 메모리와 할당하지 말아야 할 때를 결정합니다. 그리고 정적이, 그 아저씨가 영원히 살아 있다는 것을 의미 이는 전역 변수가 무엇인지입니다. 그들은 메모리에 항상하고 있습니다. 질문이 있으십니까? [학생] 당신은 중괄호를 사용하여 블록을 정의 할 수 있습니다 하지만이 필요하지 진술 또는 그런 식으로 잠시 문이나 어떤 경우? 당신은 함수에서 같은 블록을 정의 할 수 있지만, 너무 중괄호가 있습니다. [학생] 그래서 당신은 당신의 코드에서 중괄호 임의의 한 쌍처럼 할 수 없습니다 지역 변수이 있다는 말? >> 예, 할 수 있습니다. INT 바 내부 우리는 {int는 Y = 3;} 만들 수 있습니다. 그이 바로 여기에 있어야있어. 하지만 그건 완전히 정수 y의 범위를 정의합니다. 그 순간 곱슬 괄호 후, y는 더 이상 사용할 수 없습니다. 그래도, 그렇게하지 ​​거의 없어요. , 프로그램이 끝날 때 무슨 일이로 다시 돌아가 우리가 일을 더 쉽게하기 위해 제공하는 오해 / 이분의 일 거짓말의 종류가 있습니다. 우리는 당신을 말해 당신의 메모리를 할당 할 때 그 변수 RAM의 일부 덩어리를 할당하고 있습니다. 하지만 당신이 정말로 직접 프로그램에 어느 RAM를 건 드리면 안돼. 당신이 생각하는 경우, 어떻게 그린 - 당신은 GDB에 통과한다면 실제로, 당신은 같은 일을 볼 수 있습니다. 에 관계없이 당신이 프로그램이나 실행중인 어떤 프로그램을 실행 얼마나 많은 시간 스택은 항상 시작하는거야 - 항상 주소 oxbffff 뭔가 주위에 변수를 만나러가는 중이 야. 그것은 그 지역 어딘가에 보통입니다. 하지만 어떻게이 프로그램은 아마도 동일한 메모리에 대한 포인터를 가질 수? [학생] oxbfff가 RAM에 있어야 할 곳의 일부 임의의 지정이 그 사실은 함수가 호출되었을 때에 따라 다른 장소에있을 수 있습니다. 그래. 용어는 가상 메모리입니다. 아이디어는 모든 단일 프로세스, 컴퓨터에서 실행중인 모든 단일 프로그램입니다 자체가 - 완전히 독립적 인 주소 공간 - 가자의 32 비트를 가정합니다. 이 주소 공간입니다. 그것은 사용하기 위해 자신의 완전히 독립적 4기가바이트 있습니다. 당신은 동시에 두 프로그램을 실행하는 경우 그래서,이 프로그램은 자체에 4기가바이트를 볼 수 이 프로그램은, 자신에게 4기가바이트를 볼 수 그리고이 프로그램에 대한 역 참조에 대한 포인터 불가능 이 프로그램에서 메모리에서 소개합니다. 그리고 가상 메모리는 것은 프로세스 주소 공간에서 매핑입니다 RAM에 실제 물건 있습니다. 그래서 그걸 알고 운영 체제까지 것은, 이봐 요, 때이 남자가 dereferences 포인터 oxbfff, 그 진정한 의미를 그는 RAM 바이트 1000, 원하는 반면에이 프로그램 dereferences의 oxbfff 경우, 그는 정말 RAM 바이트 만를 원합니다. 그들은 임의로 멀리 떨어져 할 수 있습니다. 이 하나의 프로세스 주소 공간 내에서 일들도 마찬가지입니다. 그래서 어떤 그 자체로 모든 4 기가 바이트 볼 수 있지만, 말합시다 - [학생] 모든 프로세스 하나를합니까 - 자, 당신은 RAM 만 4기가바이트있는 컴퓨터가 있다고 가정 해 봅시다. 모든 단일 프로세스는 전체 4기가바이트를 참조합니까? >> 예. 하지만 그것은 보는 4기가바이트은 거짓입니다. 단지 그것이 다른 프로세스가 존재하는지하지 않기 때문에 그 모든 기억이 생각있어. 실제로 필요로하는 단지 많은 메모리를 사용합니다. 운영 체제는이 과정에 RAM을 제공 할 수 없습니다 이 파일은 전체 지역의 모든 메모리를 사용하지 이죠. 그것은 그 지역에 대한 메모리를 포기하지 않을거야. 그러나 생각은 - 내가 생각하는거야 - 나는 비유 생각 할 수 없습니다. 유추는 하드입니다. 가상 메모리의 문제 중 하나가 해결 것 중 하나 프로세스가 서로를 전혀 모르고 있어야한다는 것입니다. 그리고 당신은 어떤 프로그램을 쓸 수는 dereferences 모든 포인터를, 단, * (ox1234)라는 프로그램을 작성 좋아 그리고 그건 dereferencing 메모리 주소 1234. 그러나 다음에 어떻게 1234 수단을 번역하기 위해 운영 체제에게 달려 있습니다. 그래서, 만약 1234이 과정의 유효한 메모리 주소로 갈거야 이 스택 또는 무언가있는 것, 다음이 해당 메모리 주소의 값을 반환한다 지금까지의 과정을 알고 있습니다. 육지에서 일어나는처럼 그러나 만약 1234이 올바른 주소가 아닙니다 스택 넘어 여기를 메모리의 일부 조각과 힙 이외의 당신은 정말 segfaults 등을 그때 다음, 바로이 사용하지 않은 당신이 만지는해서는 안된다는 메모리를 만지고 때문입니다. 이것은 또한 사실입니다 - 32 비트 시스템은 32 비트는 메모리 주소를 정의하는 32 비트를 의미합니다. 또는 4 바이트 - 포인터는 8 바이트 이유 32 비트 8 바이트 때문입니다. 포인터는 4 바이트입니다. 그래서 oxbfffff 같은 포인터를 볼 때, 그입니다 - 특정 프로그램 내에서 당신은 어떤 임의의 포인터를 만들 수 있습니다 어디서든 ox0에서 소 8 f's에 - ffffffff. [학생]이 (가) 당신이 사람들이 4 바이트하다고하지 않았나요? >> 그래. [학생] 다음 각 바이트해야합니다 - >> [보덴] 16. 진수 - 5, 6, 7, 8. 포인터 그래서 항상 16 진수 만날 수있을 거예요. 우리가 포인터를 분류하는 방법 뿐이야. 진수의 모든 2 자리는 1 바이트입니다. 따라서 4 바이트 8 자리 16 진수가있을거야. 따라서 32 비트 시스템에있는 모든 싱글 포인터가 4 바이트가 될거야 어떤이 과정에서 어떤 임의의 4 바이트를 만들 수 있다는 것을 의미 그리고, 그것의 포인터를 만들 이는까지가 아는대로,이 메모리의 32 바이트에 전체 2를 해결할 수 있다는 것을 의미합니다. 정말 그에 액세스 할 수 없습니다하더라도하면, 컴퓨터 만 512메가바이트이​​있는 경우에도, 그것은 그렇게 많은 메모리를 가지고 생각한다. 그리고 운영 체제는 실제로 필요한 할당 될만큼 지능적입니다. 4 기가 : 단지, 오, 새로운 프로세스를 이동하지 않습니다. 그래. >> [학생] 소는 무엇을 의미합니까? 왜 당신은 그걸 작성하려면 어떻게해야합니까? 그냥 16 진수의 상징입니다. 당신은 소와 숫자 시작을 볼 때, 연속 일 16 진수입니다. [학생] 당신은 프로그램이 끝날 때 무슨 일에 대해 설명했다. >> 예. 어떤 프로그램이 끝날 때 발생하면 운영 체제입니다 그냥 지우가이 주소에 있고, 그것 뿐이야 매핑합니다. 운영 체제는 이제 막 사용하는 다른 프로그램이 메모리를 제공 할 수 있습니다. [학생] 좋아. 그래서 당신은 힙 또는 스택 또는 전역 변수 또는 뭔가에 무언가를 할당 할 때 모두 자마자 프로그램이 종료로 사라 운영 시스템이 다른 프로세스에 해당 메모리를 줄 무료이기 때문이다. [학생]로 작성된 값은 여전히​​있을 거예요도? >> 그래. 값은 여전히​​ 가능성이 있습니다. 단지는 그들을 얻을 힘들 것 같아. 그 삭제 된 파일에 얻을 것보다 그것은 그들을 얻을 훨씬 더 어렵습니다 의 삭제 된 파일 종류 오랫동안 앉아서 하드 드라이브는 많은 큰 때문입니다. 그래서 메모리의 다른 부분을 덮어거야 그렇게 파일에있을하는 데 사용되는 메모리의 덩어리를 덮어 발생하기 전에. 그러나 메인 메모리, 더 빠른 많은을 통해 당신은 사이클 RAM, 그래서 매우 빠르게 덮어거야. 이 또는 다른 어떤 것도 질문이 있으십니까? [학생] 내가 다른 주제에 대한 질문이 있습니다. 좋아요 >>. 사람이에 대해 질문이 있습니까? 좋아요. 다른 항목을 참조하십시오. >> [학생] 좋아요. 나는 연습 시험의 일부를가는 그 중 하나는 sizeof에 대해 얘기하고 있었어요 그리고 값을 그 반환 또는 다른 변수 유형 것으로. >> 예. 그리고 정수 및 긴 모두 반환 네 모두, 그래서 그들은 모두 4 바이트 길이 있다고 말했다. 정수와 긴 사이에 차이가, 또는 같은 일입니까? 예, 차이가 있습니다. C 표준 - 아마 엉망까지 갈거야. C 표준은 C는 C.의 공식 문서입니다 맘에 수 있습니다 이렇게 말씀입니다. 그래서 C 표준은 숯불 영원히 항상 1 바이트가 될 것이라고 말했다. 그 후 모든 - 짧은이 항상보다 크거나 문자와 동일한 것으로 정의됩니다. 이 엄격히보다 더 있지만, 긍정적하지 수 있습니다. INT는 단지보다 크거나 짧은 동일하다고 정의됩니다. 그리고 긴 단보다 크거나 INT와 동일한 것으로 정의됩니다. 그리고 긴 긴은 이상 긴 같습니다. 따라서 C 표준 정의 유일한 모든의 상대적 순서입니다. 일이 소요될하는 메모리의 실제 금액은 최대 구현에 일반적으로 하지만 꽤 잘이 시점에서 정의있어. >> [학생] 좋아요. 그럼 반바지는 거의 항상 2 바이트가 될 것이다. Ints은 거의 항상 4 바이트가 될 것이다. 긴 longs는 거의 항상 8 바이트가 될 것이다. 그리고 당신이 32 비트 또는 64 비트 시스템을 사용하는지 여부에 따라 다릅니다, longs. 그래서 긴 시스템의 유형에 해당하는 것입니다. 이 어플라이언스와 같은 32 비트 시스템을 사용하는 경우는 4 바이트거야. 당신은 최근 컴퓨터의 많은 같은 64 비트를 사용하는 경우는 8 바이트거야. Ints는 거의 항상이 시점에서 4 바이트입니다. 긴 longs는 거의 항상 8 바이트입니다. 과거에는 ints는 2 바이트로 사용됩니다. 그러나이 완전히보다 크고 같 이러한 관계를 모두 만족 확인합니다. 너무 오랫동안 완벽하게 정수와 같은 크기로 허용하는 것은, 하고도 긴 긴와 같은 크기가 될 수있어. 그리고 그냥 시스템의 99.999 %에 그와 동등해질 거에요 저건 무슨 일이 정수 또는 긴 긴 하나. 단지 32 비트 또는 64 비트에 따라 달라집니다. >> [학생] 좋아요. 수레에서 비트의 관점에서 지정한 소수점은 어때요? 바이너리로 쓰시 려고요? >> 그래. 당신은 CS50 그 방법을 알 필요가 없습니다. 당신은 61에있는 내용을하지 않습니다. 귀하는 과정에서 정말로 배울하지 않습니다. 단지 표현입니다. 나는 정확한 비트 할당 받죠 잊어 버려. 부동 소수점의 아이디어는 표시하는 비트의 특정 번호를 할당 있다는 것입니다 - 기본적으로, 모든 과학적 표기법입니다. 그럼 당신은 1.2345과 같은 숫자 자체를 나타내는 비트의 특정 번호를 할당합니다. 나는 5 이상 자리로 수를 나타냅니다 않을 수 있습니다. 이 같은 경향이 있도록 그리고 당신은 또한 비트 특정 번호를 할당 그게 당신이 할 수 가장 큰 지수처럼 만, 특정 번호에 올라가 수 그리고 당신은, 특정 지수에 가도 되요 당신이 할 수있는 가장 작은 지수 야 좋아요. 나는 정확한 방법 비트가 이러한 모든 값에 할당 기억이 안나요 하지만 비트의 특정 번호가 1.2345 위해 최선을 다하고 있습니다 비트의 또 다른 특정 번호가 지수 위해 최선을 다하고 있습니다 그리고 특정 크기의 지수를 나타냅니다 만 가능합니다. [학생] 그리고 두 번? 그 여분의 긴 부동처럼입니까? >> 그래. 지금은 대신 4 바이트의 8 바이트를 사용하고 제외 부동과 같은 일이야. 이제, 9 자리 또는 10 자리 숫자를 사용할 수 있습니다 이 300 대신 100까지 갈 수있을 것입니다. >> [학생] 좋아요. 그리고 수레는 4 바이트입니다. >> 예. 음, 다시, 아마, 일반 구현에 전체 따라 달라집니다 하지만 수레는 4 바이트이며, 더 블룸은 8입니다. 그들은 두 수레의 크기이기 때문에 더블이 더블이라고합니다. [학생] 좋아. 그리고 더블 배가거야? >>가 없습니다. 내 생각 엔 - 긴 longs처럼 >> [학생]? >> 그래. 그렇게 생각하지 않아요. 예. 작년 시험에서 [학생] main () 함수에 대한 질문이있었습니다 프로그램의 일부가 될 필요. 답은 여러분의 프로그램의 일부가 될 필요가 없습니다 것이 었습니다. 어떤 상황에서? 그게 내가 본 것이죠. [보덴] 그것은 보인다 - >> [학생] 어떤 상황? 당신은 문제가 있습니까? >> [학생] 그래, 나도 확실히 끌어 수 있습니다. 그것은 기술적으로 할 필요는 없지만, 기본적으로는거야. [학생] 난 다른 년에 하나를 보았다. 그것은 참 또는 거짓 같았어요 : A 유효 기간 - >> 아, C 파일입니다.? . [학생] 모든 C 파일이 있어야합니다 - 한 번에 두 권 - 불륜의 현장을! 좋아요. 그래서 별도의입니다. . C 파일은 기능을 포함해야합니다. 당신은 기계 코드로 파일, 이진, 뭐든지을 컴파일 할 수 없이 아직 실행된다. 유효한 실행 파일은 main () 함수가 있어야합니다. 당신은 100 1 개의 파일에있는 함수를 있지만 기본을 작성할 수 있습니다 그리고, 이진로 내려 컴파일 다음은 주요가 다른 파일을 작성하지만이 기능의 무리 호출 여기이 이진 파일 인치 그리고 당신은 실행을 할 때, 그날은 링커가 무슨 상관이야 그것은이 두 이진 파일 실행에 조화를 이루고 있습니다. 그럼. C 파일은 전혀 main () 함수가 필요하지 않습니다. 그리고 큰 코드베이스에이. C 파일 1 주 파일의 수천을 확인할 수 있습니다. 더 질문? [학생] 또 다른 질문이 발생했습니다. 이 확인은 컴파일러라고 말했다. 참 또는 거짓? 그리고 답은 거짓이었고, 그 꽝이 아니야 왜 이해. 하지만 우리는 사실이 아니라면 확인 뭐라고 부릅니까? 확인은 기본적으로 것입니다 - 난이 전화를 정확히 확인할 수 있습니다. 하지만 그냥 명령을 실행합니다. 합니다. 나는이 일을 당겨 수 있습니다. 그래. 오, 그래. 확인은 또한을 수행합니다. 이것은 제조업체 유틸리티의 목적은 자동으로 결정하는 것입니다라고 큰 프로그램의 조각은 다시 컴파일 할 필요가있는 그리고 그것들을 다시 컴파일하는 명령을 발행. 당신은 절대적으로 큰 않은 파일을 만들 수 있습니다. 확인은 우리가 전에 말했듯이, 파일의 시간 스탬프에보고 당신은 개별 파일을 컴파일 할 수 있습니다, 그리고 링커에 도착 할 때까지 그렇지 않아 그들은 실행에 조립하고 있는지. 당신은 10 다른 파일을 가지고 있고, 그들 중 하나를 변경한다면 그리고 어떤 제조업체가하려는 것은 단지 재 컴파일입니다 파일 1 그리고 함께 모든 relink. 그러나 그것보다 더 멍청한입니다. 완전히 그 얘기가 할 일이 있다는 정의의 몫입니다. 그것은 기본적으로이 타임 스탬프 물건을 인식 할 수있는 능력을 가지고 하지만 당신은 아무것도 할 제조업체 파일을 쓸 수 있습니다. 당신은 쓸 수있는 파일을 만들 때문에 당신이 그냥 CD를 다른 디렉토리에 만들어 입력 할 때.에게 나는 좌절하게 만들었 어 I 뾰족한 모든 내 어플라이언스의 내부 때문에 그럼 내가 Mac에서 PDF를 볼 수 있습니다. 그래서 파인더로 가서 내가 이동 할 수 Server에 연결 내가 연결 서버 내 어플라이언스이며, 그런 다음 PDF를 엽니 다 그는 LaTeX에 의해 컴파일됩니다. 그러나 내가 좌절하게 만들었 어 제가 PDF를 새로 고치는 데 필요한 매번 때문에, 나는 액세스 할 수있는 특정 디렉토리에 복사했다 그리고 짜증나는 점점되었다. 대신에 당신이이 일을하게하는 방법을 정의해야 제조업체 파일을 썼다. 귀하가 만드는 방법이 PDF LaTeX이 있습니다. 그냥 다른 제조업체 파일과 같은 - 또는 당신이 제조업체 파일을 보지 못했다 것, 하지만 우리는 어플라이언스에 불과라는 글로벌 제조업체 파일이 당신은 C 파일을 컴파일하는 경우, 꽝을 사용합니다. 그리고 여기 내 제조업체 파일에서 내가 말을 만드는 것이, 이 파일은 PDF LaTeX이 컴파일하려는거야. 그리고 이제 컴파일을하고 PDF LaTeX이 있습니다. 확인이 컴파일되지 않습니다. 그것은 내가 지정한 순서대로 이들 명령을 실행있어. 그래서이 PDF의 LaTeX이를 운영하고, 이건 제가 일이 잘 복사 할 디렉토리로 복사 이 CD의 디렉토리와 다른 일들을, 하지만, 그런 일이 모든 때, 파일 변경 사항을 인식하고 있습니다 가 변경되면, 그것은 실행해야하는 명령을 실행합니다 때 파일 변경됩니다. >> [학생] 좋아요. 나는 글로벌 제조업체 파일은 내가 그것을 확인하기 위해 어디 있는지 어떻게 알아요. 다른 질문? 과거의 일이 퀴즈? 모든 포인터 일? 같은 포인터와 미묘한 가지가 있습니다 - 나는 그곳에서 퀴즈 질문을 찾을 수 않을거야 - 하지만 단지 이런 걸처럼. 내가 무슨 말을 할 때 당신이 그렇게 이해를해야합니다 정수 * X * Y - 이 정확히 여기 건지 아닌지는 것 같아요. 그러나 같은 * X * Y, 그는 스택에있는 두 변수입니다. 나는 말을 할 때 X = malloc (sizeof (int는)), x는 여전히 스택에 변수 malloc은 힙 분쟁 블록이며, 우리는 힙 X 포인트가 있어요. 힙에 스택 점에서 뭔가 그럼. 때마다 malloc 아무것도, 당신은 불가피하게 그 포인터의 내부를 저장하고 있습니다. 그 포인터가 스택에 그래서 malloced 블록은 힙에 있습니다. 많은 사람들이 혼란스러워하고 말 INT * X = malloc, x는 힙에 있습니다. X가 가리키는 어떤 번호는 힙에 있습니다. 어떤 이유로 당신이 x는 전역 변수가 될하지 않는 X 자체는, 스택에 이 경우에 메모리의 다른 영역에 있어야 발생합니다. 트랙을 유지 그래서,이 상자 화살표 다이어그램은 퀴즈에 대한 아주 흔한 일입니다. 이 퀴즈를 0에이 아니라면 아니면, 퀴즈 1 될 것입니다. 당신은 컴파일의 단계를이 모든 걸 알 수 있어야 당신이 저에 대한 질문에 대답했다 때문입니다. 예. [학생] 우리가 그 단계에 가서 할 수 없습니다 - >> 그래. 단계 및 컴파일하기 전에 우리는 전처리가 컴파일 조립 및 연결. 전처리. 그 용도는 무엇입니까? 그것은에있는 가장 쉬운 단계 - 글쎄, 그런 식으로 - 그 방법은 우리가 분명해야 의미하지는 않습니다,하지만 가장 쉬운 단계입니다. 당신들은 그것을 자신을 구현 수 있습니다. 그래. [학생] 무엇 당신이하고있는 것은 다음과 같이 포함 해하고 복사하고도 정의합니다. 그것은, # 등의 존재를보고 # 정의 하고 그냥 복사하여 페이스트 사람들은 실제로 무슨 뜻인지. 그래서 당신은 # cs50.h을 포함 말은, 전처리가 복사 cs50.h 붙여 넣기합니다 그 줄에. 당신은 # 4로 x를 정의 말은, 전처리는 전체 프로그램을 통해 간다 그리고 4 X의 모든 인스턴스를 대체합니다. 따라서 전처리은 (는) 유효한 C 파일을 소요하고 유효한 C 파일을 출력 있는 물건은 복사 및 붙여 넣기되었습니다. 이제 컴파일. 그 용도는 무엇입니까? [학생]는 C에서 이진로 이동합니다. [보덴] 그것은 바이너리로 모든 길을 갈수하지 않습니다. [학생] 기계 코드 그럼? >> 그것은 기계 코드 없습니다. [학생] 국회? >> 조립. 이 C 코드로 모든 길을 들어가기 전에이 국회에 가서, 대부분의 언어는 이런 일을 할. 어떤 높은 수준의 언어를 선택하고 그것을 컴파일 할 경우, 이 단계에서 컴파일 할 것입니다. 첫 번째는 C로 파이썬을 컴파일거야, 다음은 조립 C를 컴파일거야 그리고 조립 바이너리로 번역 할 거에요. 따라서 컴파일은 C에서 어셈블리로 가져 것이다. 컴파일 단어는 일반적으로 높은 수준에서 가져 의미 낮은 수준의 프로그래밍 언어. 그래서이 집이 당신이 높은 수준의 언어로 시작하는 컴파일에있는 유일한 단계입니다 과 낮은 수준의 언어로 끝나, 그리고 단계가 컴파일이라고하는 이유입니다. 컴파일시 [학생], 귀하가 # 포함 한 그렇게 말하지 cs50.h. 컴파일러 컴파일 cs50.h 윌, 거기에있는 기능과 같은, 그리고,뿐만 아니라 그 어셈블리 코드로 번역 또는 사전 조립 된 뭔가를 복사하여 붙여 넣기 것인가? cs50.h이 정말 국회에서 생을 마감하지 않습니다. 함수 프로토 타입과 물건 같은 콘텐츠는 조심 만위한 것입니다. 당신이 함수를 호출하는 것 컴파일러가 일을 확인할 수 있도록 보장 오른쪽 반환 형식과 오른쪽 인수하고 뭐 다른 것들. 이 컴파일 될 때 그럼 cs50.h는 다음 파일로 preprocessed, 그리고 될 것입니다 이 모든 것이 제대로 호출되고 있는지 확인합니다 후에는 기본적으로 버려진있어. 그러나 CS50 라이브러리에 정의 된 함수, cs50.h 분리되어있는 그는 별도로 컴파일되지 않습니다. 실제로 연결 단계에서 내려 와서됩니다, 그래서 우리는 두 번째에 해당로 연결됩니다. 그러나 먼저, 어떻게 조립입니까? 진에 [학생] 국회? >> 그래. 조립. 총회는 거의 이진의 순수한 번역이기 때문에 우리는 컴파일 연락하지 않습니다. 총회에서 이진에가는 매우 작은 논리가 있습니다. 그냥 테이블에 찾는 사람이야 오, 우리는이 명령을 가지고있다 그 바이너리 01110에 해당합니다. 그리고 파일이 출력은 일반적으로 조립. O 파일이. 그리고. O 파일은 우리가 전에 말을했던 있으며, 어떻게 파일은 main () 함수가 필요하지 않습니다. 모든 파일은 유효한 C 파일의만큼. O 파일로 다운 컴파일 할 수 있습니다. 이. O으로 컴파일 할 수 있습니다. 이제 연결이 있습니다. 실제로 잔뜩 무슨 일로 오 파일이며 실행에을 제공합니다. 그리고 어떤 연결이 수행하면. O 파일로 CS50 라이브러리를 생각할 수 있습니다. 그것은 이미 컴파일 된 바이너리 파일입니다. 그리고 당신은 GetString 호출 파일, 당신 hello.c를 컴파일 할 때 hello.c는 hello.o으로 컴파일됩니다 hello.o는 바이너리 중이다. , 그것은 GetString 사용하기 때문에 cs50.o에 갈 필요가 그리고 링커가 함께 그들을 smooshes이 파일에 GetString를 복사합니다 하고 필요로하는 모든 기능을 가지고 실행으로 나온다. 그럼 cs50.o은 실제로 O 파일입니다,하지만 더 근본적인 차이가 없다는 것을 충분히 있습니다. 그냥을 연결하면 함께 파일의 무리를 제공합니다 개별적으로 모든 기능을 포함하고 제가 사용해야합니다 실제로 실행되는 실행 파일을 만듭니다. 그리고 우리가 전에 말을했던 것이기도 당신은 1000가 할 수있는. C 파일을, 당신은 모두를 컴파일합니다. O 파일, 아마 시간이 걸릴됩니다, 다음 1을 변경할 수 있습니다. C 파일은. 귀하는 그 1. C 파일 및 다음 다른 relink 모든을 다시 컴파일 할 필요가 다시 함께 모든 연결합니다. [학생] 우리가 lcs50를 작성 연결 할 때? 그래,-lcs50. 해당 라이브러리에 연결되어야 링커에게 깃발 신호. 질문이 있으십니까? 우리는 첫 번째 강의에서 해당 오초 이외의 바이너리왔다? 그렇게 생각하지 않아요. 당신은 우리가 늦었가 큰 OS의 모든 사항을 알아 두어야 우리가 당신에게 기능을 해준다면 당신은, 할 수 있어야합니다 그게 약, 큰 O 있다고도 할 수 있어야합니다. 또는 잘, 큰 O는 거친 것입니다. 당신이 일의 동일한 수를 통해 반복 루프에 대한 중첩 참조하면, >> [학생] N 제곱 - INT J, J >는 제곱 N 경향이있다. 당신은 트리플 중첩 한 경우, n은 cubed 될 경향이있다. 그래서 그런 일이 바로 지적 할 수 있어야합니다. 당신은 삽입 정렬과 버블 정렬을 알고 종류와 그의를 병합해야합니다. 그들은 그 N 제곱과 n 로그 N 그 모든 이유가 이해하기 쉽게 난 우리가 기본적으로 준 1 년 퀴즈 거기에 생각하기 때문에 버블 정렬의 구현 및 "이 함수의 실행 시간은 무엇입니까?"라고 당신은 거품 정렬로 인식하면, 다음 즉시 n은 제곱 말할 수 있습니다. 네가 그냥 보면하지만, 당신도 그게 거품 정렬을 실현 할 필요가 없습니다; 당신은 본이를하고있다 말할 수 있습니다. 이것은 제곱 습니됩니다. [학생]이 (가) 당신이 가지고 올 수있는 어려운 사례가 있습니까, 알아 냈어과 비슷한 생각처럼? 나는 우리가 당신에게 어떤 힘든 예를 포기할 거라 생각하지 않습니다. 버블 정렬 건, 우리가 갈거야 최대한 어렵다 그리고 오래 당신이 이해로는 배열을 통해 반복하고 있다는 것을 배열의 각 요소에 대해, 어느 제곱 습니 뭔가 될 것입니다. 우리가 여기에 같은 일반적인 질문이 있습니다 - 오. 그냥 어느 날, 더그 주장, "나는 배열을 정렬 할 수 있습니다 알고리즘을 발명했습니다 "O (로그 n)이 시간!의 N 숫자의" 그럼 어떻게 우리가 그렇게는 불가능 알 수 있습니까? [안 들리게 학생 응답] >> 그래. 최소한, 당신은 배열의 각 요소를 터치해야 그래서 배열을 정렬 할 수가 없어 - 모든 정렬되지 않은 순서로되어있는 경우, 다음은 배열에 모든 것을 만지고 있어야 할거야 그래서 N의 O 이내에 작업을 수행하는 것은 불가능입니다. [학생] 당신이 우리에게 n의 O에서 할 수있는의 예를 보여 당신은 많은 메모리를 사용하는 경우. >> 그래. 그리고 전 ... - 내가 그정도 잊지 - 이건 일종의 계산 있습니까? 음. 그 정수 정렬 알고리즘입니다. 제가 지난 주에 기억 할 수없는이를위한 특별한 이름을 찾고있었습니다. 그래. 다음은 n의 큰 O의 일을 수행 할 수 종류의 유형입니다. 만 특정 번호로 정수를 사용할 수 있습니다 것 같지만 한계가 있습니다. 또한 당신이 뭔가를 렸는데을 정렬하려는 경우 - 당신의 배열은 012, -12, 151, 4 만 경우 해당 단일 요소는 완전히 전체 정렬을 망칠 것입니다. 질문이 있으십니까? [학생] 당신은 재귀 함수가 있고 그냥 재귀 호출을하는 경우 return 문에서, 그, 꼬리 재귀입니다 그리고 그 실행 기간 동안 더 많은 메모리를 사용하지 않을 이 솔루션을 반복적으로하거나 최소한 유사한 메모리를 사용해야합니까? [보덴] 예. 그것은 가능성이 다소 느려질 수 있지만 정말로. 것 재귀 꼬리가 아주 좋은 것입니다. 스택 프레임에서 다시 찾고, 우리는 주요 있다고 가정 해 봅시다 우리는 INT 바 (INT X) 또는 게있어. 이건 완벽한 재귀 함수가 아니라 수익 바 (X - 1). 그러니 확실히,이 썼어. 당신은 기본 케이스와 재료가 필요합니다. 하지만, 여기에 아이디어는,이 재귀 꼬리 때문입니다 어떤은의 스택 프레임을 얻을 수있을 때 주요 통화 표시 줄을 의미합니다. 이 스택 프레임에 메모리의 작은 블록이있을거야 그는 인수 x에 해당합니다. 그리고 보자는 메인이 바 (100) 전화 댔어; 따라서 x는 100로에서 시작 예정이다. 컴파일러는이, 꼬리 재귀 함수입니다 인식하는 경우 바, 그 재귀 호출이 금지 할 수 있습니다 땐 대신 스택이 크게 성장 시작 어디에 새로운 스택 프레임을 만드는, 결국 힙으로 실행됩니다 그리고 당신은 segfaults을 메모리 충돌 시작 때문입니다. 대신 자신의 스택 프레임을 너무, 이건 실현할 수 이봐 요, 난 정말이 스택 프레임에 다시 할 필요가 없습니다 대신에 그냥 99로이 인수를 대체하고 줄을 모두 다시 시작합니다. - (1 개) 그리고 다시 그렇게하고는 반품 바 도달 할 대신 새로운 스택 프레임을의, 단지 98 현재 인수를 교체합니다 다음 줄의 처음으로 돌아 이동합니다. 이러한 운영 스택에 그 한 가치를 교체하고 처음부터 다시 점프, 매우 효율적이다. 그래서 ..이 반복되는 별도의 함수와 같은 메모리 사용량 is 만 1 스택 프레임을 사용하고 있지만, 단점을 겪고있는 것이 아니기 때문 함수를 호출해야하는. 이 모든 설정을 할 있기 때문에 전화 기능은 다소 비쌀 수 있습니다 및 teardown이 모든 것들. 그래서 꼬리 재귀이 양호합니다. [학생] 왜 새로운 단계를 생성하지 않습니다? 그 실현 때문 필요하지 않습니다. 바 호출은 재귀 호출을 반환합니다. 그럼 리턴 값으로 아무것도 할 필요가 없습니다. 단지 즉시 반환하는거야. 그럼 그냥 자신의 주장을 교체하고 다시 시작 할거야. 또한, 당신은 꼬리 재귀 버전이없는 경우, 다음은이 줄이 반환이 모든 막대를 얻을 이 막대가 즉시 반환 한 후,이 하나의 값을 반환한다 그리고이 하나의 값을 반환 한 후 그냥 바로 돌아거야 이 하나의 값을 반환합니다. 그럼 당신은 스택의이 모든 일을 터지는이 절감 반환 값은 어쨌든 다시 모든 방법을 전달하려고 때문입니다. 왜 그냥 업데이트 된 인수와의 논쟁을 교체하고 다시 시작하지? - 당신이 그런 짓을하면 기능은 꼬리 재귀가 아닌 경우 [학생] 경우 바 (X + 1). >> 그래. 이 상태로 넣어면, 다음의 리턴 값에 뭔가 의미있는 일을하고 있어요. 아니면 그냥 반환이 작업을 수행하는 경우에도 * 바 (X - 1). 이제 바 -가 2 배 그 값을 계산하기 위해 (X 1) 순서로 반환해야합니다 이제야는 별도의 스택 프레임이 필요 없습니다 지금, 당신이 아무리, 당신은 필요 할 건 - 이 재귀 꼬리 없습니다. [학생] 나는 꼬리 재귀을 목표로하는 재귀을 가져보십시오시겠습니까 - [보덴]는 이상적인 세계에서하지만, CS50에 필요하지 않습니다. 꼬리 재귀를 위해 일반적으로, 당신은 추가 인수를 설정 바 Y에 정수 x를 취할 것입니다 곳 와 y는 반환 할 궁극적 인 문제에 해당합니다. (- 1 개), 2 * y를 그럼 이건 당신이 줄을 반환 할거야. 단지 있도록 높은 수준의 당신이 일이 꼬리 재귀로 변환하는 방법. 그러나 추가 인수 - 그리고 결국에는 당신의 기본 케이스에 도달 할 때, 당신은 y를 반환 당신은 전체 시간을 당신이 원하는 반환 값을 축적 해왔거든요. 의 당신 종류 선언을하고 있지만, 재귀 호출을 사용하고 있습니다. 질문이 있으십니까? 문자열을 사용할 때와 같은 아마 포인터 산술에 대한 [학생]. >> 물론이지. 포인터 산술. 문자열이 문자 별이기 때문에 문자열을 사용하는 경우는, 쉽게 문자는 영원히 항상 단일 바이트 아르 그래서 포인터 연산은 문자열을 상대하는 일반 산술 동일합니다. 우선은 숯불 * S = "안녕하세요"라고. 그래서 우리는 메모리에 블록이 있습니다. 항상 널 종료가 필요하기 때문에 6 바이트가 필요합니다. 그리고 숯불 * s은 (는)이 배열의 시작 부분을 가리 키도록 것이다. 따라서 S가 지적했다. 자,이, 기본적으로 모든 배열 방법은 다음과 상관없이 malloc으로하거나 스택에 있어요 여부를 반환했습니다 여부. 모든 배열은 기본적으로 배열의 시작에 대한 포인터입니다 다음 일련의 작업을 모든 색인을 생성, 그냥 특정 오프셋 그 배열로 갈 수 있습니다. 그래서 님의 [3] 같은 말을 할 때,이 S로 이동 인치 세 문자를 주시 그럼 님의 [3], 우리는 0이, 1, 2, 3, 기건 [3]이 리터를 참조 예정이다. [학생] 그리고 우리는 S + 3 일 후 괄호 스타 같은 값에 도달 할 수? 예. 이 * (S + 3)에 해당합니다; 그리고 영원히 항상 동등한 당신이 무슨 짓을하든 없습니다. 당신은 브라켓 구문을 사용 할 필요가 없습니다. 당신은 언제나 (들 + 3) 문법 *를 사용할 수 있습니다. 사람들은하지만 브라켓 구문을 좋아하는 경향이 있습니다. [학생] 지금 모든 배열은 실제로 포인터입니다. 내가 무슨 말을 할 때 약간의 차이가 있습니다 INT X [4]; >> [학생] 그 메모리를 만들 수 있습니까? [보덴 그건 정말 16 바이트 전체, 스택에 4 ints를 만드는 것이다. 이 스택에 16 바이트를 만들거야. x는 저장되지 않습니다. 단지 일을 시작을 참조 상징입니다. 당신은이 함수의 안쪽에 배열을 선언하기 때문에 컴파일러가 무슨 짓을할지 그냥 변수 x의 모든 인스턴스를 바뀝니다 그 다음 16 바이트를 넣어 선택이 있었던 곳으로. s이 (가) 실제 포인터이기 때문에이 숯불 * s와 (과) 그런 짓을 할 수 없습니다. 그런 다음 다른 일을 가리 할 수​​있다. x는 상수입니다. 당신은 다른 배열이 지점 수 없습니다. >> [학생] 좋아요. 그러나이 아이디어에,이 색인을 생성, 그건 기존의 배열 여부와 상관없이 동일합니다 그건 뭔가 또는 경우에 대한 포인터인지 아니면 malloced 배열에 대한 포인터입니다. 그리고 사실, 또한 같은입니다 너무 동일합니다. 그것은 실제로 괄호의 내부에 어떤 번역과는 괄호 남은 을 함께 추가하고, dereferences. 따라서이만큼 유효합니다 * (S + 3) 또는 S [3]. [학생] 당신은 2 차원 배열을 가리키는 포인터를 할 수 있습니까? 이 힘듭니다. 전통적으로, 안돼. 2 차원 배열은 단지 편리한 구문과 1 차원 배열입니다 때문에 내가 말할 때 INT X [3] [3]이 정말 아홉 값으로 단 1 배열입니다. 그리고 그래서 지수는, 컴파일러가 무슨 뜻인지 알고 때. 나는 X [1] [2], 그건 내가 두 번째 행에 가고 싶어 알고 있으므로 처음 3를 건너 뛰거야,라고하면 다음, 아마 이걸 가져 오지 점에서 두 번째 일을하려고합니다. 하지만 여전히 단지 하나의 차원 배열입니다. 그래서 난, 그 배열에 대한 포인터를 할당하고자 할 경우 그러니까 ... 그게 정수 * P = X; X의 유형은 단지입니다 - , 그냥 상징이기 때문에 그것은 X의 거친 말하는 타입이고 실제 변수 아닙니다 하지만 그냥 정수 *입니다. x는 그냥이의 시작에 대한 포인터입니다. >> [학생] 좋아요. 그래서 난 [1] [2]을 (를) 액세스 할 수 없습니다. 나는 특별한 문법은 포인터를 선언 거기에 생각 INT 같은 터무니없는 일이 (* P [-. 말도 안돼 무언가조차 모르겠어요. 그러나 괄호 내고, 물건 같은 포인터를 선언을위한 구문이 있습니다. 심지어 당신이 그렇게하지 ​​못하게 할 수 있습니다. 나는 내게 진실을 말해 줄 수 무언가를 다시 확인 수 있습니다. 포인트 구문이있을 경우, 나중에 찾습니다. 하지만, 당신이 그걸 표시되지 않습니다. 그리고 문법은 당신이 그것을 사용하는 경우, 사람들이 당황 될 정도로 오래된 것입니다. 객관적으로 다차원 배열은 매우 드문 있습니다. 꽤 많이 당신 - 당신은 매트릭스 일을하는 경우 음, 희귀 않을거야 하지만 C에서 당신은 거의 다차원 배열을 사용 할 수 없어하고 있습니다. 그래. >> [학생] 가자 당신은 정말 긴 배열을 말한다. 따라서 가상 메모리에, 모든 연속으로 나타납니다 서로 바로 옆에있는 요소와 같은, 하지만 실제 메모리에 따라 최대 분할 할 그 일에 대한 수 있겠지? >> 예. 메모리 작품이 얼마나 가상 단지 분리 - 할당 단위는 4킬로바이트 경향이 페이지입니다 그래서 프로세스가 말할 때, 이봐 요, 난이 메모리를 사용하려면 운영 체제는 그것을 메모리의 작은 블록 4킬로바이트을 할당 할 것이다. 당신은 단지 메모리의 전체 블록에서 단일 약간 바이트를 사용하더라도 운영 체제는 그것을 전체 4킬로바이트를 제공 할 수 있습니다. 그래서 의미가 무엇인지 그럴 수도 -이 내 스택이라고합시다. 이 스택은 분리 될 수 있습니다. 내 스택은 메가 바이트와 메가바이트 될 수 있습니다. 내 스택은 거대한 될 수 있습니다. 그러나 스택 자체는 개별 페이지로 분할해야합니다 이것이 우리의 RAM 말하는 우리가 여기에 보면 어느합시다, 나는 RAM의 2 기가 바이트가있는 경우,이 내 RAM의 0번째 바이트와 같은 실제 주소 0입니다 이 여기 2기가바이트 쭉 있습니다. 그래서이 페이지는 여기로이 블록에 해당 할 수 있습니다. 이 페이지는 여기로이 블록에 해당 할 수 있습니다. 이 사람은 여기로 대응 할 수 있습니다. 운영 체제는 물리적 메모리를 할당 할 무료입니다 그래서 임의로 개별 페이지에. 그리고 그 의미이 경계선은 배열을 두 다리 쭉 벌리고 타라고 무슨 일이 생긴다면, 배열이 왼쪽 할 일이, 오른쪽 페이지의 주문 해당 배열은 물리적 메모리에 분할 예정이다. 프로세스가 끝날 때 그리고 당신은 프로그램을 종료 할 때, 이 매핑은 삭제하고 다음 다른 일을위한 작은 블록을 사용하는 무료입니다. 더 질문? [학생] 포인터 연산. >> 오, 그래. 문자열은 쉽게했지만, ints 같은보고 그래서 돌아 가기 INT X [4]; 이 배열인지 여부 또는 4 정수의 malloced 배열의 포인터 일지 이 같은 방법으로 처리 할거야. 따라서 배열은 힙에서 [학생]입니까? [보덴] 배열은 힙에 없습니다. >> [학생] 오. [보덴] 배열의 이러한 유형의 스택에있을 경향이 하지 않는 한 당신은에서 선언 - 전역 변수를 무시합니다. 전역 변수를 사용하지 마십시오. 내가하는 말은 함수의 내부 INT X [4]; 그것은이 배열 스택에 4 정수 블록을 만들거야. 그러나이 malloc (4 * sizeof (int는)이), 힙에 갈 수 있습니다. 그러나이 시점 후에는 거의 같은 방법으로 x와 P를 사용할 수 있습니다 당신은 P를 다시 할당 할 수 있습니다에 대한 전에 말했다 예외가 아닌. 기술적으로, 그들의 크기는 약간 다릅니다,하지만 완전히 무관입니다. 당신은 실제로 자신의 크기를 사용하지 않습니다. 내가 말할 수있는 P P [3] = 2, 또는 X [3] = 2; 당신은 정확히 같은 방법으로 사용할 수 있습니다. 이제 그럼 포인터 산술 - 예. [학생]는 당신이 괄호가있는 경우 P *를 수행 할 필요가 없습니다합니까? 괄호는 암시 역 참조입니다. 좋아요 >>. 사실, 또한 당신이와 말하는 것은 당신은 다차원 배열을 얻을 수 있습니다 포인터와 함께, 당신이 할 수있는 것은의 말하자, 뭔가 같은 것입니다, INT ** PP = malloc (sizeof (int는 *) * 5); 난 그냥 모든을 먼저 작성됩니다. 난 하나를 싶지 않았어. 좋아요. 여기 무슨 짓입니다 - 그건 PP [I]해야합니다. 따라서 PP는 포인터에 대한 포인터입니다. 당신은 5 INT 별의 배열을 가리 키도록 PP mallocing하고 있습니다. 따라서 메모리에 당신은 스택 pp.에 있습니다 다 포인터 자체의 5 블록의 배열을 가리 키도록거야. 그리고 때 여기서 내가 malloc 다운, 나는 malloc하시는 분들은 개별 포인터의 각 힙에 4 바이트의 별도의 블록를 가리켜 야합니다. 4 바이트에 따라서이 포인트. 그리고 다른 4 바이트로 이것 가리 킵니다. 그리고 그들 모두는 자신의 4 바이트를 가리 킵니다. 이 나에게 다차원 일을하는 방법을 제공합니다. 나는 PP [3] [4] 지금이 같은 일이 아닙니다와 같은 다차원 배열을 말할 수 다차원 배열은 번역 때문에 [3] [4] X 배열에 오프셋 하나에.주세요 이 dereferences의 P는 dereferences 다음, 세 번째 인덱스를 액세스하는 것 및 접근 - 4가 잘못된거야 - 두 번째 색인을 생성합니다. 반면에 우리가 있었을 때 INT X [3] [4] 다차원 배열로 이전 그리고 브래킷을 두 배로 때, 정말 단 하나의 역 참조입니다 , 당신은 하나의 포인터를 따라 가고 한 다음 오프셋 이거 정말 2D 참조입니다. 당신은 2 개의 포인터를 따르십시오. 이 또한 기술적으로 할 수 있습니다 그래서 당신은 당신의 다차원 배열을 가지고있는 각각의 배열은 서로 다른 크기입니다. 그래서 가변 다차원 배열이이란 생각 정말 가장 먼저 10 요소가 무언가를 가리킬 수 있으므로, 두 번째는 100 요소를 가지고 뭔가를 가리 킵니다 수 있습니다. [학생]이 (가) 당신이 할 수 포인터의 수에 제한이 있나요 다른 포인터를 가리키는? >> 번호 당신은 INT ***** P 할 수 있습니다. 다시 포인터 연산으로 - >> [학생] 오. >> 그래. [학생] 내가 그때 INT *** P을 가지고 있다면 나는 dereferencing을 내가 P의 *이 값과 동일하다고, 그것은 단지 dereferencing 1 수준의 일을 할거야? >> 예. - 그 마지막 포인터가 가리키고 있다는 것을 액세스 할면 그럼 당신은 ***의 P 해. 좋아요 >>. 그래서 1 블록, 다른 블록을 가리키는 또 다른 블록 포인트에 P 점입니다. 당신은 *을하면 다음 P는 = 다른 한 다음이를 변경 이제 다른 블록을 가리 키도록. 좋아요 >>. 이러한이 malloced 된 경우 [보덴]는 그리고 다음 이제 메모리를 유출 한 여러분이 다른 참조가 발생하지 않는 한 당신이 방금 버렸 것을 그 사람에게 올 수없는 때문입니다. 포인터 산술. INT X [4], 4 정수의 배열을 할당 할 것이다 x는 배열의 시작 부분을 가리 키도록가는 곳. 그럼 언제는 x [1]과 같은 말을, 나는 배열의 두 번째 정수로 이동을 의미 할 어떤이 하나가 될 것입니다. 이 정수는 4 바이트를 차지부터하지만 실제로는, 그 배열로 4 바이트입니다. 1의 오프셋 정말 1의 오프셋을 의미합니다 그래서 배열의 유형은 무엇이든의 시간은 크기입니다. 이 정수의 배열이므로 오프셋하고자 할 때 그 정수의 1 번 크기를 할 알고 있습니다. 다른 구문입니다. 이 * (x + 1)과 동일합니다 기억, 나는 포인터 뭘 그 반환하면 포인터가 저장되어있는 주소입니다 + 1, 말할 때 플러스 1 번 포인터의 타입의 크기입니다. 그래서, 만약 X = ox100 다음, X + 1 = ox104. 그리고 당신이 이것을 악용하고 말을 할 수 숯불 같은 * C = (숯불 *) X, 지금 C는 x와 동일한 주소가 될 것입니다. C는, ox100 같 될 것입니다 하지만 C + 1 ox101 동일 될 것입니다 포인터 산술 당신이 추가되는 포인터의 종류에 따라 다릅니다 때문입니다. 따라서 C + 1, 이건 C를 바라보고, 그 숯불 포인터이고, 그래서이 문자의 1 번 크기를 추가 할거야 어느 항상 1이 될 것입니다, 그래서 당신은 101를 얻을 난 아직도 100 X을한다면, X + 1은 104이 될 것입니다 반면. [학생] 당신은 C + + 1하여 포인터를 전진하기 위해 사용할 수 있습니까? 예, 할 수 있습니다. x는 단지 상징이기 때문에 당신은 X로 그렇게 할 수 없어, 그것은 상수이다, 당신은 X를 변경할 수 없습니다. 그러나 C는 포인터로 발생하므로 C + + 완벽하게 유효하고 1 증가합니다. C는 단지 정수 *이라면, 다음에 c + + 104 될 것입니다. + + 않는 포인터 산술 마찬가지로 C + 1 포인터 산술 짓을 한 것 있습니다. 이와 같은 사실은 실제로 병합 정렬 등의 방법이 많이 있습니다 - 대신 물건의 복사본을 만드는 대신 전달할 수 있습니다 - 이 중 일부를 삭제까요? - 나는 배열의 절반을 통과하고자하는 경우처럼. 자, 내가 함수에 배열의 측면을 통과하고 싶어 말한다. 내가 그 함수에 전달할거야? 나는 X를 전달하면,이 주소를 전달하고 있습니다. 하지만이 특정 주소를 전달하고 싶습니다. 그래서 어떻게 통과해야하나요? [학생] 포인터 + 2? [보덴] 지금 X + 2. 예. 그래서이 주소거야. 당신은 또한 자주로 볼 수 X [2] 다음 해당의 주소. 그래서 브래킷이 암시 적 역 참조하기 때문에 그것의 주소를해야합니다. X [2],이 상자에 값을 참조하고 해당 상자의 주소를 원하는 그래서 당신은 말 & X [2]. 그럼 자네가 뭔가를 절반 목록을 전달하려는 병합 정렬의 방법은 뭔가 당신이 정말로 그러고 & X [2], 지금까지 재귀 호출에 관한 한, 나의 새로운 배열이 시작됩니다. 마지막 분 질문입니다. [학생] 우리는 앰퍼샌드를 게시하거나하지 않은 경우 - 그게 뭐였죠? >> 스타? [학생] 스타. >> 기술적으로 역 참조 연산자,하지만 ... - >> [학생] 역 참조. 우리가 스타 앰퍼샌드를 넣어하지 않는 경우 그냥 y를 말한다면 어떤 일이 벌어 질까요 = x와 X 포인터입니까?주세요 y의 유형은 무엇입니까? >> [학생] 방금 그건 포인터 2를 말할 수 있습니다. 당신은 말하려면 Y = X, 지금 x와 y 포인트 같은합니다. >> 같은에 [학생] 가리 킵니다. 그리고 x는 정수 포인터가있는 경우? 당신은 포인터를 할당 할 수 없기 때문에 >>이 불평합니다. [학생] 좋아. 우리가 화살표로 그려에도 해당 포인터를 기억 정말 모든 사람들이 상점 - 정수 * X - 정말 모든 x가 저장되며, ox100 같은 것이지 있는 우리는 100 저장된 블록을 가리키는로 표현하기 위해 발생합니다. 그래서 말을 할 때 INT * Y = X, 난 그냥 Y로 ox100을 복사 해 있는 우리는 또한 ox100을 가리키는, y로 나타냅니다거야. 그리고 말한다면, INT I = (INT) ×, 그럼 내가 ox100의 값이 뭐든간에 저장 것입니다 그것의 내부하지만, 지금은 대신 포인터의 정수로 해석 될거야. 하지만 당신은 캐스트가 필요하거나 다른이 불평합니다. [학생] 그래서 당신은 주조 건가요? - 는 Y의 X 또는 주조 INT의 정수를 캐스팅 할 예정입니까? [보덴 뭐? [학생] 좋아. 이 괄호 이후에는 X 또는이 불안하실 건가요? [보덴]도. x와 y는 같습니다. >> [학생] 좋아요. 그 둘은 포인터니까. >> 그래. [학생] 지금은 정수 형태로 16 진수 100을 저장까요? >> [보덴] 그래. 그러나이을 가리키는대로의 값입니다. [보덴] 그래. >> [학생] 지금 정수 형식으로 만 주소. 좋아요. 당신은 어떤 기괴한 이유에 원 [보덴] 경우 당신은 독점적 포인터 처리와 정수 처리 수 없었 불과 INT * X = 0처럼. 그런 다음 포인터 연산이 일어나는 시작되면 정말 혼란스러워 할거야. 그래서 그들은 저장하는 숫자는 의미입니다. 그것은 당신이 그들을 해석 결국 그냥 방법은 다음과 같습니다. 그래서, int로 int는 *에서 ox100를 복사 할 자유 다 아마도 캐스팅하지 못한 화가나 것 같으니 - 그리고 난 할당 할 자유 야 - 이 임의의 정수를 *로 (INT *) ox1234 같은 무언가를 할당 할 무료입니다. 그럼 ox123에 유효한 메모리 주소가 아니라 & Y 불과으로합니다. & y는 거의 ox123이 무언가를 반환하는 발생합니다. [학생]은 그 진수의 소수점 형태로 이동하는 정말 멋진 방법이 될 줄래? 당신은 포인터가 있으면 좋아하고 당신은 정수로 캐스팅? [보덴] 당신은 단지 printf처럼 사용하는 인쇄 할 수 있습니다. 자, 내가 INT Y = 100가 있다고 가정 해 봅시다. 따라서 printf (% d 개 \ N - 이미 알다시피 - 인쇄와 같은 정수, %의 X. 우리는 단지 진수로 인쇄됩니다. 그래서 포인터는, 16 진수로 저장되지 않습니다 와 정수는 십진수로 저장되지 않습니다. 모든 바이너리로 저장됩니다. 우리가 진수로 포인터를 표시하는 경향이 단지 우리는이 4 바이트 블록의 일을 생각하기 때문에 및 메모리 주소는 알고 있어야하는 경향이 있습니다. 가 BF로 시작하는 경우, 그것은 스택에 있다는데처럼 우리는하고 있습니다. 그럼 그냥 진수로 포인터 우리의 해석입니다. 좋아요. 마지막으로 질문 있나요? 당신은 다른 일이있을 경우 후에 잠시 여기있을거야. 그래서 그 끝입니다. [학생] 야호! [박수] [CS50.TV]