スピーカー1:皆さん、こんにちは。 私たちは始めるつもりです。 私は人々がまだ起こっていると思う でフィルタリングされる。 しかし、時間の利益のために、私達ができるので、 時間通りにここからあなたたちを取得するには、 私たちは開始する予定だ。 だからCS50クイズ0件へようこそ。 実現していない人のために まだ、あなたは水曜日に質問があります。 ウー·ホー。 あなたはまだ勉強を始めていない場合、または これはまだ存在していることを実現していない、 過去のクイズとに関するすべての情報 クイズcs50.net/quizzesにあります。 いくつかの非常に良いものがそこにあります、 最後の10から過去のクイズ 年だけでなく、情報 このクイズや話題について それはカバーされる。 それでは始めましょう。 だからみんな、最初のを覚えているかもしれません クラスデビッドの日は、これらのランプの上に持っていた。 だから基本的に、すべてのものになる あるコンピュータのボンネットの下に上 バイナリで行わ。 バイナリは、それが聞こえる何を意味し のような、0と1。 それは2つの値を有している 表現することができる。 だからセクションの最初の日のよう ダビデは光になったとき に表現するために、電球、または1、当社のコンピュータ 0のバイナリを理解し、 1の、オンまたはオフにします。 バイナリの基本。 すべての場所が表されている ベース2内。 だから、0〜2を追加 2すべての方法の最大1。 あなたのバイナリがにあるかを計算するために、 小数、あなただけのこの方程式に従う タイプの事。 あなたはそれらの場所のいずれかに1がある場合は、 あなたはどのようなを掛け それは中のベース、それを追加し、 あなたは、小数点を得る。 だから、これはあなたが数える方法です バイナリ5。 ちょうど私たちが何をしていたかのように 最後のスライド、これはあなたがする方法である 1〜5を表す。 同様に、追加することができます同じようにと 10進数または10を底に引くか、 追加できる上、本当に任意の塩基、 バイナリに引く。 ときに、あなたが期待するかを正確に それは大きい等しい場合二つアップを追加 1よりも、あなたは、それ0にする、1を運ぶ ちょうど、またそのように行う あなたが定期的に期待されるように 10進数またはいずれかの他の塩基。 クール。 私はそのすべてが、前に述べたようなので、 当社のコンピュータのフードの下に進む 0と1、またはバイナリで行われます。 では、どのように、たとえば、表現するか、 文字、または数字、あるいは文字? そして、それに対する答えはASCIIです。 ASCIIは文字間のマッピングです。 私たちは通常で見るだろうと Aさん、Bさんのような英語、 C言語の、アンダースコア、ダッシュ、および そのような何か。 そして、それはASCII値にそれをマッピングします。 ASCII値は単なる数であること お使いのコンピュータが理解できる。 そして、あなたは追加を行うことができます同じようにと 番号の減算、あなたが行うことができます ASCII値を持つ彼ら。 したがって、この例では、どのような これは出力します? うん、これだけ空間B空間Cスペース D.どこ私のマウスは行きましたか? あなたが65でint型を定義することができます注意してください。 そして、あなたが使用してそれをプリントアウトするとき %のCは、それは、それを解釈しよう キャラクターとAを出力します 同様に、宣言することができます それcharとして。 そして、あなたはパーセントを使用してそれをプリントアウトするとき Cは、それがそのように解釈よ パーセントD.そして、あなたは追加することができます同じように 番号には、文字を追加することができている この場合のASCII値、。 皆のためにこれほど少ないのポインタ。 5、文字列として、していない 実際に5に等しい。 だから、私たちはどのように変換することがあります 整数5弦5? 任意のアイデア? うん。 だから私たちは文字列として5を持っている場合、 私たちは0を引くことができます。 そして、それは私たちに5を与えるでしょう。 同様に、私たちのように5を持っている場合 整数、文字列0にそれを追加します。 そして、それは私たちに、文字列5を与えます。 クール。 さて、1どこ講義に戻ってリコール 私たちはアルゴリズムについて話しました。 では、どのように実際にコンピュータをしたいですか 面白いことを行うには? あなただけの加減算、知っている 数字と印刷物事アウトはありません そのエキサイティング。 通常、私たちは私たちのコンピュータにしたい アルゴリズムのいくつかの種類を実行します。 少し複雑なもの 単純な算術より。 このアルゴリズムは、ステップセットでわずかなステップである 実行する方法のための指示 特定のtask-- ただレシピが好きです。 あなたが最初の日を覚えているかもしれません デビッドは、私たちは部屋を数えていたクラス 人々の、どのように多くの人 部屋にいた。 あなたは、カウントに使用されるかもしれない 一つずつ。 1、2、3、4。 その場合、線形時間アルゴリズム。 しかし、ダビデはアルゴリズムを導入 あなたの部屋で人を数える 誰もが立ち上がるところ、あなたの言う 他の人の数、ということを付け加え 数アップ、そして一人が座る。 そして、あなたはそれを繰り返します。 つまり、アルゴリズムの一種だ。 私たちは、どのように効率的なANを分析することができます このアルゴリズムは、それが実行時だ基づいている。 しかし、私たちは少し話をしましょう そのことについてもっと後で。 だから、すべてのアルゴリズムがすることもできます 擬似コードで記述する。 擬似コードはただのような英語です 構文が表現するために使用 プログラミング言語。 例えば、私たちはユーザーに確認したい場合 私のお気に入りの数を推測するために、私たち のような擬似コードがあるかもしれません。 ユーザーは推測取得します。 推測が正しい場合、それらを教え が正しいか、そうでなければ、それらを伝える 彼らは正しくありませんね。 そして、擬似コードを簡単にする方法です アイデアやアルゴリズムを表す。 だから今私たちは実際に書きたいと思うかもしれません この言語では、そのコンピュータ 理解可能性があります。 だから私たちは私たちの擬似コードを書くことができ、 ソースコードにそれを解釈する。 これまでのところ、ソースコードが準拠する必要があります の特定の構文に プログラミング言語。 そして、これまでのところ、CS50に、私たちがした 主にC#を使用して。 だから、これは、cのソースコードがある可能性があります。 その後過程で、あなたが夜来る 他のプログラミングに接触させる PHPのような言語。 それともあなたも、あなたを他のクラスを取る場合 JavaやPythonの、あるいはOCMLをするかもしれない。 しかし、私たちのCプログラム言語で、これは どのようにするためのソースコードを書くかもしれません 擬似コードアルゴリズムその 私は先に説明した。 それでは、どのようにコンピュータが実際に行います それを理解できますか? 私は本当に、その前に言ったように 0と1を理解しています。 それでは、どのように、ソースから得るん ことができます何かにコード 理解? さて、私たちは何かを持っている コンパイラと呼ばれる。 あなたのほとんどのには思い出して のpset、プログラムのいくつかの種類を持っていた ドットcのファイルに書き込まれる。 そして、あなたは、makeと入力します。 それでは、makeはしているのですか? あなたのをコンパイルするmakeと入力することができます プログラムsomeone--理由 あなたのページセットを書いた人は誰でも、 おそらくDavid-- メイクファイルを作成した。 そして、それはあなたを実行するために知って作るに指示 打ち鳴らすと呼ばれるコンパイラと、その意志 その後objectにソースコードをコンパイルする 0と1のコード、 お使いのコンピュータが理解している。 しかし、少し後に、私たちは行きます コンパイラについての深さ以上である。 だから、そうwhere--、PSET 0をリコール あなたが質問がありますか? 聴衆:[聞き取れない]? スピーカー1:はい。 私は、彼らは実際に考えて オンラインである必要があります。 うん。 聴衆:それは[聞き取れない]のようですか? SPEAKER 1:それはありません。 ザはcs50.net/quizzesにあります。 聴衆:2013スラッシュ、クイズスラッシュ、 0を大幅に削減し、単にクリックスルー クイズ2013クイズ0、 切片スライドを確認してください。 スピーカー1:うん、君たちがしたいので、もし それを引き出し、あなたにそれを見て 自分のコンピュータは、それもいいのよ。 もう一度言う。 聴衆:[聞こえない]。 スピーカー1:うん、[聞き取れない] ダミー変数である。 ああ、そう? 聴衆:[聞き取れない]? スピーカー1:いいえ、ストライキ 試験ではありません。 申し訳ありませんが、彼女の質問があったた 試験でストライキ。 そして、それはありません。 だからPSET 0、君たちは、すべてを持っている必要があります スクラッチを使って何かを実装しました。 そして、私たちはいくつかの基本的なプログラミングを学んだ スクラッチを使用してビルディングブロック。 それでは、いくつか見てみましょう これらのビルディングブロックの それは、プログラムを構成している。 まずブール式です。 ブール式がものであり、 持つ0のか何か 2可能な値。 この場合には、trueまたはfalse、 オンまたはオフにし、yesまたはno。 非常に単純な、簡単な一例、 ブールを使用するプログラム 表現ここまで。 だから、ブール式のために 有用であることが、私たちはブール演算子を持っている。 これらは使用することができる演算子である 特定の値を比較した。 そこで、以下、持っているかに等しくない 以上よりも大きい、等しい、または に等しく、そしてより少ない またはより大きい。 しかし、これらの事業者は、非常に有用ではありません 私達はにそれらを組み合わせることができない限り、 条件。 だから、あなたたちは一から覚えているかもしれません その私たち、あなたのページセットから 条件を持っていた。 彼らは中にフォークのように、本質的に、ある あなたのプログラムのロジックという かどうかに応じて実行する 条件が満たされます。 だから私たちが持っていたのいずれかの条件に この過程で何度も使用され もし、そうでなければ、もし、それ以外の条件。 ここでは方法の例です あなたはそれを使用することがあります。 誰の違いを知っていますか ちょうど文すべての場合に使用して もし、他の詩ダウンの方法、 あれば、それ以外を合わせ? はい? 聴衆:[聞こえない]。 スピーカー1:その通りです。 だから私は持っていた場合であれば、この全押し 道も、この状態が戻る場合 真、それはまだ継続します 次の二つのテスト。 、一方、他 - もし、そうで 文1がtrueを返す場合、 他のものはテストされていません。 そのことについてご質問? クール。 だから、他ののif-elseを使用 あなたがそれをできるだけ知っていれば声明 これらのケースのいずれかである。 そこで、xが0未満である場合、それは知っている 間違いであることを行っていない 0よりも大きい。 次に、他のビルディングブロック 私たちが学んだことのループがある。 私たちは、ループの3つのタイプを持っている。 ループの場合、whileループ、 ループしながら行います。 そして、あなたが座って、一般的に、時 何かを書く、あなたが決定する必要があります 使用したい3のどれ。 では、どのようにそのいずれかを決めるのですか? 私たちが知っていれば私たちは一般的に、forループを使用する 私たちは反復処理する方法を何回 何かを通して、または何回 私たちは、タスクを実行したい。 私たちはいくつかが必要な場合は、当社は、ループ中に使用 稼働を維持するために真であるための条件。 そして、私たちは非常によく似ている間何使用 ながら、私たちは私たちのコードがで実行したい 少なくとも1つの時間。 道には何でもそうしながら、意志 常に少なくとも1回実行します。 しばらくして、一方、それ あれば、まったく実行されないことがあります 条件が満たされていない。 それとご質問? forループの構造がそう。 君たちは、このすべてを見てきました。 あなたはそれを初期化します。 あなたは、条件のいくつかの種類があります。 したがって、たとえば、私たちは、初期化可能性があります に関しては、私は0に等しい。 iが10未満である。 そして私は+ +。 私たちがやった非常にシンプルなもの。 whileループの場合は、同様に、あなたが持っている 初期のいくつかの種類を持っている、 条件のいくつかの種類、および アップデートのいくつかの種類。 だから私たちはまた、私たちのためのループを実装することができます whileループとしてこれを使用した。 同じく京畿whileループで、 私たちはいくつかの初期設定があるかもしれません、 何かを実行し、それを更新し、 その後の状態を確認してください。 だから今機能している。 私たちは一緒にすべてをかける。 私たちは、いくつかを書きたいかもしれません 関数の種類。 そのあなたは可能性のある一般的な機能 すでにメインで見てきました。 主な機能である。 これは、戻り値の型、int型を持っています。 これは主に、関数名を持っています。 そしてそれは、引数、argcとargvをしています。 だから、メインだけの機能です。 あなたが使用している可能性がありますその他の機能、 printf--のprintfはfunction--です GetIntで、TOUPPER。 しかし、これらはされているために起こる で私たちのために実装 ライブラリのいくつかの種類。 あなたたちには覚えている場合 このCS50.hライブラリまたは 標準I / Oライブラリ。 はい、質問? 聴衆:C言語でちょうど固有のメインですか? それだけの種類の[聞き取れない]していますか? スピーカー1:質問です メインをcに固有のものである場合。 そして、はい、すべての機能 主な機能を持っています。 これは、コンピュータのようなものの必要なだ どこを開始するために理解する コー​​ドを実行する。 聴衆:だから、[聞こえない]と思いませんか? スピーカー1:いいえ。 他の質問は? クール。 ですから、関数を使用することができます同じように それは、あなたはまた、あなたのためにすることができます書かれている 独自の関数を記述します。 これは誰かが可能性があることを関数で 体積を計算するために書かれている qは、例えば。 戻り値の型は、この場合には、ここにあります int型、私たちの関数名qと私たち パラメータのリスト。 そして、あなたは、データを記述する必要があることに注意 あなたがしたいパラメータの型 使用したり、他の機能にはありません どのような種類の知っている パラメータには、私は受け入れるべきである。 そこで、この場合には、必要 私たちの入力として整数。 では、なぜ私たちは関数を使用することをお勧めします? まず第一に、組織のための素晴らしい。 彼らはにコードを分割助ける より多くのチャンクを組織し、作る それ読みやすく。 簡素化。 これは設計に適しています。 あなたは、コードの一部を読んでいるときに main関数は、実際に 本当に長い、それはに難しいかもしれません 何が起こっているのかについての理由。 だから、関数にそれを打破した場合、 それが読みやすくなるかもしれません。 そして、再利用·能力を。 あなたがされています、コードの塊を持っている場合 と呼ばれる、または複数回実行し、 代わりに、そのコードを10回書き換え あなたの主な機能は、あなたがかもしれない それを再利用したいと思います。 あなたがそれを使用する必要がある。そして毎回 コー​​ドの一部は、関数を呼び出します。 だから今私たちが戻ってスクラッチを覚えていれば、 私たちはまた、いくつかの概念について話しました の一つは、ねじ切りされている。 スレッドには、複数の概念である コー​​ドのシーケンス 同時に実行する。 ダビデが持っていた初日に戻って考える あなたたちは、数をカウントオフ 部屋の中の人。 基本的に、何が起こっていた 上君たちのすべてがありました 別のスレッドを実行している。 そして、これらのスレッドは、一緒に来ていた その答えのいくつかの種類を取得します。 同様に、スクラッチでの、ときに持っている 複数のスプライト、あなたは可能性があります 猫と犬を飼っている。 そして、彼らは同時になります 独自のスクリプトを実行している。 つまり、スレッドの例です。 そして、他のコンセプトであったこと スクラッチで導入されたイベントでした。 そしてイベントは、複数の部品である あなたのコードは、相互に通信します。 あなたが使用された場合、スクラッチでは、これだった ブロードキャスト制御とすると、I ブロックを受信します。 そしてまた、問題セット4で、私達は見た 同様に、イベントの少し。 君たちは使用した可能性があります Geventライブラリ。 そして、機能があったwaitForClick これであなたが待っていた ユーザーがクリックしてください。 そして、あなたのクリックが、この場合には、だろう イベントとのクリックを待つ、あなたです イベントハンドラ。 そしてまた、あなたのpsetを実行を通じて そしてあなたは、あなたのpsetに取り組んで と接触した可能性があります これらのコマンドの一部。 これは、あなたの中に入力した内容です。 ターミナルウィンドウまたは何窓 それはへのG編集に現れ、 基本的に、コンピュータを移動します。 したがって、たとえば、LSが一覧表示されます ディレクトリの内容。 ディレクトリが新しいフォルダが作成されてください。 CD、ディレクトリ変更。 RMは、削除し、ファイルを削除します またはいくつかのディレクトリ。 そして、ディレクトリを削除する ディレクトリを削除します。 聴衆:[聞き取れない]? スピーカー1:うん、確かに。 あなたあれば申し訳ありませんが、質問があった これを入れてお勧めします チートシート上。 それは助けることができる。 あなたが部屋を持っている場合は、それを置くことができます。 また、十分なだけで、一般的に良いことだ あなたがそれを使用するときので、覚えておく あなただけにお勧めします それは覚えている。 それはあなたの人生がずっと楽にするでしょう。 私は、あなたの質問に答えるしましたか? だから今、私たちは少し話した ライブラリに関する簡潔に。 私たちがしてきたが、2つの主なもの これまでの過程である使用して 標準I / OおよびCS50。 物事はどのような含まれています 標準I / Oライブラリにある? うん、これまで私たちはprintfのを使用しました。 CS50では、GetIntで使用しました とのGetString。 そして、データ型は文字列にも起こります このCS50ライブラリ内で宣言される。 私たちは、約深さに少し詳しく説明します どのライブラリが動作し、どのように あなたのコードの残りの部分と相互作用する。 しかし、これらは、主に2つのものであることを私たち これまでの中で接触してきた もちろん。 タイプ。 これらは、どれだけ覚えてもいいです 各タイプは、どのようにするか、または表現される 何バイトタイプの各requires-- int型は4バイト; char型、1バイト。 フロートは4バイトです。 二重とは何ですか? 聴衆:[聞こえない]。 スピーカー1:うん、そうフロート しかしサイズを2倍に。 どのような長さ約? 聴衆:[聞こえない]。 スピーカー1:わかりました。 長いとは何ですか? 聴衆:[聞こえない]。 スピーカー1:うん、int型を倍増。 はい。 聴衆:[聞こえない]。 スピーカー1:ロング[聞き取れない]。 そして、長い長い、その二重です。 聴衆:いや、いや。 長いだけのintです。 これは、アーキテクチャに依存 前[聞き取れない] で、intは、同じサイズを有している。 [聞き取れない]。 スピーカー1:だから長く int値は同じである。 そして、長い長い ダブルintです。 クール。 そして、最後のタイプは何ですか? 聴衆:ポインタ。 スピーカー1:うん、私たちは学んだ ポインタについて少し。 とにかかわらず、ポインタが何であるかの それto--指し示すことはchar型のスターになる可能性が またはint型star-- それは常に、ポインタは4バイトです。 そのことについての質問? はい? 聴衆:[聞き取れない]? スピーカー1:だから長いとint型である このCS50アプライアンスで同じ。 聴衆:アプライアンスは、完全である 交換可能。 スピーカー1:うん。 それでは、長い長い二重intです。 聴衆:これは32ビットです? スピーカー1:32ビット、うん。 聴衆:だから[聞き取れない]? スピーカー1:はい、そうでない場合は 明示的に、あなたを言う 32ビットを想定する必要があります。 聴衆:それは何かを言うだろう 仮定するような アプライアンスのようなアーキテクチャ。 64ビットの場合、唯一のものは、その 変更は、long型とポインタである。 これらは両方とも[聞き取れない]。 スピーカー1:はい? 聴衆:質問。 だから練習クイズのいずれかで、 それはunsigned int型について尋ね。 それでは、どのように決定されるであろう INT [聞き取れない]から? スピーカー1:符号なし にも4バイトです。 しかし、何が署名した約異なっている intおよびunsigned int型? 聴衆:[聞こえない]。 スピーカー1:右。 一つは負の値を表すことができる。 しかし、どのようにそれはそれを行うのですか? 聴衆:[聞こえない]。 スピーカー1:ええ、それは1が保存されます ビットは符号を表します。 署名された1ビットを有していること 符号を表す。 そして、符号なしはただ、すべて陽性である。 聴衆:わかりました。 ですから、二重であることを言う フロートの倍のサイズ? スピーカー1:ダブル2倍である フロートの大きさ、はい。 聴衆:どのようにポインタが何 長い長い[聞こえない]? スピーカー1:だから問題はない方法です 長いlong--へのポインタ 4バイトしかときにはどのように その8バイト長い長い。 だからポインタであることを覚えて、 基本的に、非常に基本値で。 聴衆:[聞こえない]。 スピーカー1:うん、そうポインタ 単にメモリロケーションである。 だから、どのくらいのスペースが問題ではありません そのポインタが指しています。 それだけを追跡するために4バイトを必要とする そのメモリ位置の。 他の質問は? クール。 私が持っているので、最後の事 標準出力されます。 あなたが頻繁に使用する必要があります あなたが覚えていることは十分。 私たちが使用している場合でも、これは printfの、例えば。 そして、私たちはこれらのプレースホルダを持っている 書式コードと呼ばれていました。 だからパーセントのCのchar、int型のパーセントiの、 そして私達はまたパーセントdを使用することができます。 それは同じことだ。 しかし、一般的には、CS50の私たちにある パーセントiを使用するようにしてください。 フロートのパーセントF。 長い長いためパーセントLDと パーセントの文字列。 同様に、私たちはいくつかを使用してきた これらのエスケープシーケンス。 たとえば、バックスラッシュnの新しい行のために。 これは、書式設定しているときのためだけである 印刷fのあなたのコード。 はい? 聴衆:パーセントdは何のためにあるの? スピーカー1:そこで質問 パーセントdは何のためにあるのかでしょうか? パーセントdはint型です。 パーセントdおよび%は私も同じです。 聴衆:違いは何ですか バックスラッシュnとバックスラッシュrは? スピーカー1:だから問題は何である バックラッシュnとの間の差 バックラッシュR? 私は、バックスラッシュrを考えるis-- 聴衆:だからバックスラッシュrは単に暗示 行の先頭に戻ります 実際に新しい行に行かなくても。 だから、バックスラッシュrを印刷した場合 行の先頭に戻る あなたはあなたが上書き、より多くのものを印刷 すでに上のもの [聞き取れない]。 一方、nは実際に新しいに行く ラインと[聞こえない]に移動します。 スピーカー1:まあ、他の質問? かしこまりました。 を切った私はそれを手にするつもりだ 継続するダン。 [拍手] DAN:すべての右腕投手。 だから私は別の広いについて話されます あるクラスからのアイデアの範囲 週2のおおよその代表と 週3の開始はオフ開始 のだけの方法で鋳造、と などの特定の型の値を処理する 異なるタイプの値。 だから私たちはに文字でこれを行うことができます int型、int型に浮かぶし、 長いlong型は倍増する。 これらのことはすべて、方法として使用することができ いくつかの数値を処置する 他のいくつかのようなマイナスのchar 数値。 だから、このいくつかの問題が存在し、 あなたはキャスト時に来るもちろん、 int型へのフロートのようなもの。 だから、これは少し奇妙です。 私たちは、1.31であるフロートを持っている。 私たちは、万を掛け。 そして、私たちはintとしてそれを印刷。 この出力は何でしょうか? 10,000回1.31。 だから13000、推測ということです? 聴衆:私はそれが万だと思う。 DAN:だから私は万を乗じています 私はそれをキャストしています前に。 聴衆:ああ。 1 9があると思いませんか そして、いくつかの0の数字? DAN:あなたはいくつかの奇妙な数字があるかもしれません。 だから右、それは1.3倍万だ。 だから、13000です。 そして、この余分なweird-- 聴衆:13,100。 DAN:13,100。 、ロブ、ありがとうございました。 そして、この余分なweirdness-- この9,9-- 単純にこの鋳造からです ここで切り捨ててしまった それは持つべきではない。 うん。 聴衆:キャスティングが起こる 何か他のものの後に? DAN:だから私は印刷物でこれを持っているので、それが その前にこの乗算を行う このキャスティングを行います。 聴衆:[聞こえない]。 DAN:私は、それが最初にキャストだと思う うん、これ万になります。 何か他には? クール。 だから、これは13099です。 これはなぜ起こるのでしょうか? 不正確。 フロートは完璧ではあり​​ません。 彼らはの数を表現でき 有効数字の特定の数。 だから私たちは8 SIGのイチジクをプリントアウトした場合 このフロート、私たちはの種類を取得 醜い探し番号。 そして、それはだから1.31を正確にすることはできません 単純で表すこと 機械内の2のべき乗。 だから、最も近いを取ってしまう アップ終了する、推測する 少し低いという。 意味が? [OK]をクリックします。 さて、切り替えは別の方法である 条件文のすべてをやって 私たちは、単一の変数です気に。 したがって、この特定の例では、私たちはしている ユーザから整数を取得する。 そして、私たちは見ている その整数は何ですか。 おそらく、それは数だ 1と4の間。 つまり、私たちが求めているものだ。 だから、の切り替えを行う 変数名。 その後、可能性の症例を設定 それができる値。 したがって、1つの小文字は、それが低いと言う。 そして、あなたは外に出て破る スイッチ状態のため、 あなたが続けるされません。 次case--で 、ケース2とケースthree-- それはケース2の場合は、それだけに低下 それはのように見ているコードの最初の行 それは休憩を見るまでケース3。 だから、その理由は、あなたがする場合1を得る 低のみを印刷する私からです ここにこの休憩があります。 私は、言う、このbreak--を無視した場合 私はこのbreakaway--を投げた場合は、 低印刷う、そしてそれはだろ 中央を印刷し、それが壊れる。 休憩は重要な部分ですので、 スイッチ条件と 彼らはそこにあるべきである。 明示的に指定されていないすべてのケース デフォルトで処理されます スイッチの場合とはキャストする必要があります。 聴衆:だから1、2、3、 そして図4は、n個のでしょうか? DAN:nの可能な値。 はい。 うん? 聴衆:だからあなたが持っている [聞き取れない]のか? DAN:あなたは、低印刷したい それが中央を印刷したい それは壊れる。 聴衆:なぜそれが印刷したい 中央の場合[聞き取れない]? DAN:ケースの下だからすべてのもの ブレークが該当する前に。 だから、ケース1のプリントは、下にケースです のような1つは、この次のプリントである。 うん? 聴衆:[聞き取れない]? DAN:だからこの数は単なる特定のです 値、この変数 右、取ることができますか? それは理にかなっていますか? うん。 聴衆:[聞き取れない]? DAN:はい、ケース2が印刷だろう 真ん中、次に破る。 聴衆:[聞き取れない]? DAN:私は思いますか? 他にどのようなデータ型 あなたは切り替えることができますか? 聴衆:あなたは切り替えることができます 任意のデータタイプより。 しかし、それは唯一の文字の上にものをいう とintとそのようなもの、なぜなら あなたは、ポインタを切り替えるしている場合 それは本当に意味がない、 それものを許可すれば、負荷をかけてスイッチング あなたが原因浮動小数点のことを行います 精度、あなたは本当にないだろう とにかくそれをやってみたい。 だからかなり、単にintと そのような文字とか。 DAN:明示的な持っている場合ええ、それはだ あなたが知っている値が、私が思うに、することができ スイッチは実際に有用である。 良い? [OK]をクリックします。 適用範囲は、宣言された範囲である 変数が伸びている。 だから、このコードの小さなチャンクに私が持っている、 それがエラーの完全なだろう。 そしてその理由は、私はこのint型として宣言されている 私forループこれの範囲内である。 そして私はあることを参照しようとしている 外側のループスコープのそのiの。 そこで、基本的には、スコープについて考えることができます あなたが宣言し、何として 中括弧のセットの内部でのみ これらの中括弧内に存在する。 そして、あなたは試してみて、その変数を使用している場合 これらの中括弧の外には、よ コンパイラからのエラーが表示されます。 うん? 聴衆:だからこの1つは動作しません? DAN:これは、はい、動作しません。 ストリングス。 文字列のchar *。 彼らはまったく同じだ。 彼らはただの文字へのポインタである。 そして、あなたが持っている任意の文字列を終了する必要があります ただでバックスラッシュゼロ、と C大会。 これは、NULLターミネータと呼ばれています。 そしてNULL-- 首都N、資本U、資本 L、資本L-- と同じではありません NULLターミネータ。 これはポインタです。 これは文字です。 彼らは非常に異なっている。 それを忘れないでください。 それはおそらく、クイズになります。 私はクイズを見ていない。 うん? 聴衆:だから、NULLポインタ、たとえば、ある? DAN:はい。 聴衆:[聞こえない]は何? DANは:、と言う場合は、malloc関数が呼び出されたときに 取得するのに十分なメモリを持っていない 何でもあなたが求めているサイズは、 malloc関数は、NULLを返します。 関数であるときはいつでもそれは、基本的に、だ あなたは、ポインタを返すことになって ので、NULLに対してチェックする必要があります NULLはかなりgood--です それは、一種の、ガベージ値です。 それは限りポインタが行くようにゼロです。 あなたは関数を呼び出すたびに、 それがポインタを返す。 あなたがあることを確認するつもりだ そのポインタがNULLでないことを確認してください NULLは非常に一般的であるからである。 それは、ごみの戻りのようなものです。 何かが右行かなかったのであれば、 だけではなく、NULLを返す。 聴衆:[聞き取れない]? DAN:はい、それはこれだ。 聴衆:[聞き取れない]? DAN:このとしてそれをスペル。 これは、NULL終端です。 これは、小文字のN-U-L-Lの場合です あなたはそれをスペルだ。 聴衆:そして私はちょうど行きました 背中とそれをテスト。 そして、あなたは、浮動小数点を入れしようとした場合 スイッチに値が、それはあなたに叫ぶよ と言って、文は、式が必要です 整数型。 DAN:そこに行きます。 しかし、ええ、再び質問何でしたか? 聴衆:[聞き取れない]? DAN:だから資本N、資本U、資本 Lは、資本Lは実際のCの事である。 これは、NULLポインタであり、意志 みそのように扱われる。 あなたは今までに試してみて、スペルはありません NULL文字と任意のものを参照してください。 これ以外の方法で。 うん? 観客は:だから最大charに戻ったり ノートの何か、それだろう 同じ機能を具現化する [聞き取れない]として? 聴衆:だからあなたが参照している getcharがからchar型の最大値を返すか、 何それは何ですか? 聴衆:うん。 聴衆:うん、そう一般 すべてのそれらの事を表す用語 センチネル値です。 だから、GetIntでからint型の最大値を返すように とgetcharがからチャーmaxが、それはだ あれば、大丈夫のようであると考え これらのことは、私たちに戻ってきている 何かが間違っていた。 ポインタの場合、私たちは持っていたりする その誰もが、この標識値 時に同意します。 そして、これはあなたが返すものです 物事がうまくいかないとき。 だから、char型の最大は、私たちが使用しているものです 何かを表現する NULLまたはgetcharがなどがある。 聴衆:だからにgetcharをテストしている場合には、 あなただけのNULLを入れることができます? それが違いを生むか? DAN:あなたは単にNULLをチェックしませんでした。 あなたが原因のchar maxをチェックする必要があるだろう 関数からの戻り値は 文字ではないポインタ。 うん? 聴衆:この質問は尋ね 文字列の長さ。 NULL文字が含まれないことに? DAN:いいえ そして、それは実際にどのように文字列の長さです それは通過しますので、停止することを知っている 文字の使用しているアレイまで、 それはNULL文字を見ている。 そしてそれは、すべて、様だ 右、私は終わりだ。 聴衆:[聞こえない] 5? DAN:こんにちは、5つになります。 うん。 そうアレイは連続している メモリのブロック。 彼らは言って瞬時にアクセスを持っている カーリーの配列の名前と、その後、 どこに行きたいどのような指標ブレース、 、それらが通ってゼロからインデックスさだします 1を引いた配列の長さ。 そして、彼らはのタイプによって宣言されている あなたが保存しているもの アレイは、アレイの名前を入力し、 どんな大きさは、その配列のものである。 だから、これは長さのchar配列である これらの値を持つ6。 うん? 聴衆:[聞き取れない]? DAN:ええ。 聴衆:[聞き取れない]? DAN:あなたは何が起こっているかをお持ちの場合 配列に既に作った。 だから、代わりにこれを指定することができるように、 あなたの任意の名前、チャーと言う 配列は空括弧は中括弧に等しいです HコンマEコンマLコンマLカンマを引き締める OコンマNULL文字 と中括弧。 それはまた、宣言として働くだろう。 聴衆:[聞き取れない]? DAN:次に、あなたが持っている必要があります サイズがすでに作った。 聴衆:[聞き取れない]? DAN:はい。 すべての右腕投手。 コマンドライン引数は、方法です ユーザーからの入力を取得するように 主への引数。 主な2つの引数を取ります。 されている引数の数 コマンドラインであり、aに沿って通過 文字列のベクトルまたは文字列配列 すべての引数の。 だから私は、言う、のような関数を呼び出した場合は、 1スペース、2スペース、3アウトドット、 argcが4になります。 とargv 0アウトドットになります。 Argv1は1になります。 argv2 2 argv3は次のようになりますでしょう 3、その特定の場合には。 うん? 聴衆:[聞き取れない]? DAN:配列の最後の要素 アレイは、長さのargcであるため、プラス ARGBの一つ、最後の要素 NULLポインタがある。 それは、argcはプラス1です。 私は、それを言った場合にはそう 0アウトドットであるとargvされるであろう。 argvは1が1 argv2が2 argvの3は3である。 1大きくなっているのargv 4、 argcはなくNULLになります。 そして、それはNULLポインタです。 はい。 文字列であるため、そして、それはだ char型の星がポインタである。 だから、同じ型である必要があります。 うん? 聴衆:二つの質問。 したがって、1つ、違いは何ですか 1型以外これとのGetString ユーザエンジンで? 二、それは内格納されている あなたの最近の記憶? だから様、のGetStringう [聞き取れない]であること? DAN:それはどこに保存されている? それが保存されている場所私は知らない。 聴衆:だから、実際には、あなたがどの​​ようにいずれかの知っている あなたはそれが引数の呼び出し機能 スタックに格納されていますか? だから、argcとargvはmainの引数です 彼らは、スタック上にある、または実際に ちょうどあなたのように何を考えて上記の スタックの開始。 他の部分は何でしたか 質問の? 聴衆:だから何だ[聞き取れない]? DAN:ええ、それは単に別の方法です ユーザからの入力を取得する。 この1つは少し、より効率的で それはあなたのためのスクリプトの手軽だ ちょうどあなたのメインに引数を渡すことができます 機能ではなく待つことよりも ユーザーのためにあなたはすべてのユーザーを持っていない場合。 聴衆:そして、ええ、文字列を取得する [聞き取れない]になります。 それはあなたが必要なものを保存するようにします。 DAN:そうですか? 聴衆:[聞き取れない]? DAN:はい、argvの0は常に含まれてい 関数呼び出しのドットスラッシュ。 うん? 聴衆:[聞き取れない]? DAN:はい、各引数である 彼らので、NULL文字で終了 文字列です。 聴衆:[聞き取れない]? DAN:はい、のargv argcがNULLポインタである。 聴衆:[聞き取れない]? DAN:そうそう。 ええ、申し訳ありません。 聴衆:だから[聞き取れない]? DAN:あなたが持っていたのであれば問題である コマンド·ライン·ドットは、2、1からドットをスラッシュ れるコマンドライン数 引数が2であるか、それが3でしょうか? 聴衆:私は、そうでないと思う 本当に問題。 私が言う傾向があり、ああ、あなたは合格しなかった 任意のコマンドライン引数と、 明らかに、あなたは関数を呼び出した。 だから私は声に出して除外する傾向がある コマンドラインから関数 それはだにもかかわらず、引数 ARGVに含まれています。 DAN:しかし、それはtest--上に存在していた場合 yeah--、またあなたが何かを言うなら argcは同様に、3に等しい あなたは安全な地位にいる。 うん? 聴衆:[聞き取れない]? DAN:これを呼び出した場合は、代わりに私は思う argcと文字列のargv括弧内の 同じ型を維持し、単にと呼ばれる のような別のそれらは何か aとb、それはまだ動作します? そして、それはまだ動作します、 あなたがjust--う 代わりにargc--使う あなたはaとbを使用すると思います。 うん? 聴衆:[聞き取れない]? DAN:そこで質問のGetStringです ヒープでメモリを保存するために行く のGetStringがcharであるため、*。 それは、ヒープでメモリを保存する 実際の内の今のmallocの呼び出し のGetStringの実装です。 [OK]を、先に進む。 セキュリティ。 だから、本当に安全であるとは、noに頼る 1、あなたはいずれにも誰もアクセスを許可しない なぜあなたの情報の 誰もが自分のマシンを構築し、 独自のオペレーティングシステム、すべての 明らかに最初からプログラム、および 他のマシンに接続しないでください インターネットを介して。 だから、コンピュータが安全ではありません。 彼らは実際にある。 私たちは他の人を信頼しなければならない。 そして、セキュリティの考え方は、あなたがしているということです の量を制限しようとする あなたが必要とする信頼。 そして、あなたはそれを行う手段の一つに 暗号を介して行われます。 暗号化は、本質的に、であり、 私たちは秘密を持っている。 時には私たちは私たちの秘密を渡す必要が に沿って通って、たとえば、インターネットや 他のもの。 そして、私たちは人を望んでいない これらの秘密を知っている。 だから私たちは道に私達の秘密を暗号化する 私たちは誰も把握することができないことを願って。 だから私たちはused-- このclass--のコースを通して シーザー暗号のようなものと 非常に、非常にともに[聞こえない]は、 物事を暗号化する安全でない方法。 彼らはどのような彼らを理解するのは簡単だ で、あなたの秘密は何ですか。 現実の世界は、はるかにを使用しています 複雑な暗号化方式。 そして、私たちは入ることはありません それよりもはるか。 デバッグ。 GDBは最高です。 私は再びこれを強調するつもりです。 すべてのGDBのすべての時間を使用してください 時間は、あなたが問題を抱えている。 GDBにおいて有用なコマンドがある あなたが行のいずれかを通過する、破る 番号、関数名、本質的に ここで、コード内で停止する、 と制御を取ることができる。 印刷は、変数を取得し、出力します その変数は、その時には何でも あなたの実行のポイント。 次に、あなたの実行が移動します 一歩沿い。 そして、関数内のステップを進む あなたの実行中。 他のものはどのようにある、経営されています あなたが実際にあなたのコードを実行します。 続行は必要なすべての措置を講じ 次のブレークポイントに到達します。 そして、多くの、多くの他がある。 それらを検索します。 彼らは偉大だ。 うん? 聴衆:[聞き取れない]? DAN:はい、デバッガです。 だから、デバッガはそのプログラムです あなたがプログラムをデバッグすることができます。 それはのためにバグを見つけたプログラムではありません あなたは、しかしそれは素晴らしいことだ。 そして、私の最後の検索である。 だから私たちが話した検索の種類は このクラスの約線形探索であり、 これは、各目を通すことだけである 探索空間の要素、1 当時の要素、あなたは何を見つけるまで あなたは、またはあなたが到達するまで、探している あなたの探索空間の終わりに あなたが見つけることができなかったと言う点 あなたが探していた要素。 これは最高の状態で一定時間がかかり、 その1の0であり、最悪の線形で nは0である時、。 必要バイナリ検索、 浅ましい要素。 あなたの要素の真ん中に移動し、 要素は、あなたが探しているかどうかを確認 要素より大きいか小さい あなたが真ん中にいること。 それより大きなです、あなたが下と言う あなたの探索空間のあなたです 現在の位置、中間、 あなたがプロセスを再起動します。 それが小さいなら、あなたが言うに見える ええ、最大何the--は? 聴衆:[聞き取れない]? DAN:はい。 で教えられています並べ替えの任意の並べ替え クラスには、テストのために公正なゲームです。 [笑い] DAN:そして、あなたは持っていなかったという事実 設定の問題のためにそれを行うためには、公正だ テストのためのゲーム。 聴衆:私たちはその上に行くことができますどのようにto-- DAN:それ以上消えてしまいます。 SPEAKER 2:の実際のコード [聞き取れない] study.cs50.netにあります。 だから、練習問題を見れば のマージソートページで study.cs50.net、コードがあります ソートマージ実装する。 だから、実装する必要はありません それを自分で今夜。 しかし、あなたはむしろそれを理解しておいてください ただそれを暗記より。 聴衆:[聞き取れない]? SPEAKER 2:上のマージソートページ study.cs50.net、練習がある あなたはを通してクリックした場合、問題 問題は、一番最後にあります マージで解決策、 ソートの実装。 しかし、あなたはそれを理解しておいてください むしろそれを暗記より またはそれをコピーする。 聴衆:そして完全に有効 試験の問題は次のようになります ここのようなものがリストです。 このリストは後にはどのように見えるのか 選択の1つのステップの並べ替えや 挿入ソートまたは何でも。 リストの一つの完全な反復。 だから、あなたが必要としてしまうしない場合でも、 そのためのコードは、あなたがそれを理解する必要があります それが起こっているのかを知るには十分 この配列を変更することができる。 DAN:それは私のためにそれだ。 [拍手] LUCAS:ねえ、みんな。 私の名前はルーカスです。 私はすべて、再帰について話をするつもりだ 私たちが学んできた種類であり、a すべてのポインタを少し。 OK? すべてのだからまず、再帰。 それはそれを言うことは何を意味するのか 関数は再帰的である? 観客は:自分自身を呼び出します。 ルーカス:OK、ええ、自身を呼び出す。 したがって、たとえば、この絵が好きです。 それは、内部​​の絵のようなものだ 絵ののように。 だからたとえば、ダンとしてhave--できる それは、二分探索について話していた。 バイナリ検索が1つの方法 再帰はあなたがしているという事実である 番号を見つけよう。 だから、真ん中に移動します。 そこの数字ならば、あなたは確認する 左中、右中。 あなたが見つけた場合、次に番号です 左側にあることを行って、それは同じだ もう一度検索を行うようなことが、 ただ、リストの左側にある。 だから、それがどのように聞こえるかだ のような、それは再帰的です。 あなたたちは、再帰的な持っている理由だからです マージソートのためのソリューション。 [OK]を、ので、ここでの例です。 それでは、私が選択したいとしましょう 1からnまでのすべての数字。 Iは、nの和ことを実現することができる 数がn個プラスnはマイナス1までです。 しかし、その後、私はnのマイナス1を見ればプラス nはマイナス2プラス1、それは同じだ 数字を合計するようなもの までのnはマイナス1。 だから私は、同じ和の合計を言うことができます nはマイナス1のnのプラス合計に等しい。 それは理にかなっていますか? そして、私はまた何か他のものを持っているだろう ということで、基本ケースと呼ばれる 最大数の和 ゼロにゼロになる。 だから、すぐに私は数​​に到達するように ゼロ、私はカウントを停止します。 それは理にかなっていますか? そこでここでは方法の例です 私はそれを実装することができます。 だから私はいくつかの中で、この機能を持っている。 つまり、整数nを取ります。 nがある場合だからここに私が最初に確認してください 以下はゼロに等しい。 だから、ゼロ以下のだと、私は 私たちの基本ケースである、ゼロを返します。 そうでなければ、私はちょうど戻ることができるnのプラス 数字の合計から 1からnマイナス1。 意味が? [OK]をクリックします。 だからここには次のようになります。 あなたは2等号の合計を持っている 2プラス1の合計。 そして1の一部はプラス1です 0 0の和。 意味が? だから私たちはあなたのスタックを見れば このプログラムは、これは次のようになります。 まず、主な機能を持っています。 そして、主な機能 合計2と呼ばれる。 そして、合計2ああ、和、言おうとしている 図2は、2プラスワンの合計に等しい。 だから私は、スタックに1の合計を追加します。 そして、1の合計は、の合計を呼び出すために起こっている また、追加されようとしている0、 スタックを意味します。 あるこれらのもののそれから、それぞれの 互いの上に返却する必要があり 他のものは続けることができます前に。 ですから、例えば、ここでは、0の合計は、 まず、0を返すようになるだろう。 そして、1の合計を選択します。 その後、1の合計がしようとしている 2の和に1を返す。 そして最後に、2の和が起こっている 主に3を返します。 それは理にかなっていますか? それはどのように理解することは本当に重要です スタックは、働いてしようとされている それは理にかなっているかどうかを確認します。 [OK]を、そのように並べ替え。 では、なぜ重要なのソートされている、 まず? なぜ気にしなければならない? 誰ですか? 私の例を与えるか? うん? 聴衆:[聞こえない]。 LUCAS:うん、OK。 だから、より効率的に検索することができます。 それは良い方法です。 したがって、たとえば、私たちはたくさんある 物事、実際には、私たちの生活の中でその 並べ替えられています。 たとえば、辞書。 それはすべて持っていることは非常に重要です オーダーのいくつかの種類の単語その私たち 簡単にアクセスすることができます。 だから、彼が言っていたんだ。 あなたは、より効率的に検索することができます。 それは持っているだろうどのようにハードを考える 言葉がでていた辞書 ランダムな順序。 あなたは、ほとんど、見てみなければならないでしょう 一つ一つの単語を見つけるまで、 あなたが探している単語。 あなたもフェイスブックを使用している場合は、時 あなたの友人を見ている、あなたがしている Facebookがあなたを置くことを見に行く ものの上に近い友人の あなたは、はるかにそれに話をしないこと。 あなたはの底にすべての道を行けば あなたの友達リストには、次のように表示するつもりだ あなたはおそらくさえない人 あなたが友達だことを覚えておいてください。 Facebookがソートされますので、それはだ 方法に基づいて、あなたの友人 あなたが彼らにある閉じます。 だから、データを編成する。 また、ポケモン。 だから、すべてのポケモンがわかり 番号があります。 そして、それは簡単なようなものだ データにアクセスする方法です。 聴衆:ポケモンへのアクセス。 LUCAS:うん。 聴衆:[聞こえない]。 LUCAS:うん。 そう、選択ソート。 選択ソートを選択しようとしている リストの最小のソートされていない値の各 各反復の時間。 それは一種のあなたが並べ替えのようなものだ あなたの頭の中であなたがしようとしているとき 手持ちのリストをソート。 基本的に、あなたが行うすべてがあなたが見ている 最小数のため。 あなたは、ソートされたリストに入れて。 そして、あなたが探して 次の最小数。 そして、あなたがやり続ける そののように。 だから、選択ソートを使用すると、基本的にはある 毎回最小を選択 ソートされていない値。 ソートの最後に入れて リストの一部。 そして、それをやり続ける。 それでは、すぐに何を見てみましょう これは次のようになります。 だからここに並べ替えます そしてソートされていないリスト。 だから、リストのソートされたため、 それは最初は空です。 そして私は選択するつもりです 2は、ここで最小数。 だから私は、数2を取得し、私が入れ リストの先頭にある。 そして私は、次の最小を探す 3である要素。 だから私は最後にそれを置く ソートされたリストの。 そして私はそれをやり続ける。 私は4を見つけて、最後にそれを置く。 5を見つけて、最後にそれを置く。 そして、それらの時代のどのすべてのことを見て 私は最後にそれをされて入れて言っている、 基本的に2つの値を交換する。 OK? そして最後の、あなただけの 1より多くの要素を持っている。 だから、それがすでにソートだ。 そう、挿入ソート。 あなたはまた、必要があるとしている挿入ソート ソートさを持っていることのようなものと ソートされていないリスト。 唯一のことは、そのたびに、つまり あなたはソートに要素を追加している リスト、あなただけの要素を選ぶこと ソートされていないリストの前にある。 そして、あなたは何を見つけるつもりだ それは、ソートさであるべき位置 リストの一部。 それではこれがそうであるか見てみましょう これは、より理にかなっている。 だから最初は、例えば、私がしようとしている で3番を挿入する リストの一部を選別した。 だから、リストには何もありません。 だから、僕は3番を置くことができます。 今、私は数に5を追加したい リストのソートされた部分。 だから私は、数字の5を見てください。 私はそれが3以上だと気づく。 だから私は、それは3の後でなければならないことを知っている。 だから私は3と5を置く。 それから私は、数2を挿入する。 私は、数2が実際にあることに気付く その後3と5の両方を持続。 だから私は実際にそれをすべて配置する必要があります リストの先頭にある道。 だから私は、ちょっと、すべてシフトしている ソートされたリスト内の要素私ができるので、 数2のためのスペースを作る。 それから私は、数6を参照してください。 私はそれが5の後でなければならないことがわかります。 だから私はそこにそれを置く。 そして最後に、私は数4を見てください。 そして、私はそれが必要に気づく 3と5の間である。 そして私はそこにそれを置くとシフト 他のすべての要素。 意味が? バブルソート。 だから、バブルソートを使用すると、しているものを基本的に do--に行く私たちは、バブルと呼んで あなたはlist--を通過ソートので 私は示していれば、実際には良いでしょう あなたが好きthis-- あなたが比較するつもりだ 隣接する数字。 そして、あなたは彼らを交換するつもりだ ポジション彼らがいないのであれば 正しい順序で。 したがって、基本的に何が起こっている ここで起こり、例えば、 あなたが8と6を持っている。 あなたは、ソートされた順序がことを知っている 実際に右、6,5であること? だから、受注を交換するつもりだ。 それから私は、ここに8と4を参照してください。 そして、私は同じことを行う。 私は再び交換します。 そして最後に、2および8。 私はまた、それらを交換。 これは、バブルソートのための後と呼ばれています これらの反復のそれぞれ、実際に、 リスト内の最大数は、すべての取得 リストの最後への道。 それは理にかなっていますか? それをスワッピング続け​​るので 、右に移動する。 [OK]を、これは2回目の反復である。 それは同じことになります。 私は1つのスワップをやると 最後のもの。 私は全くスワップは存在しないこと そしてリストがソートされます。 だから、バブルソートで、私たちは基本的に維持 リストを通過するとスワッピング 物事は私がしなかったことに気づくまで、 その繰り返しをやってあらゆるスワップ、どの リストがすでにソートされていることを意味している。 意味が? それでは少し話そう 時間の実行に関する。 だから、あなたたちはビッグを覚えていますか O、オメガ、及びシータ? うん? [OK]を、まず、ビッグO何ですか? 聴衆:[聞こえない]。 LUCAS:ええ、それは最悪のケースと呼ばれています ちょうどそれがだことを意味し、実行時、 どのくらいのプログラムを期待する 実行するために取る。 同様に、用語でof-- このcase-- nの。 の要素数 最悪の場合にはリスト。 同様に、最悪の場合には。 バブルソートのためにそのため、例えば、 私たちは、n個の正方形のビッグOを持っている。 なぜそれを持っていますか? なぜバブルソートビッグO nの正方形である? 聴衆:[聞こえない]。 LUCAS:うん、そう最悪の場合は、になります という私は、n個の反復を行う必要があるでしょう。 だから、反復のそれぞれがしようとしている 最後に最大の要素を持って来る リストの。 だから、最悪の場合は、私が持っているということです その事をn回行う。 そして、それらの時間のそれぞれについて、私がする必要が 私は比較する必要があるため、n個のスワップを行う 各二つの要素。 だから、それがnの二乗の理由です それはn倍のnだから。 次に、選択ソートもnの正方形である ので、各反復のために、私がする必要が 一つ一つの要素を見て リスト中。 そして、最小を見つける これは私がしなければならないことを意味 n個の要素に目を通す。 そして、私はそのn回のためにしなければならない 私はすべてのn個の要素を選択する必要があります。 挿入ソートもnの正方形である 最悪のシナリオは、意志ため 、いずれかになり、私は挿入する必要が n個の数字、右か? だから私はすでに、私は行くよことを知っている n個の反復を持つ。 しかし、私は持っていたこれらの数字のそれぞれについて、場合に 中の数字のすべてを見てする ソートされたリストと、それをすべての方法を置く 前に、それがn個の正方形になります それはn倍のn再びになりますので。 意味が? どのようなオメガはどうですか? 聴衆:[聞こえない]。 LUCAS:それは最良のシナリオです。 だから、多くの時間のために、ようなものだ 最良のシナリオであり、ソーティング リストがすでにソートされている場合。 だから、本当に持っていない 何もする。 バブルソートの最良を持って n個の場合のシナリオ。 君たちはどうして知っていますか? 聴衆:[聞こえない]。 LUCAS:ええ、あなたはを追跡した場合 データ比は、任意のスワップを持っていたかどうか あなたが何かを持っている場合ではない、に設定のように 反復があれば、そこにあった場合はtrue リストには、すでに、基本的には、ソートされ 何が起こるために起こっていることは、私はするつもりです。 各2を交換しよう 隣接する要素。 私はそれを見に行くよ 何スワップはありません。 そして私はちょうどすぐに戻ります。 だから、私はしなければならなかったことを意味します リスト1の時間を通過します。 私が見ているのでだから、Nさん n個の要素で。 なぜ選択ソートのn乗? ええ、リストがソートされている場合であっても、用 選択ソートの反復ごとに、私 最小の要素を選択する必要があります。 だから、それは私が見てアウト持っていることを意味します ソートされていないすべての要素で 一覧表示し、最小値を求める 反復ごと。 それは理にかなっていますか? 挿入剣はnなぜなら中 私が挿入しようとしている場合 数字と数字のすべて、ときに私 それらを挿入しようと、私は彼らがいることがわかり 右の位置にある。 私は他のすべてをチェックしに行く必要はありません ソートされていないリスト内の番号。 それがn個になりますだから、なぜだ。 意味が? そして、シータは何ですか? 聴衆:[聞こえない]。 LUCAS:何、申し訳ありませんが? もう一度言って。 聴衆:[聞こえない]。 LUCAS:その通り。 だから、その選択のみを見ることができます マージに格納されたソートθをしています。 そして、あなたは唯一のシータを持っているので、それはだ ビッグOとオメガの両方が同じである場合。 [OK]をクリックします。 そして最後に、ログnはソートはマージ。 そして、ダンは、ソートマージ、言っていたように 種類と同じように似ている あなたは、バイナリ検索を行う。 だから、リストを取得。 そして、あなたは半分にカットするつもりだ。 そして、あなたはそれらを切る 小さい半分に。 そして、あなたはそれらをマージ。 君たちは正しい、ことを覚えて? [OK]を、彼は言っていたように。 [OK]を、ポインタ。 だからポインタとは何でしょうか? 聴衆:[聞こえない]。 LUCAS:アドレス。 [OK]をクリックします。 私はダビデはの束を示していることを知っている binkyのビデオや物事のポインティング お互い。 しかし、私はポインタと考えたい 単なるアドレスとして。 だから、起こっている変数だ アドレスを格納する。 だから、ちょうどこの特別な変数です それは4バイト長である。 何かへのポインタであることを、忘れないでください 当社の32ビットのための長い常に4バイト マシンの場合とそう アプライアンス。 そして、それはただの場所を持ってい その中の変数の。 そう、このメモリは、基本的には、あります。 そのように、メモリの各ブロックは、実際にはA有する のアドレスであるラベル、 slottyメモリ。 だから、私が持っていることを意味し を指すポインタ これらのアドレスのいずれか。 だから私たちは、ポインタを使用します理由は、 私は場所を覚えておく必要がある場合 特定の変数がメモリである。 そして、あなたたちは、これらのいずれかを覚えている 私は機能を持っている場合のケースがあった 私は実際にあなたがしたい場合 実数のためのスワップ、実際に私 ポインタを送信する必要があります。 変数ではない。 あなたたちはそれを覚えていますか? 違いbetween-- 名前は何ですか? 値による呼び出しと呼び出し 参照によって、右か? うん、[OK]をクリックします。 だから値で呼び出します。 あなただけの変数を送信すると あなただけの値を送信している機能。 だから、実際に送信している 変数のコピー。 そして、あなたのプログラムは、あまり気にしませんでした 実際に同じ変数であれば約 コピーが作成されます。 そして、参照があることを意味することによって呼び出す 私は実際のコピーを送信しています その変数へのポインタ。 だから、私が送信していることを意味します その変数の場所。 だから私はの場所を持って感じる 私は関数を呼び出す変数、 ポインタで、私は実際にことができるよ 主にあったデータを変更する。 意味が? なお、ポインタは、コピーである ポインタがまだの実アドレスを持ってい 私が変更したい変数。 意味が? だから、ポインタを作成する。 覚えておいて、ポインタは常に持っている それが指してタイプ 星にしてから。 そして、あなたが名前を置く。 だから、あなたが持っているときはいつでもあることを覚えている どんなスター、それはへのポインタのようなものだ そのどんな変数 あなたが持っていたタイプ。 だからここにスターでは、例えば、それはだ ポインタと整数。 そして、char型星がポインタである チャースターなど。 うん? 聴衆:私たちが持っている場合 nは体へのポインタは、X星に。 私はそれをxへのポインタが作成されます知っている。 それはまた、整数xを宣言していますか? ルーカス:そう、あなたはn個の星xを言う、 あなたはへのポインタを作成していない 変数x。 あなたは、Xという名前のポインタを作成している。 聴衆:[聞こえない]。 LUCAS:私はn個の星xを言うとき、私は私 ねえ、メモリ内に、私はするつもりだ、と言って これらの3つのボックスのいずれかを取得します。 そして、私はそのことを言うつもりです である、Xになるだろう ポインタになるだろう。 ポインタについて興味深い何か 私たちは彼らが持っていると言うことです 32ビットマシン用の4バイト。 そしてその理由はからです 4バイトは32ビットです。 そして、実際に64ビットであるマシン ポインタアドレスを持っている 64ビット長であることを。 だから、それだけで意味の大きさ マシンのアドレスが異なっている。 だから、参照と間接参照。 その2つの演算子があります あなたたちは忘れてはならない。 最初のアンパサンドです。 二つ目はスターです。 あの星とこのことで混乱しないでください 主演ために、次のことを覚えている このような場合には、n個の星を持っている。 それは一緒にすべてのもののようだ。 ないn個のスペーススターはありません。 だから、それがタイプだということを意味します。 あなたが持っている時にあることを、忘れないでください 変光星、あなたがしている タイプの話。 あなただけのスター、次にしたら 変数の名前は、それがあることを意味します あなたは、ポインタを逆参照しただ あなたが見ていることを意味します ポインタは、アドレスを見つけることです 、そのアドレスに行く、を指す そしていつでも見 あなたがそこに持っている。 だから私はあなたが持っている時というのが私の生徒たちに伝える 星が、あなたはそれがだと考える必要があります の内容の省略形。 あなたは、ポインタを持っているなら、あなた スターポインタの操作を行い、それがだ ポインタの内容。 だから、それが指して何に行く そして一定の内容を見てください。 そして、アンパサンドは同じです のアドレスとしてのもの。 私のようなA--変数を持っているのであれば、してみましょう int型のaが等しい私がやったと言う3-- 私はそれのアドレスを検索する場合 可変メモリ、私はちょうど行うことができます アンパサンド。 だから、のアドレスです。 意味が? そこでここでは例です。 これはint型bおよびint型Cが不足しています。 3手段に等しいint型だから 私はメモリに行くつもりです。 そして、私はスロットを見つけるつもりです ここで数字の3を置く。 そして、整数、bは4に等しい。 私は同じことをするつもりです。 メモリに移動し、番号を入れる ボックスのいずれかの4。 そして、INTは5に等しい。 別のボックスを見つけ、5番を置く。 だから、この行は何をしているのですか? n個の星のPAはアンパサンドaを等しい。 だから、まず、n個スター年率。 それは何をしているのですか? 聴衆:[聞こえない]。 LUCAS:うん、そうnはスターのPA、まず、 PAと呼ばれるポインタを宣言します。 そして、それはの値を代入だ のアドレスにするために、そのポインタ。 だから、アンパサンド。 それから、私がスターPBを行う場合、 スターPBは何ですか? あ、ごめん。 これはまた、不足しています。 n個の星のPB。 私はスターのPCを意味する。 私は、とても残念です。 それは同じことだ。 しかし、今、私はポインタを作成するAR良いよ bにし、Cへのポインタである。 うん? 聴衆:[聞き取れない]? LUCAS:はい。 だから、メモリに移動し、あなたがに行けば PAのために指示した箱、 あなたが実際に行っている のアドレスを参照してください。 OK? うん? 聴衆:[聞き取れない]? LUCAS:ええ、ポイン​​タがアドレスです。 それを忘れないでください。 これは、最も重要なのようなものだ ポインタについての部分。 保管およびアドレスあります いくつかの変数へ。 何か他には? 他の質問は? [OK]をクリックします。 だからポインタと配列。 覚えておいて、私はアレイ3をint型行うときに、 基本的に、私がやっていることは、私は親切である の、ポインタで宣言。 だから、配列は種のへのポインタのようなものです メモリ内の特定の場所のI 整数の3つのスロットに割り当てられた。 それは理にかなっていますか? 私はint配列3を実行したとき、私は何だ 基本的には、3を作成して、やって メモリのスロット。 だから、僕は、メモリ内の3つのスロットを見つける。 だから私は、その後、スター·アレイ、それを行う場合は、 基本的に、アレイの内容を意味し、 私はポインタを消去することを意味し、私は行く それが指してその場所に、 と私はナンバーワンを置く。 そして、私は星の配列プラス1をすれば、 それは、配列をやって同じことだ ちょうど私が行くことを意味カッコ1、 それが指し示す場所だ。 そして、プラス1になる 私は一つの位置をずらす。 だから私は、実際には、この位置に移動します と数2を置く。 そして、最終的には、ときに私が行う 配列プラス2、私はどこへ行く での配列のポインティング。 そして私は、メモリブロックに移動します。 そして私はここに3番を置く。 うん? 聴衆:だからスターアレイが単に 非常に最初のポイントを言って。 そして、あなたは理由だけで、1を追加することができます 私たちは、本当にしている その最初のアドレスを参照している。 LUCAS:うん。 なぜ、例えば、配列を言うのですか 0、アレイ1およびアレイ2? 私は、なぜあなたは0をしますか、言っている 1、2、3の代わりに1、2、3? 理由の一つは、一つのコンピュータである プログラマが開始することを好む 0からカウント。 あなたは、アレイ0をするときので、二つはある、 それは、配列をやって同じことだ 私はに行く意味プラス0、 その位置、と私はしないでください 任意のメモリ·ブロックをスキップします。 だから私は、任意のメモリブロックを移動しないでください。 うん? 聴衆:[聞き取れない]? LUCAS:だから彼女は何であるか尋ねるだ 何の違い これかのmallocをやって。 違いの一つは、ということです int配列3が作成される スタック上の配列。 そして、私は、それをmalloc関数をするとき ヒープ上に作成します。 それは理にかなっていますか? それでは、どのようmalloc関数は、実際に動作しますか? では、なぜ私たちも、malloc関数を使用する必要があるのですか? アウトすべての図のあなたのコンパイラの種類 あなたが宣言された変数。 そして、彼はすべてのためのスペースを作成します。 それらのスタック内。 だからあなたのすべての変数をしようとしている どこかにスタックにするために。 だからここの環境変数です。 これらの変数については、これは基本的に、スペース メモリ内で割り当てられている コンパイル時間を。 だから、コンピュータに搭載されていることを意味します これらの変数のすべてを知っている 事前に。 それはどのような値を知る必要はありません あなたはそれらに置くつもりだ。 しかし、それはどのように知っている必要があります あなたが必要とするメモリ量。 しかし、今のは、たとえば、以下のことを言わせて、 あなたは、配列を作成したり、取っている あなたが取っている文字列 ユーザから。 あなたはどのように長い文字列がわからない 例えば、あることを行っている。 だから、正確にどのように多くを知らない あなたが割り当てるメモリ·ブロック、右? だから、本当にためには意味がありません あなたは100文字を入れて言って。 そして、ユーザが150を書き込む場合はどう? あなたがねじ込まれるようになるだろう。 そこで、基本的に、あなたはどのように確認することはできません あなたが割り当てる必要がメモリの量 あなたがプログラムをコンパイルするとき。 あなただけの実行時にそれを知っている。 あなたはヒープを持っている理由だからです。 だから、ヒープメモリを持っているとしている あなたが中に割り当てていること プログラム実行中の期間。 したがって、基本的に、あなたはmalloc関数を実行したときに、どのような あなたがメモリを割り当ててやっている あなたがしていることを意味し、実行時、 あなたその瞬間に右の決定 そのメモリを持つ必要があります。 あなたがそれを割り当てるしているときだからです。 それは理にかなっていますか? だからスタックは変数があり、覚えている それは、コンパイル時に作成されます。 そして、ヒープは変数がある あなたが行くように作成される mallocで、例えば。 聴衆:[聞き取れない]? LUCAS:だからのGetStringです malloc関数を呼び出すつもり。 私はmalloc関数についてお話しましょう​​、と 私はのGetStringを説明します。 だから、malloc関数は同じことです。 メモリ割り当てなど。 だから、割り当てることが起こっている ヒープ上のメモリ。 そして、それはへのポインタを返すために起こっている ここで、そのメモリがで配分された。 だから、do--とき ここexample--用 n個の星のポインタ。 そして、ポインタはmalloc関数に等しい インチの10倍の大きさ。 私はポインタを作成しています。 そして私はへのポインタを代入してい ポインタのmallocの値 私を与えている。 あなたが割り当てることができるので、私はmalloc関数を求めている 10個の整数のためのスペース。 つまり、言っているんだ。 そして、malloc関数は私に戻っています その場所へのポインタ。 意味が? [OK]をクリックします。 私とのGetStringは、基本的には、やっている あなたが割り当てることができるので、malloc関数を呼び出す 実行時のメモリ。 常にNULLかどうかを確認することを忘れないでください malloc関数は、NULLを返すために起こっているので、 それはメモリを割り当てることができない場合。 例えば、あなたが、ばかげを求めることとしましょう メモリの量。 お使いのコンピュータにはあることを行っていません それだけ割り当てることができ。 だから、malloc関数はただ起こっている nullを返します。 だから、常にかどうかを確認することを忘れないでください あなたはmalloc関数から得たポインタである ヌルかどうかがあれば、あなたがかもしれない、なぜなら ポインタを逆参照すると、 サイドの障害を引き起こす。 そして最後に、忘れてはいけない あなたの空きメモリ。 malloc関数は、ヒープでメモリを作成しています。 そして、あなたはメモリを解放する必要があります プログラムが終了する前に。 [OK]を、それは私のためにすべてです。 申し訳ありませんが、ロブ。 ありがとうございます。 [拍手] LUCAS:任意の最後の質問 ロブが来る前に? いいえ? うん? 聴衆:私は見ていない この1オンライン。 あなたはまだそれをアップロードしたことがありますか? LUCAS:私はデイブだと思う すぐにそれをアップロードする。 DAVE:それは掲示されます。 LUCAS:それはオンラインである必要があります。 聴衆:それは最高です。 LUCAS:それは最高ですか? [OK]をクリックします。 うん? 聴衆:[聞き取れない]? LUCAS:はい、あなたはすべて解放する必要があります ヒープに置かれるメモリ。 聴衆:[聞き取れない]? LUCAS:はい。 あなたは文化のmallocを持っているときはいつでも、 あなたは無料の文化を持っている必要があります あなたはその変数の使用を停止した後。 だから、mallocとfreeである いつも一緒。 彼らの親友。 うん。 ロブ? ROB:私はすぐに行くよ。 そして、またビデオがお付けします。 私は上のマイクを持っている。 そう、週5のもの。 私たちが持っているまず最初にスタックです。 だから、唯一つのスタックがあることを覚えている アクティブな関数呼び出しごとのフレーム。 私たちは、第二にそれを表示されます。 そして、実際に何が起こって覚えている 各スタックフレームであることを行っている 私たちの関数のローカル変数、 私たちに渡される引数 カップルと一緒に機能し、 あなたが本当にしない他の事 心配する必要があります。 そこでここではプログラム例はどこだ、 通知は、メインは、リターンをprintfingさ fooの値4。 fooはただ返すように起こっている バー4コンマ6の値。 そして、バーには、いくつかのローカルに設定しようとしている 4〜6倍に等しい変数n。 そしてnは返す。 それでは、全体のスタックを見てみましょう このプログラムの実際の繰り返し。 だから私たちのスタックの底があります。 スタックが育つことを覚えておいてください。 私たちは、私たちのスタックの一番下にあるので、 メイン用のスタックフレームを持っている。 ときにプログラムが起動し、メイン 常にであることを行っている 私たちのスタックの最下部。 そして、私たちの内側に何か メイン用のフレームをスタック? だからローカル存在しないにもかかわらず、 主に、変数、私が前に言ったように、 私たちはargcとRGVはスペースを取ってきた メインスタックフレームの内側。 今しようとしているので、メイン 関数fooを呼び出す。 そして、それはfooがしようとしていることを意味 独自のスタックフレームを取得します。 だから今、私たちはの中にいる 関数foo。 そして、何が中に行く必要がある 、fooのスタックフレーム? さて、fooは引数nを持っています。 それはだから、nは4に等しく、何 メインは、fooの引数として渡している。 だから今fooはバーを呼び出すために起こっている。 どのようなバーが内部に持っているとしている その「スタック·フレームの? これは、6に等しい4 yに等しいのxを持っています。 それは私達が必要があるとしていることがすべてではない バーのためのスタック·フレーム内 また、ローカル変数nを有する。 そして、nは、私たちは24に等しくなるように設定しようとしている。 だから今のバーは、nを返すために起こっている。 だから、バーは24を返している スタックフレームのfoo。 そしてバーがあることを、戻っているので、 私たちはスタックフレームをポップしていることを意味 スタックのオフバーのため。 バーがあったので、すべてのメモリ 使用すると、スタックからになりました。 さて、fooはまた起こっている 主に24を返します。 だから今それfooは、メモリを返す そのfooはその 'で使用していた スタックフレームもなくなる。 そして今、主はprintfのを呼び出すことが起こっている。 だから、printfのはちょうど別の関数である。 私たちはprintfのを呼び出すと、それはなるだろう printfのための別のスタックフレーム 関数呼び出し。 私たちは、printfのを渡している? それは行くために起こっているものだ そのスタックフレーム上。 少なくとも、私たちは渡している そのパーセントはiがnバックスラッシュと 引数24。 それはスタックフレームの中でそれは多くを持っているかもしれません printfのは、いくつかを使用しているように発生した場合 ローカル変数。 私たちは知りません。 しかし、すべてのことは、printfの年代に行く フレームを積み重ねる。 これはprintfのを実行するために起こっている。 その後のprintfを行っています。 それは戻ります。 最後に、主に行われる。 メインに戻ります。 そして、私たちのプログラムが実行されます。 うん? 観客は:あなたが見ている[聞き取れない] 引数[聞き取れない] パラメータ? ROB:だから微妙な差がある 引数とパラメータの間。 そして実際に、一般的な用語では、人々は傾向がある ちょうどすべての時間をそれらを混合する。 しかし、パラメータが正式です 物事の名前。 だから、argcとargvはある 主へのパラメータ。 引数は何をあなたが実際に それらのパラメータとして渡します。 だから、私は4のfooのを呼び出すと、4 私は渡している引数です。 および内部パラメータn、 fooは、値をとる4 4以来の引数だった。 聴衆:[聞き取れない]? ROB:nは棒にローカル変数です。 nはまだfooへのローカルであるが、 それはfooへのパラメータです。 これは、ローカル変数ではありません。 うん? 聴衆:[聞き取れない]? ROB:fooはクロスバーを呼び出していると どんなバーリターンを返す。 聴衆:[聞き取れない]? ROB:ええ、ちょうど複数参照するには スタックフレーム。 うん? 聴衆:なぜfooが呼ばれていた printfの前に? ROB:なぜfooがprintfの前に呼び出されたのですか? だから私は、その代わりに、何かを行っている可能性が int型のように×4のfooのに等しい させ、xをプリント。 しかし、その代わりに、私は関数を組み合わせた printfの引数を呼び出す。 しかし、私たちがいない、実際にできることに注意して 私たちまで、printfのための呼び出しを実行する 4のfooが何であるかを把握。 そこで、これを評価するつもりだ。 そして、一度だけそのに行うの予定です 戻ってきて、これを評価した。 うん? 聴衆:両方のバー以来[聞き取れない] 値は、なぜ[聞こえない]持っていないのですか? ROB:彼らは完全にint型でなければなりません。 つまり、上の捕捉されなかった 複数のパス。 だから、int型のバーとint型でなければなりません これらの両方のため、fooの 整数を返している。 ボイドは、彼らがつもりはない場合にのみです。 実際の値を返すようにします。 うん? 聴衆:あなたは上記の行を持っていた場合 戻り、[聞こえない]? ROB:戻り上記の行? 聴衆:うん。 同様にあなたはprintfや[聞こえない]が行った場合、 それは二度印刷さでしょうか? ROB:だからfooの内部? 私たちはここのprintfを持っていた場合? 聴衆:うん。 ROB:だから私たちはprintfの権利を持っていた場合 ここで、一度印刷しました。 私たちは一度、右のfooを呼び出しているので ここでは、私たちはprintfのヒットだろう。 それから、バーと呼ぶことにします。 そして、fooが返されます。 そして、それはそれだ。 私たちは、今までに遭遇 一回のprintf。 うん? 聴衆:[聞き取れない] 私たちが最初だからのfooを呼び出すのprintf のprintfを呼び出した後、私たちは渡している 引数。 ROB:だから理論的には、ありません printfのはfooを呼ぶ? だから無い。 cがしようとしていることだけでオーダー 私たちができる前に、これらのことを実行している 、すべての引数を関数を呼び出す 関数にする必要が 完全に評価される。 だから、これは完全に評価されている? はい、それは単なる文字列です。 それはちょうど値です。 その後、私たちは完全に持っている これを評価。 これが完了すると、今、すべての その引数を評価する。 そして今、私たちはすることができます printfのために呼び出す。 うん? 聴衆:一つの疑問。 あなたはvoid関数を使用している場合は、必要があります あなたがリターンセミコロンがありますか? ROB:あなたは、戻りセミコロンない あなたはvoid関数を持っている場合。 [OK]をクリックします。 だから今、いくつかのヒープのもの。 だから、ヒープは、私たちが対処しようとしている方法です 動的メモリ管理を備えた。 そして、これは、直接とは対照的である 私たちは、自動呼び出しますスタック メモリ管理。 だからスタックに、あなたが本当に必要はありません どのようにローカル変数に対処する プッシュされ、すべてのポップされています これらのスタックフレームとすべてのもの。 あなたはそれを心配する必要はありません。 それは自動です。 だから、ヒープは手動です。 そして、[聞き取れない] これらの機能から来る mallocとfree。 だからここに別のプログラムです。 私たちがやっているすべてはmallocingです 整数。 私たちは、スターxにそれを保存している。 もちろん、チェックする必要が xがnullかどうかを確認します。 その後、私たちは何を設定しようとしている xが50を指している。 、を指しているもののxを印刷 印刷のx、その後、無料のx。 それでは、どのこれは実際に見に行くされている 私たちは、スタックとヒープを見れば? だから私たちは再び始めます。 前と同じように私たちのスタックの最下部。 あなたが直接ヒープことを忘れないでください スタックに対抗? だから私たちは持っているつもり そこまで私たちのヒープの最上部。 私たちのスタックの最下部だから、私たちは持っている 主のための私達のスタックフレーム。 それは、argcは、argvのためのスペースを持っており、私たち 今ローカル変数xを、持っている int型の星である。 だから私たちは反復処理するつもりだ このプログラムを通して。 私たちが持っている最初のものです malloc関数の呼び出し。 だから私たちはmalloc関数への呼び出しを作っている。 malloc関数は、関数です。 これは、スタックフレームを取得するつもりだ。 私たちははmalloc渡している? つまり、中に入るために起こっている スタックフレームの。 私たちは、4はnのサイズを渡している。 だからは、malloc関数に渡されます。 malloc関数は何をしますか? それは私達にヒープ上にいくつかの領域をつかむ。 だから私たちは、ヒープに行くつもりです。 そして、私たちはつかむつもりだ ヒープから4バイト。 それでは、まさにそれを与えてみましょう 任意のアドレス。 0x123ジャストつまりふり ヒープ上のアドレス。 それでは、その内部に実際にある アドレスOx123でのメモリ領域? ごみ。 だから私たちはそれには何も保存されていません。 だから限り私たちは、それを知っているように 何でもかまいません。 あなたはそれがゼロだと仮定してはいけません。 それは最も可能性の高いゼロではありません。 だから今のmalloc戻ります。 そして、私たちはときにmallocが返す何をしますか? 私たちはそれが何を返すか設定します。 私たちは何に等しいのxを設定 それが戻っている。 だから、何を返している? それがあるので、それは、0x123を返しています メモリのブロックのアドレスもその ただ、ヒープに確保。 だから、0x123 xは、今設定しようとしている返す 絵でおり、0x123に等しい、 私たちはしばしば、実際のXとして描く そのブロックを指す矢印。 しかし、xはまさにそのアドレスを記憶している。 だから今、私たちは、xがnullであるかどうかを確認する必要があります。 それはヌルではありません。 私たちは、malloc関数が成功したことをふりをする。 だから今スターのxは50に等しい。 だから星はその意味を覚えて そのアドレスにアクセスしてください。 だから、0x123私たちはするつもりだ そのアドレスにアクセスしてください。 だから、そこに私たちをもたらします。 私たちはそのアドレスで何をしているのか? 私たちは50を保存している。 したがって、この行の後に、それは何ですか 物事が見えるようにしようとしている。 だから今それはもはやません そこにごみアップ。 今、私たちは50点であることを知っている なぜなら、特定のアドレス 私たちはそれに設定してください。 OK? だから今、私たちはFを印刷しようとしている。 したがって、最初の私たちはスターxを印刷しようとしている。 だからスターxは何ですか? この場合も、スターのxがに行くことを意味 xはを指していることだ。 だから、xはそれに0x123囲碁を記憶している。 私たちは、50を得る。 だからfを印刷します。 そして、それは、それが50を印刷するために起こっていることを意味します。 そして、それが返されます。 そして、私たちは第二のprintfを持っている。 現在パーセントpをしている。 あなたはそれを見ていないなら、それはだ ちょうどあなたは、ポインタを印刷する方法。 だから私たちは、パーセント%の私を持っている f及び既にそれらのすべて。 だからパーセントpは、ポインタを印刷します。 だから、xがポインタである。 だから私たちはx自身で印刷しようとしている場合には、 私たちは内部実際に何であるかプリントする したがって、最初の0x123はx、 印刷fは50を印刷しようとしている。 第2の印刷fが起こっている うん0x123を印刷するには? 聴衆:あなたはパーセントを使用していますか のxのポインタを印刷するには? ROB:だから、パーセントを使うのですか のxのポインタを印刷するには? だから、あなたはできますが、パーセントxはちょうどです 一般的に、などのために、いくつかを持っている場合 整数、あなたが印刷したい それ進数として。 それはあなたがそれを行うだけの方法です。 一方、割合dはだろ 小数として印刷。 私たちはパーセントを取得したからだ D。私はちょうど整数です。 パーセントpは、具体的である ポインタ用。 だから、xがポインタである。 私たちは、パーセントpを使用したい。 しかしパーセントxは、仕事ができる。 うん? 聴衆:[聞き取れない]? ROB:うん。 少なくとも、このために私はそうcall-- ここでそれを含んでいませんでした。 しかし、これらの二つの引数は必ずある このスタックフレームの内側 ローカル変数と一緒に のprintfが使用していることを起こる。 そして、次の呼び出しは、現在のprintfする printfのスタック·フレームの内側には、 パーセントのp、バックスラッシュnと何でも xの値は、0x123である、である。 うん? 聴衆:[聞き取れない]? ROB:それは何かを印刷します それは次のようになります。 聴衆:[聞こえない]。 ROB:だからそれはアドレス形式でそれを印刷します。 これは、アドレスのように見えます。 うん? 聴衆:[聞き取れない]? ROB:なぜ何ですか? 聴衆:[聞き取れない]? ROB:なぜ、このポインタは4バイトです? だから、全体の束があります この目の前に0の。 だから、本当に0x0000000123です。 64ビットシステムでは、あるだろう よりゼロの全体の束。 うん? 聴衆:[聞こえない]。 ROB:だから最初のprintf print--しようとしている 聴衆:[聞こえない]。 ROB:はい、それは印刷するために起こっている 何のxを指している。 スターはこれが何であるかと言う 事を指している。 それをつかむ。 だから、を指しているでしょうか? 50。 それをつかむ。 つまり、私たちが印刷しようとしているものです。 次のいずれかのに対して、私たちはしている ちょうどx自身に印刷。 のfの内部では何ですか? 0x123。 [OK]をクリックします。 そして、最後に、私たちは自由を持っている。 私たちは、解放するために渡している? 私たちは、Xを渡している。 私が実際に表示さその時 そのスタックフレーム中。 だから私たちは値を渡している 解放する0x123。 だから今知っている自由、すべての権利、 私は、ヒープにまで行かなければならない そのメモリを解放する。 それは、もはや使用していているのか アドレス0x123にある。 だから自由にリリースする予定です ヒープからの。 現在、私たちのヒープは再び空になっています。 私たちは、メモリリークがありません。 今すぐ無料で返されます。 xはまだ​​0x123であることに注意してください。 しかし、それは今有効なメモリではありません。 私たちは、もはやデリファレンスxをすべきである。 うん? 観客は:0冗長を返しますか? ROB:0冗長returenていますか? はい。 私たちは、という理由だけで、そのそこに置く 私たちは、空気のリターン1を持っている。 だから、ええ、できます、ようなものだ リターン0が含まれています。 うん? 聴衆:[聞き取れない]? ROB:だから無料のxの後に、何があればどうなる 私たちは、ポインタを逆参照しようと? それは、何もうまくいかない可能性があります。 私たちはまだ50を買ってあげることが可能です。 それは、そのメモリがあることを、また、可能性があります 今何か他のもののために使用されている。 だから、未定義の動作です。 そして、未定義のは何を意味し、 発生する可能性があります。 うん? 聴衆:[聞き取れない]? ROB:いいえ、あなたが割り当てるので、もし 何か他のものへのx。 ちょうどここのであれば、私たちは、xが等しいと malloc関数何かelse-- mallocのサイズevent-- その元のブロック メモリが解放されません。 そして、私たちは正式にそれを失っている。 つまり、メモリリークです。 私たちは、すべての参照を失ってしまった メモリのブロックへ。 だから、私たちが今までそれを解放することができます方法はありません。 そう、その後に行わ0手段を返す。 すべての権利なので、スタックオーバーフロー。 ここでの考え方は何ですか? だから覚えて、ヒープが下がっている。 スタックが上がっている。 だから、これは講義の例だった、 私はどこにメインばかりになるだろう、と思う 起こっているこの関数fooを呼び出す 上で自分自身を再帰的に呼び出すようにし、 何度も何度も。 だから、しようとしているスタックフレーム 全く同じに動作します。 だから私たちは主から始めるつもりだ ボトムスタックフレームとして。 そしてメインは、fooという呼び出ししようとしている スタックフレームを取得する予定です。 その後、fooはfooのを呼び出そうとしている 再び、これは取得する予定です 別のスタックフレーム。 そして再び、そして再び、そして再び、 そして再びまで、最終的に、私たちは実行 ヒープへ。 だから、これは私たちが取得する方法です。 スタックオーバーフロー。 そして、この時点で、あなたはseg faultを。 それとも本当にワンセグの前に故障と思います この点が、うん。 聴衆:コアダンプされています ワンセグ断層と同じ? ROB:だから、セグメンテーションが表示されます 断層コアダンプ。 あなたは時コアダンプを取得 あなたはseg faultを。 そしてそれはすべてのダンプのようなものだ ので、あなたの現在のメモリの内容 あなたは試してみて、識別することができる なぜあなたは障害の発生したワンセグ。 うん? 聴衆:[聞き取れない]? ROB:だからセグメンテーションフォールト手段 スタックオーバーフローがあります。 そうとは限らない。 セグメンテーションフォルトを使用すると、していることを意味します の方法で接触メモリ あなたがすべきではない。 だから出来事の一つの方法は、時です あなたは私たちが触れる開始、スタックオーバーフロー 私たちはすべきではない方法で、メモリ。 うん? 聴衆:[聞き取れない]? ROB:だから無限ループの内側。 同様に、これは再帰的な無限のようです ループと私たちは別のものを取得する スタック毎回フレーム。 しかし、単に定期的な内部 ひとつ選ぶ一方、無限 さて、でも印刷しないようにしましょう​​F-- 何かをする。 何でも。 当社は、取得するつもりはない 別のスタックフレーム。 私達はちょうどループを維持するつもりだ この単一命令オーバー。 スタックが成長していません。 各再帰という事実だ コー​​ルは私たちにスタックフレームを与えている。 私たちは、スタックオーバーフローを得る理由です。 うん? 観客は:ので、もしあなたが得ると言われ whileループし、[聞こえない]? ROB:もしそうなら、whileループの内側 printfのがあった、あなたはまだでしょう ワンセグではない故障。 私は物事を混同したくなかった。 それは、ループだろう。 あなたは、単一のスタックを取得したい printfのためのフレーム。 その後のprintfが返されます。 その後、再びループをしたい。 あなたは、単一のスタックを取得したい printfのためのフレーム。 それは戻ってくる。 シングルスタックフレーム。 だから、この無限を取得していない スタックフレームを積み重ね。 聴衆:[聞き取れない]? ROB:はい。 したがって、このスタックオーバーフローが起こる これらはいずれも理由 fooへの呼び出しが戻ってきている。 私たちが戻るならば、私たちはそのためだろう スタックフレームを失い始める。 そして、私たちはスタックオーバーフローではないだろう。 そして、あなたはベースケースを必要とする理由です あなたの個人的な機能のために。 うん? 聴衆:電位の大きさと ヒープで同じにするためにスタック すべてのプログラム? ROB:およそ。 スタックの潜在的な大きさがあり、 すべてのプログラムのヒープと同じ? およそ。 にはいくつかのランダム化がある ここでスタックが起動し、 ここで、ヒープが開始されます。 あなたは、全体の多くを持っていたりすると グローバル変数との事、あなたがかもしれない いくつかの領域から離れて取る ヒープ用。 64ビット·システムでは、あなた事実上 無限のメモリを持っている。 ただそんなにあります。 32ビットと64ビットの間で、その 有意な差がある。 あなたはより多くの全体の多くを取得するつもりだ 64ビットでのスタックとヒープ領域 システムだけでそれだけではありませんので、 彼らが使用できるアドレス。 しかし、個別のシステム上では、意志 スタックのほぼ同量であること とヒープ領域。 かしこまりました。 だから、最後に、コンパイルです。 だから、このプロセスを知っている必要があります。 4大きなステップがあります。 だから、最初のものはすべき 覚えやすいこと。 前処理。 それはそれで事前接頭辞を持っています。 だから、他のすべての前に来る。 覚えておくべき事はハッシュです。 だからハッシュ定義し、ハッシュが含まれ これらのすべてにおいて。 これらは、すべてのプリプロセッサである ディレクティブ。 これらは、ものです プリプロセッサの世話をする。 だから、プリプロセッサは何をするのでしょうか? それは本当にばかなことだ。 すべてのこれらのされているすべての対応だ コピー、切り取り、貼り付けの操作。 だから、ハッシュは、標準I0ドット時間が含まれています。 やっていることは何ですか? これは、標準I0ドットhをつかんだ 提出し、トップに貼り付ける それはハッシュが含まれて言うところ 標準I0ドット時間。 そして、いずれかのハッシュは、私たちがしたことを定義 見て、それは何をしているのですか? そのハッシュがその値をコピーする 定義されているが、そのようにして貼り付け定義されている どこにあなたが値を使用しています。 だから、プリプロセッサは本当にない 単純なテキストベースの操作。 それはスマートな何もしません。 だから、他のすべてがある より複雑。 だから、今ではプリプロセッサがある 行って、私たちは実際にコンパイルします。 だから、コンパイルは何を意味するのでしょうか? 現在Cコードからつもりだ アセンブリコードへ。 うん? 聴衆:[聞き取れない]? ROB:ええ、私たちはそれをキャッチしました。 だからコンパイル。 私たちは、Cからのアセンブリになるだろう。 これは、実際の言語の変化である。 自分自身をコンパイルすると、から行くことを意味 より高いレベルの言語に 下位レベルの言語。 cは高レベル言語である アセンブリに比べ。 アセンブリとは何ですか? かなり、であるその指示 ずっと、あなたのCPUのために作ら。 しかし、あなたのコンピュータはまだない アセンブリを理解していない。 それは唯一のものとゼロを理解しています。 だから、次のステップは、組み立てされている これらの命令から私たちをもたらすこと あなたのCPUが実際に理解し、 に、それらを変換します とゼロ。 バイナリへのアセンブリにCだから。 しかし、私はまだ実行していない。 だからCS50ライブラリ考える。 私たちは、バイナリをご提供してきた のGetStringを持つこのCS50ライブラリ、 そしてGetIntで、すべてのこと。 しかし、CS50 library-- 内とのitself--は実行可能ではありません。 これは、主な機能を持っていません。 それはちょうど、バイナリの束だ あなたが使用することができます。 だからリンク私たちはすべて一緒に持って来る方法です これらの異なるバイナリファイルの 実際の実行可能ファイルに変換する。 あなたが入力できますワン ドットは、ドットをスラッシュ。 だから、これはあなたのファイルのようです。 、書いた - 何でもあなたのプログラムis-- シーザードットC。 しかし、今ではコンパイルされています バイナリへのダウン。 だからシーザードットoを。 そして、これは私たちのCS50ライブラリバイナリです。 そして、彼らは組み合わされています 単一の実行可能に。 うん? 聴衆:[聞き取れない]? ROB:だからまず覚えて、含まれる、 ハッシュは実際に含まれる プリプロセッサ段階。 しかし、それは独立したのです。 あなたはそのいずれかの関数を使用していない場合 その後、あなたの単一ファイルの外にある、 いいえ、あなたは何をリンクする必要はありません あなたはすべてを持っているので。 とはいえ、printfのはリンクされている。 あなたは今までのprintfを使用している場合、それは何か つまり、リンクされる必要がある あなたがそれを書いていないからです。 そして、実際には、printfのは自動的に でリンク。 あなたが知っているどのようにコマンドラインで、または時 あなたはそれを持って参照して、作るタイプ リンクがダッシュリットルCS50、 CS50ライブラリ内の? printfの、そのようなもの、起こっている 自動的にリンクします。 何でも上の任意の他の質問? 聴衆:[聞き取れない]? ROB:リンク? 私たちは、の全体の束を持っている 異なるバイナリファイル。 これは標準的な例です。 私たちが使用していることは、CS50ライブラリです。 私達はあなたにコンパイルされ、与えられている このCS50ライブラリのバイナリ。 あなたはのGetStringを使用したい プログラム内。 だから、行くとのGetStringを使用しています。 しかし、私のバイナリコードなしで あなたのコードをコンパイルするのGetString、 ダウン、あなたが実際にあなたを実行することはできません プログラムのGetString文字列であるため、 まだ完全に定義されていません。 それはあなたが私のバイナリにリンクする場合にのみです それは今、すべてのGetStringが含まれています 右、私は実際にすることができます のGetStringを実行します。 私のファイルは完了です。 そして、私はこれを実行することができます。 うん? 聴衆:コンバートを結ぶん 実行可​​能ファイルにバイナリ? ですから、他のを持っていない場合でも、 ライブラリーは、それはまだないであろう 翻訳するために必要な [聞き取れない]? ROB:だから、実行可能 バイナリのままです。 それだけで全体を組み合わせることだ バイナリの束。 観客は:どうもありがとうございます。 ROB:問題ありません。 他の質問は? そうでなければ、私たちはすべてのセットだ。 かしこまりました。 ありがとうございます。 [拍手] 聴衆:ありがとうございます。 ROB:うん。