[Powered by Google Translate] [第4週、続く] [デビッド·J·マラン - ハーバード大学] [これはCS50です。 - CS50.TV] これはCS50であり、これは第4週の終わりです。 いくつかの良いニュースと悪いニュースがそう。 月曜日には何の講義、問題は来週設定されません。 [生徒が応援] あなたは、これがどこに行っているかなどするつもりはない。 しかし、我々は次水曜日代わりにこれを持っていますが、 そして次金曜日は、我々はトラックにとどまることができるようにシラバス1金曜日の講義ごとにもある。 しかし、すべてはいつものように撮影されますので、心配しないように。 とに関しては、我々は今週の終わりに向かって何をしようとして0をクイズに コー​​スのホームページcs50.net説明に投稿されている それは最初のクイズに来るときあなたが持っているはずの期待がどんなものなのかの。 一般的には、多肢選択、正誤、短文ショートコーディングな問題となるだろう。 あなたは、同等のものを実装することを期待するつもりはない あなたはコンピュータを持っているのpset、見たい問題の とデバッガ等が挙げられるが、小さなコーディングの問題があるでしょう。 そして実際、CS50クイズ何の感覚を得るための最良のガイドでは、のようなもの cs50.netに行くされ、クイズのリンクを参照してください そしてあなたは、過​​去数年間クイズの価値を確認することができます。 ただカリキュラムは常に長年にわたって同じではなかったことを実現します。 時には我々は、時には加算、減算、 あなたはそれらの古いクイズの1にいくつかのトピックを参照してくださいので、もし あなたはそれが何について話しているのか見当がつかないこと、それは我々がそれをカバーしたことのどちらかだ あるいは、我々がそれをカバーしていない。 しかし、レビューの形で、この日曜日、月曜日、火曜日 同様に日曜日の夜にコース全体のレビューセッションとして - コー​​スのホームページ上で発表される時間と場所 - あなたはすべてのコースのティーチング仲間と検討する機会を持つ セクションと完全クラスとして両方今年の材料、 そしてそれらは同様にいつものように撮影されます。 かしこまりました。だから、さらに騒ぎがなければ、パス上の1つのコメントには/失敗し、アド/ドロップ。 昨夜は私のノートを見ている可能性があり、これは本当にちょうどいくつかの追加安心です あなたはそれらの間で特にあまり快適またはどこかの間にあるときは、同 そしてあなたは、あなたの頭の上に少しだけ感じている 確かに非常に正常であることを認識し、所定の位置に十分な支持構造があり、 営業時間は、最後の夜私のメールごとにすべてのそれ以上の上達に専念していたそのうちの1 とパスのようなオプションが/このようなクラスで失敗することにも気付く 本当にこのようなコースの端を脱ぐためのメカニズムとして意図され、 ので、あなたはそれらの10、15、20時間を費やしている場合は、再度 ちょうど仕事にいくつかのpsetを取得しようと、あなたがそこに道の90〜95%している知っている しかし、あなたは大丈夫のようなものだ合格/不合格のモデルでは、いくつかの気のバグを見つけることができません。 アイデアは、そのメカニズムとは、あなたの他のpsetにフォーカスを行くことができるということです スリープモードまたは何でもそれはあなたがに集中したいということです。 ですから、今度の火曜日まで持っていることを実感 - 技術的には第五月曜日、 それは休日なので、今度の火曜日 - パスから切り替える/傾斜、またはその逆に失敗する。 そして、あなたは絶壁に本当にしていると完全に落下を考えているのなら、 講義の後に私を捕まえるか、私にメールを送ってください。 我々は、あなたが別れを告げる前に、少なくともおしゃべりが大好きです。 かしこまりました。だから我々は前回から補助輪を撮り始めた。 特に、我々は、文字列に焦点を当てた。 文字列は、CS50ライブラリ内で宣言されているものです 特に我々は今週と次のを見てから始めましょうcs50.hと呼ばれるファイルに記録します。 しかし、文字列は本当に何かのほんの簡略化したものである それはもう少しarcanely char *として説明します。 我々が精通しているCHAR。それはちょうど単一文字です。 しかし、月曜日の時点で*は何を表す? >> [生徒]のポインタ。 ポインター。ポインタとは何ですか? >> [生徒]アドレス。 それは、アドレス、メモリ内の位置のようなものだ。 住所や場所やメモリとは何ですか? 繰り返しますが、私たちのすべては、これらの日の最も可能性の高いギグまたは2 GBのRAMを搭載したノートパソコンを持っている とすると、メモリの価値億か2億バイトを持っていることを意味します。 そしてそれは本当に、それが物理的にどのように見えるかは問題ではありません しかし、あなたは自分のノートパソコンが持っている個々のバイト数全できるという信仰を取る - これは0バイトですが、これは1バイトですが、これは20億バイトです - それはコンピュータが何をするかがまさにそれだ。 あなたは、単一の文字にスペースを割り当てるときに、例えば、 それは明らかに、コンピュータのメモリ内のどこかに住んでいる必要があります そして多分それは、12345バイト数でだ そしてそれはあなたのコンピュータのメモリにここにどこか次第です。 そしてその文字の後、アドレスは12345です。 さて、今を通じてこれまで0週目に、私たちは本当に気にしていない 我々は通常、記号を使用していますので、メモリ物事に格納されている、 変数は、実際に我々のデータを取得するために、配列。 しかし、月曜日となおさら今日の時点で、あなたが今持っているつもりです 書き込みプログラムとすべてのそれ以上の表現力 あなたが合うしかし実際には、コンピュータのメモリを操作し、 良い目的と悪の両方に対して、 このようなものを学ぶことに、この時点では非常に一般的な結果であるバグを修正しました。 しかし、それは実際にはchar *であることが何を意味するのか? そして今日は約束通り、我々はBINKYに戻ってくるだろう - のはに戻って先に進みましょう。 のがここで簡単な例に行こう。 私はcompare.cとしてこのファイルを保存して、私はちょうどここにいくつかのテンプレートのコードを得ることができましょう ので、stdio.hをインクルード、私はまた自分自身を含んで与えることができcs50.h.私はそこにズームします。 私はメインのint、メイン(void)を、書き始めるとすぐに私はこのような何かをしたいとしましょう​​: のprintf( "私に文字列を教えてください:")してから、私は、文字列sがgetString取得に使用する ユーザから文字列を取得するには、その後、私は別のもののためにユーザに依頼するつもりです。 そして私はそれを取得するGetStringメソッドを介してそれらを依頼するつもりです:( "私に別の文字列を与える")。 それはかなり標準的なものであればsとsが文字列のためのすてきな名前です後にtが来るので、私はそれトンと呼ぶことにします。 だからGetStringを、今私はちょうど健全性チェックをやってみたいと私は言うつもりです その後、私はちょうど( "!あなたは同じことを入力します\ n")printfのユーザーに伝えるつもりです(秒== t)の場合; 他の私のような何かを( "あなた型付け何か違う!\ n")をプリントアウトするつもりです または任意の文は次のようになります。だから、そのような何か。 その後、いつものように、私はちょうど何も悪いことが起こっていませんシニフィエ0を返します と私は先に行くと、このプログラムをコンパイルして実行するつもりです。 しかし、月曜日に私たちは、このプログラムを実行した そして実際に、HELLOがHELLOではなく、さよならさよならではないと言われた。 我々が見た行動は、このようにもう少しだった。 私は、私のソースディレクトリに移動し、ここで、ズーム、および比較作るかしてみましょうましょう。 大丈夫コンパイル。比較する私が実行してみましょう。私に文字列を与える:こんにちは。 私に別の文字列を与える:こんにちは。 あなたが別の何かを入力した! さて、私は50、50のようなシンプルなものを試してみましょう。あなたが別の何かを入力した! やあ、こんにちは。だから明らかに、何かがここで起こっている。 しかし、理由の説明何でしたか? どうやら、12行目は完全に機能不全に陥っている。 ここに根本的な問題は何ですか?うん。 >> [生徒]それはアドレスを比較している。 ええ、その通りです。これは、実際のアドレスを比較している たハローとHELLO格納されています。 それは、何度も何度も、HELLO文字を比較していない 本当に何が起こっているのか、私達がGetStringメソッドを使用してきたすべての時間 - この黒板は、再び我々のコンピュータのメモリです としてみましょう私は、変数sを宣言した後GetStringを呼び出すと言う。 私の記憶がどのように見えますか? Let 'sは、任意にsがこのようになっていることを言う。それは正方形です。 とかなりいつでも私は、画面上のメモリの一部を描いた それが32ビットの場合、私は、アプライアンスであるため、実際にこのような正方形を描画してきた ポインタは、アドレスは、32ビットです。それはintと同じです。 コンピュータ·システムに基づいて変化する可能性があること。 お使いのMacまたはPCが64ビットであるという事実と漠然と理解しているあなたの人々、 実際にお使いのコンピュータが64ビット·ポインタを使用していることを示している、 64ビットのアドレス、五分五分の間では、コンピュータである 往年よりもはるかに多くのRAMを持つことができます。 長い話を短く、昔にコンピュータが32ビットだけを使用したとき アドレスを表すために、バイトの最大数あなたは表すことができました その場合には、32ビットを持っていたらどうだった? 32から2が4億円ですので、右のように4億ドルであった。 この数はもちろんで再発されています。 あなたは32ビットだけを持っているなら、あなたが数えることができる最大数は、約4億ドルである。 しかし、それは数年前まで、コンピュータの基本的な制限があった あなただけ40億ほど高く数えることができる場合があるため、 RAMの8ギガバイト以上のRAMさえ5ギガバイトを買えば、それは問題ではありません。 あなたはそれが高い数えることができないので、それは無駄だった。 あなたは、あなたのコンピュータのメモリの最初の3または4ギガバイトにアクセスすることができました。 それが今ではそれほど問題だし、のMacBook Proとデルを購入することができます 8ギガバイトのRAMあるいはそれ以上のこれらの日である。 しかし、私はこのプログラムに非常に単純にポインタsと呼ばれるポインタを割り当てる場合 確かに我々は、この層背面剥離する必要があるため、それが画面に次のようになります。 、私は、文字列を言い続けるが、月曜日のように、文字列は本当にchar *である いくつかの文字のアドレス。 だから我々は今のGetStringメソッドを使用し続けるつもりもかかわらずの、その補助輪を外してみ​​ましょう。 だから私は、sを宣言したが、これはメモリの塊、32ビットです。 デフォルトでは、メモリ内にここに何があるか。 >> [聞こえない学生の応答] それは何? >> [生徒]ごみ。 >>ガベージ。その通りです。 あなたはプログラマが変数に値を入れない場合、誰がそれが何であるか知っている? 時々、あなたは幸運を得ると、それは素敵な、きれいなデフォルト値の一種である0、、だ 我々が見たように月曜日しかし、時にはそれが、完全にナンセンスだ どこから来たいくつかの非常に大きな正または負の数? うん。関数の前に>> [生徒]。 >>うん。 しばしば思い出すので、前に呼ばれました機能、 あなたは、メモリ内の関数を呼び出すように、彼らは下から上に、より多くのスペースを取る、 とすぐに関数が戻ったとして、そのメモリは再利用されます 呼び出された隣の男で、誰があなたのメモリの同じスライスを使用しています。 そして、あなたは、そこに以前の値をゴミを残してきた場合 私たちは本当に我々がそこには何も入れていないときに、いくつかの値を持つものとしてsを間違える可能性があります。 だから、この時点で私達のRAMは、このように見えます。 今では7行目の右側に、我々は、GetStringメソッドを呼んでいる 我々は数週間のために今行ってきたが、何が本当にやってgetStringをされている? CS50スタッフによって書かGetStringメソッドは少し理性的である その中でユーザーが入力するキーとヒットは、入力し始めるとすぐに、 数字をgetStringをどのように多くのキーストロークは、ユーザーがヒットしました、 どのように多くの文字私は、RAMを割り当てる必要がない。 そして、ここで、そのRAMは、から来ている人は知っていますか? それはあなたのコンピュータの2ギガバイト以上のメモリその他もろもろのどこかだ。 しかし、ここではコンピュータは右ここにハローワードのためのスペースを見つけたとしましょう​​。 私が入力した単語は、H-E-L-L-Oだった。 そして、我々は文字のシーケンスとしてこれを描くならば、我々はこのようにそれを描くかもしれません。 しかし、私は1余分なことを行う必要があります。何がC言語で任意の文字列の末尾に属する? 我々は\ 0として書き込み、ヌル文字。 それは技術的には数字の0ですが、バックスラッシュは、すべて明確になります これは、文字通り数0、整数0であること; それはあなたがキーボードでタイプかもしれない、例えば、俗に言う0ではありません。 だから、これはHELLOです。 そして、我々はGetStringメソッドのような関数と月曜日に何を言った 実際に、これらのすべての週を返している? それは本当に意味を持っていませんので、それはそれ自体が文字列を返していない 文字列が存在しないため。彼らは、CS50、ライブラリ内の製造の一種だ。 より技術的に、本当に文字列とは何ですか? >> [生徒]それは最初の文字です。 その通りです。それは、ユーザーがログイン入力した非常に単純に最初の文字のアドレスだ もしそうであればバイト数123で、その後バイト数124で、それを終わるこんにちは私の言葉、 125、126など、最大で0〜私はちょうど私の数バイトであれば、 本当にGetStringメソッドは、戻されると、文字通り数123です。 だから何秒に入れれるとハロー番号123ではなく、文字Hではなく、言葉であり、 非常に単純に私はHELLOの最初の文字を見つけることができているアドレス。 しかし、それは十分なように見えるしていません。私は、文字列ではなく、文字の入力を求めました。 それではまたはコンピュータがELLO種類のはHと一緒に来ていることを知っていますか? 我々が持っている契約書のソートは何ですか?うん。 [学生]それはいくつかのより多くの文字を見つけるために自分自身を語って保持します。まさに>>。 あなたが文字列を扱っていることにより、この人間とコンピュータの規則は、あり そうでなければ今のchar星として知られている、あなたは、単に把握する必要があります 生活の中ですべての文字列の最後は本当にただ、forループでそれを反復することである あなたが文字列の終わりを見つけるように何でも、whileループ、 今、あなたはそこから推測することができる、ああ、単語全体はHELLOだった。 プログラミング経験を持つあなたの人々は、Javaで知っているかもしれません あなただけ。長さを呼び出すことができますし、他の言語では、長さまたは類似を呼び出すことができます。 多くの言語で、特に物事はオブジェクト指向言語と呼ばれるのはそういうわけです。 何かの長さは、データ自体の一部のカプセル内部の一種である ずっと月曜日に学生の中にカプセル化された我々IDと名前と家が好きです。 しかし、Cは、はるかに低いレベルである。あなたが前にそれらの用語を聞いたことがある場合にはオブジェクトやクラスは、ありません。 あなたが持っているすべては、実際にはメモリアドレスです。 だから、これは興味深いデータ構造を表現する昔ながらの方法の一種です。 あなたは、最初の文字のアドレスのような開始値が設定されてい その後、誰もが従うことに同意するだけでいくつかの任意の慣例。 だから、文字列の長さがどのように実装されるか、我々は提案しましたか? あなた方の何人かがここ数回使用しているstrlenは、strlenは、。これは、右、非常に簡単です? これは、2行のコードのようなものだ。 それは多分、追加のローカル変数と、かなりいくつかの並べ替えのためのループです。 しかし、strlenはただのポインタを取り、次に\ 0を探して起動する必要があります。 とすぐにそれを見つけると、それは、その文字列で取ってきてステップの合計数を返すことができます。 だから、我々は次で何が起こっているのかこのことから推測することができます。 私は10行目で行ったように、私はトンを宣言した後と仮定します。 これは、いくつかのゴミ値です。誰が最初​​に知っていますか? しかし、10の行の右側に、私は再びGetStringメソッドを呼んでいる。 これが終わるどこに誰が知っているか? 任意のオペレーティング·システムは、ここの上に方法のための部屋を見つけたとしましょう​​。 私は、偶然に再びH-E-L-L-Oを入力するように起こる それで我々は絵の同じ種類を描くことができます。 しかし、私はこの絵を描画したという事実は意図的なものである それがあるため、これよりも、HELLO異なる。 だからここでは、この場所456、これは457である、などであるかもしれません。 疑問符がかつてあった場所だから何入れてされますか? この場合、456で。 我々は今日の後なぜなら本当に任意にこれらの数字を拾っている 我々は何のアドレスが何であるかについてはあまり気にするつもりはない。 我々が気にすべては、我々はハローのようないくつかのデータのアドレスを把握することができるということです。 だから、実際にはメモリアドレスの話をするとき、ほとんどの人はコンピュータ科学に何をすべきか そして、具体的にポインタの話 このようなものが実際にある気に、 - 123を考え出す気にするのではなく 我々はちょうどそれがいくつかの数値アドレスであることを知っている - 我々は世界を単純化し、ちょうどsはその文字を指していることを言う とtはその文字を指している。 そして、それは矢だという事実は、かなり意図的なものです 文字通り今sはHとTを指しているので、他のHに向いている 、一日の終わりに、それはアドレスが何であるかは関係ありませんので、 しかしそれは我々がコードのいくつかの作品で、そのアドレスを表現する能力を持っていることに関係しません。 私たちは本当に、まだ、これらのアドレスを操作していない ので、我々は、我々は差し挟むとポインタで物事を行うに並べ替えることができますどこに表示されます しかし今では、12行目で、文字通り我々が比較しているものの値について 12行目でこの話によると? 我々は456から123に等しい等しいと言っている?そして、それは確かにそうではない。 さらには概念的に、このポインタは間違いなく、これと同じではありません は、2回GetStringメソッドと呼ばれ、GetStringメソッドは、巧妙なスーパーになろうとしないので、 それが実現しようとはしません、ああ、あなたは5分前Hello型付け; 私が前にあなたを与えたとして、私はあなたに同じポインタを与えることができ、 それはちょうどあなたがそれを呼び出すたびにメモリの新しいチャンクを割り当てます。 だから我々はこの問題をどのように修正すればよいですか? 私はハローとHELLOの文字列を比較したい場合は、より高いレベル - 私はポインタを気にしないでください - 私は、質問に答えるにはどうすればいい、 ユーザーが同じことを入力したのですか?ここには何が必要ですか?うん。 [学生]は関数を使用します。 >>私は箱の機能を使用することができます。 私は、S-T-R-C-M-Pは、strcmpという関数を使用することができます ストリング比較というのは単に簡略版。 そして、我々が入る場合には、例えば、2を比較して、今日の資料の中である、 私はまさにそれを行います。 私は、26かそこらまでに他のすべての1行目にも同じものを保持 そして今、この部分が少しだけ変更されています注意してください。 瞬間のため28行を無視して、この1にだけ焦点を当ててみましょう。 我々は、str比較がないことを月曜日何を言いましたか? それが、この場合は2ポインタ、s、tを取るのプロセスを処理 実質的にはこれらの2文字に、その指を入れての並べ替え、 をどのように処理をしなければならないことは、forループ、whileループ、またはのようなものです それはこれらが同じであると言う?そうだとすれば、それは、指または前方ポインタを移動します。 これらは同じですが、これらと同じ、これらと同じ、 これらと同じ、これらと同じ?とのooh、私はsとtの両方で、文字列の末尾に来ている。 私はすべての矛盾を発見していない。はい、これらの文字列は同じです。 2つの文字列が同じである場合、何が明らかにstrを、リターンを比較するのですか?ゼロ。 だから、0は、この場合には良いのだから、これは-1または1を返す場合 それはsがちょうどトンアルファベットの前または後に来るトンを起こることを意味します。 そして、なぜその文字列が前に来るかを示し機能があると便利だろう またはディクショナリ内の後? [学生]検索。 >>検索と並べ替え。 だから、二分探索やバブルソートのようなものを行うか、またはソートをマージすることができます あなたは物事を比較する必要がある。 これまで我々は、種のいくつかのコーナーをカットしたとだけソートの話 数値の文脈でそれは話をいいと簡単なので、 しかし、あなたは確かに、文字列、リンゴとバナナを比較することができます リンゴも同様に、バナナの前に来ることが知られている場合があるため、 あなたは、ビデオでマージソートでやっただけロブのようなメモリ内の周りの文字列を移動することができます そして我々は選択ソート、挿入ソート、バブルソートと一緒にステージにここで行った。 だから他にどこ私たちはこれを取ることができますか?これを試してみましょう。 ソートの瞬間のためにその教訓を忘れて、今試してみて、次の操作を実行する1.Cコピーしましょう​​。 21行目では、私は、印刷に何かを言っている それから私は、ユーザから文字列を取得しています その後、私はこれをチェックしている。 私たちは本当にまだこの習慣に得たが、今これをしてみましょうされていません。 バックこの層はがし実際にしてみましょう。これは本当にchar *である。この男は本当にchar *である。 だからそれは、s == NULLかどうかをチェックすることが何を意味するのか? それはあなたがGetStringメソッドのような関数を呼び出すときにことが判明 以上、一般的に、単に、あなたにいくつかのメモリを与えるために、コンピュータを頼む 何かが間違って行くことができます。 あなたが夢中になるとメモリのテラバイトのためにコンピュータを頼むことができる ちょうどコンピュータに存在しないメモリのバイト数兆を求めることによって、 しかしGetStringメソッドと他の機能はあなたに叫んでのいくつかの方法が必要 あなたはあまりにも多くを求めてきた場合。 あなたがより多くのメモリを要求した場合とGetStringがこれを行う方法です それは、超、超低確率であっても、コンピュータで利用できるより 私たちの誰にEnterを叩いて次に兆文字を入力しようとされていないため、 それはあるかもしれませんが、低確率は、私はまだ、念のためにそれをチェックしたい そして特別な値GetStringメソッドは、答え、およびその他の機能返す 何かが間違っている場合はすべて大文字でNULLです。 とNULLは何ですか? NULLは、ポインタを表すために起こります。これは、メモリアドレス0です。 これは私のコンピュータのメモリであれば、世界は、その任意に決めた - あなたは何を知っているか - 我々は、すべてのコンピュータのメモリの1バイトだけを盗もうとしているが、これは位置0になります。 我々はそれをNULLのニックネームを与えようとしている、と我々は約束しようとしている 私たちは実際にそこに実際のデータを入れないことを 私達はちょうど任意に特別な値、0、別名NULLを、必要とするので 何かがうまくいかない場合、我々はユーザーが怒鳴ることができるように。 そうでなければ、ここに何かを置く0を意味するのか知らないかもしれない またはそれは何かが間違っていた意味があるのですか? 我々は、すべてがNULLの場合は何も返されませんでした同意する必要があります 実際のアドレスが返されませんでした。 さて、ここで私はちょうど私の私の人間の慣習を採用していると、メインから1を返す 何かがうまくいかない場合。 メインの戻り規約が良い場合には0を返すことであるのはそういうわけです。 1または他のいくつかの値が悪い場合。 しかし、GetStringメソッドと、何かが悪くなった場合、そのメモリを返すのお得情報がNULL任意の関数。 オーケー。だから残念ながら、27行目、それはですが、超簡単に、完全に文字列のコピーに失敗した。 なぜですか?我々は、これは次のように見ることができます。 私はsのコピーを作り、それがトン呼び出しする27行目で主張している。 だから私は2つの文字列今回の入力をユーザーに求めていないよ、私はちょうどsの値を言っている 同様にトンに置かなければいけません。 だから今ちょうど私がやっている29行目以降では、これがどのように壊れた実証するには? tの長さが0より大きい場合は最初に私がチェックしている。 そこにいくつかの文字列があります。ユーザーが何かを打鍵した 32行目は、明らかに、何をやっている? [聞き取れない生徒の応答] >>権。に、どのような種類の私はそれをやって言ったことから、それを推測することができます。 しかし、技術的には、これは何をやっている? T [0]何を表す? [学生]ゼロ番目の文字。 >> [マラン]ゼロ番目の文字。 または、より人間に近い、Hはこのケースでは、多分ある何トン、の最初の文字。 とtoupperはそれが言うことありません。これは、tのゼロ番目の文字を大文字にし、それを変更します。 だから、これが意味するのは、tのゼロ番目の文字を取り、それを大文字にし、 その同じ位置に戻す。 私は小文字でhelloと入力した場合そのためには、これは資本Hに小文字のhを変更する必要があります しかし、問題は、行35と36で私は何をしようとしているんということであることは私達のsとtのためにプリントアウトしています。 そして、あなたの勘は何ですか? 私は実際に私はすべて小文字でhelloで入力かどうかを確認するために何をするつもり? 何が印刷されたために起こっているのか? >> [聞こえない学生の応答] >>それは何ですか? [学生]ビッグHと残り小。 >>ビッグHとなるための小さな残り、SまたはT? [学生]の両方。 >>両方。その通りです。だからここで何が起こっているのか見てみましょう。 私が先に行くと、これをコンパイルしましょう​​。これはCOPY1ので、COPY1を作る。かしこまりました。 小文字でこんにちは:私が先に行くとCOPY1を実行すると、入力し、何かを言わせてズームイン。 、それはコピーを大文字にしますが、それは明らかにだけでなく、元の大文字 今、この物語の中で何が起こるか理由? 27行目では、私は実際には、文字列をコピーしていないようです しかし、あなたは、直感的にそうであることを望んでいたかもしれませんが、 あなたがこの絵を考えると、何が本当に私がやっていますか? 絵の半分は同じです。 tはまだ物語の中で存在していないので、それでは時間にロールバックすることができます。 Sは、物語の中で存在することができますが、レッツはhello今回の小文字。 だから私は、実際に打鍵したものを私が修正しましょう ここではこの場合、私たちはH-E-L-L-oを持っています。 我々は、文字のシーケンスとしてそれを描くよ、ここに私の区切り線を入れて、私の\ 0。 だから、これは我々が24っぽいを通じてできるだけ早く、1行目のようにされている場所です、与えるか、または取る、実行されました。 これは私の記憶の絵です。 私は27行目に到達したとき、何が起こりますか? 前と同じように、私はこの正方形として描画しますポインタを取得します。 それは、tと呼ばれています。と、デフォルトで、その値は何ですか?誰が知っているか?いくつかのゴミ値。 だから私は、その先に疑問符などの抽象的なよ。 とすぐに27行目の右側の実行時に、私は何トンの内側に入れています? sでの同じ事。 であれば、その瞬間のために矢印のこの抽象化を削除して、我々は言う、 ああ、これはあなたがtはs、セミコロンを取得すると言うときに、メモリの読み込みアドレス123であり、 あなたは文字通りここに123を入れている。 今、私たちは、一種の映像が付いて再び私たちの世界を単純化した場合、 あなたが本当にやっただけで、あなたの世界に別の矢印が追加されます それはtからまったく同じ文字列を指している。 だから、31行目と32に私が実際にT [0]を変更しようとするなら、 今でT [0]どうやら代名詞は何ですか? S [0] だからそれは起こっているすべてです。 そして、この種のは少し低レベルと難解に感じていても そして、この種のは、おそらく直感的に、これは単に働いているはずのように感じている - 私は前のもののコピーを作った、それだけで働いていた - あなたが実際に文字列が本当に何なのか考えてみれば、それはchar *です。 まあ、それは何ですか?これは、いくつかの文字のアドレスです。 その後、おそらくそれはあなたが何かをしようとする方が理にかなっている このようなスーパーは一見単純な、あなたがやっているすべてのメモリアドレスをコピーしています。 あなたが実際に文字列そのものを使って何をやっていない。 あなたは、コード内でこの問題を解決するだろうか見当がつかないので、たとえ、 高レベルは、概念的には、我々は明らかに、sの真のコピーtaのようにするために何をすべきか必要なのでしょうか? うん。 >> [生徒]それに新しい場所を与えるか?まさに>>。 我々は、tのブランドの新しい場所を指定する必要があります。 我々は、何らかの形で我々はメモリの新しいチャンクを取得している世界を作成する必要があります ただ明瞭さのために私は右のこの1下描きますが、それはそこである必要はありません。 しかし、それは同じサイズである必要があるので、私は同じ場所で、これらの垂直線を描画します。 これは、最初にすべてのゴミであれば、それは大丈夫です。誰が何だったか知っていますか? しかし、ステップ1は、私は必要なだけのメモリとして私に与えなければならないとしている ハローのコピーに合わせて、ここでのe、ここにhをコピーする方法を見つけ出す、 ここなどリットル。 しかし、これは既に詳細のいくつかは、まだ抽象的であっても、少し明らかに感じるはずです。 この中には、この文字列をコピーするには、それがループまたはwhileループのためだけだ またはすべてのより身近になってきたいると何か。 それでは、これを試してみましょう。私はcopy2.cに行こう。 copy2.cでは、27行目を除いてほぼ同じプログラムを持っています。 、それは少し複雑に見えますが、私たちは、ピース単位でそれを打破した場合 左側は同じです。 char *のtは疑問符とはいえ、メモリ内にこの事を作成 私たちは、デフォルトで何があるか見当がつかないので。 右側に我々は今、新しい関数、malloc関数を導入している メモリーてくれメモリを与える、割り当てる、 そしてそれは明らかにどのように多くの引数が、どのように多くのものは括弧内がかかるのですが? 私は1と2のつぶやきを聞いたが、それだけで1です。 括弧の内側のちょうど1の事があることを意味しな​​いカンマは、ありません。 他の括弧があるにもかかわらず、私が強調表示させ 最も外側の括弧の中に何だし、それは、この式は次のとおりです (strlenは(S)+ 1)*はsizeof(char)は。 我々は実際にこれを介して思えばそれで、これは私にsの長さを与えると言っている。 なぜ私は長さに1を加算する、しかし、午前? >> [聞こえない学生の応答] その通りです。我々は、最後尾には英語の意味もありません6番目の文字をこの男のためのスペースが必要 しかし、特別なプログラム的な意味を持っていません。 だから我々はそのために+ 1を必要とするため、strlenの戻り長さの人間の期待、 helloまたは5、それはあなたに追加のNULL文字を与えるものではありません。 だから私は、手動で+1でこれを追加します。 そして、この、*サイズ(char)は、我々は前にこれを見ていない。 これは技術的には関数ではありません。 それはちょうどサイズがコンピュータ上でいくつかのデータ型であるかを表示します、特別なキーワードだ 現実には、私たちの一部は32ビットコンピュータを持っているからです。 私は自宅でかなり古いコンピュータを持っている、それだけでポインタを表すために32ビットを使用します。 私はデータ型の大きさをしたそうだとすれば、それは32ビットであるかもしれません。 しかし、私は私の新しい派手なコンピュータを使用している場合、私は64ビットの値を取り戻すかもしれません アドレスのような何かのために。 したがって、この場合は、単にスーパーセーフであるとは、私たちのようなハードコード何かするつもりはない - まあ、我々はこれまでに言ったことによるとcharのサイズは何ですか? 我々はかなりそれが1バイトだし、それは軒並みかなり本当だと口頭で言ってきました。 しかし、再び、仮定が悪くなる傾向があります。 人々はあなたが意図していなかった方法で、お使いのソフトウェアを使用している場合、彼らはバグだらけのソフトウェアにつながる。 そうしてみましょうこの抽象離れて、ちょうどより一般的に言う 私は、メモリのこの多くのチャンクが必要 とメモリの各チャンクは、文字の大きさと同等である必要があります これは、このケースでは、実際には1に等しいですが、それは、それを作成するための、より一般的な方法です。 言葉は、helloがないような場合は、どのように多くのバイトmallocが明らかにハローに割り当てるのでしょうか? [学生] 6。 >>シックス。我々は画面上に疑問符を持っているとおりに正確に多くの。 そして、今、GetStringメソッドの理解に基づいた推測取る malloc関数は、おそらく何を返すのでしょうか? >> [生徒]アドレス。 何のアドレス?最初のメモリチャンクの。 我々は、いくつかの他の機能ので、何があるか見当がつかない 以前にこのメモリを使用している可能性があります。 しかし、mallocは、GetStringメソッドのように、メモリの最初のバイトのアドレスを返します それはあなたのために取っておかれていること。 しかし、どのようなことが行わないと、バックスラッシュヌル文字で、この空白を埋めている 整数、文字列、配列、:何かを割り当てるためにmallocを使用することができますアウトそれは回りため 山車、学生構造。 あなたは完全に一般的にmallocを使用することができます。 それは気にしたりするためのメモリを割り当てているものを知っている必要はありません。 だから、\ 0を置くためにmallocのおこがましいだろう メモリの各チャンクの終わりに、それはあなたを与えている この\ 0のものは、単なる文字列のための規則ですので。 それはint型に使用されていないのは、それが浮動小数では使われない、それは学生のためには使用されません。 それでmallocで落とし穴が負担はあなたに完全にプログラマであるということです あなたが割り当てられ、何バイトを覚えて、これまで、forループを使用しないように またはwhileループとあなたが与えられたメモリの塊の境界を越えて行く。 できるだけ早くあなたがメモリを割り当てるように、別の言い方をすれば、 は、オペレーティング·システムを求めることはできない、ああ、ところで、これがどのようにメモリのチャンクのビッグでしたか? あなたは、その値が必要な場合は覚えて完全にあなた次第それだけです。 だから私はこのメモリを使用するように進んで方法を見てみましょう。 28行目と29では、なぜ私はこれをやっている? ちょうど合計サニティチェック。 念のために何かが間違っていた、私はメモリのいくつかのクレイジーな量を求める または私がそう多くの事は、ちょうど十分なメモリがないことをコンピュータ上で実行されている そのような何かは、私は、少なくともnullをチェックしたいと思います。 現実には、ほとんどのコンピュータはあなたにすべてのプログラムのような錯覚を与えるだろう あなたのRAMの全体を使用することができ、 しかし、たとえそうであっても、おそらくいくつかのクレイジーな長い文字列で、ユーザがタイプした場合は、彼らは悪いやつだから そして、彼らは実際に、そこにあなたのプログラムやハックをクラッシュしようとしている あなたは少なくともmallocの戻り値をチェックしたい、それはヌルと等しいかどうかを指定します。 それがないなら、私はそのような場合に何をするかわからないので、ちょうど今やめておきましょう。 どのように私は、文字列をコピーするのですか?これにはいくつかの方法があります。 そこにstrのC言語の関数をコピーしていますが、私たちは、この昔ながらの方法で行うためには、それは簡単なスーパーです。 最初に私はsの長さが何であるかを把握しましょう​​。 私は、ループ内でこれを入れたかもしれないが、その代わりに、私はちょうどここではわかりやすくするために消した。 だから、nが今明らかに、5元の文字列の長さが格納されます。 次にループのための私に私がアップした場合は0からnまで反復するんだけど、 し、反復のたびに私が入れているs [i]はtの内部[i]とする。 だから、それは私が前に文字列を指して私の2本の指で暗示なのです。 このforループは次のように反復したように、私はここにhをコピーするつもりだ、 ここで、Lはここにに電子本がsであるので、これはtです。 そして、最後に、35行目では、なぜ私はこれをやっている? 私は、文字列tを終了していることを確認する必要があります。 そして、私は明示的なスーパーであることが、このようにそれをやった。 しかし、あなたができれば、これを行うための別の方法を誰かを提案する。 私は本当に35行は必要ありません。これを行うには別の方法があります。 うん。 >> [聞こえない学生の応答] >>それは大声で言ってやる。 [学生]より小さいか等しい。まさに>>。 私達はちょうどより小さいか、一般的には悪くなっているnに等しいと言えるでしょう なぜなら、ほとんどの場合、私たちが頼りにしている事に等しいに上がるとき 我々はあまりにも遠くに1ステップ移動します。 しかし、覚えて、我々はどのように多くのバイトを割り当てたのですか? 我々は6の合計なので、5 + 1 sのstrlenを割り当てられた。 したがって、この場合、我々はこのような何かができる 我々は非常に端にだけ挨拶も\ 0ではありませんコピーしているようにします。 別の方法として、我々は、strcpyのは、strのコピーと呼ばれる機能を使用することができます それはほぼ同じくらい楽しいことはないだろう。 しかし、それがすべてで、それがフードの下に行います。 それから最後に、私たちは前と同じことを行う。 私はtを大文字にしてから、私はこのようなオリジナルのルックスとコピーがそのようになっていることを主張している。 それでは、今、これを試してみましょう。私はここに行ってみよう。 COPY2を作る。我々はズームインしてCOPY2を実行することになるでしょう。 私は小文字にhelloを入力するつもりですし、実際に私は、元のようにこんにちは小文字取得 コピーのための資本こんにちはけど。 しかし、私はちょうどまだいないよ。私はここ1最後の事を行う必要があります。 46と47は明らかにメモリを解放しているが、それは実際に何を意味するのか? 私は何をやっていると、46行目と47行を呼び出すことによって、思いますか? これはどういう効果があるのでしょうか?うん。 [聞き取れない生徒の応答] >>その通りです。 あなたはただ、ちょっと、このメモリのおかげで、オペレーティング·システムに指示しています。 これで、他の誰かのためにそれを使用することができます。 そしてここでは、ゴミの値の完璧な例です。 私はちょうど、2ヶ所にhelloという言葉を書き留めて、このメモリを使用している ここ、ここ、ここ、ここに。 だから、これはH-E-L-L-O-\ 0です。 しかし、私は46行目と47行を呼び出すと、あなたは、絵の面でそこに何が起こるか知っていますか? 実際には、待って、この絵は古いものです。 我々はコピーを作成したら、この男は、実際には、ここを指している ので、もう一度番号を削除して、単なる抽象的な離れて私たちの矢印のようにしてみましょう。 私は自由を呼び出すときに何がこの写真ではどうなりますか? [聞き取れない生徒の応答] >>さえない。 私はsとtの空き呼び出す場合 - トリックの質問の種類 - この絵はまったく変更されません sを呼び出すと、呼び出しているため、tはちょうど、オペレーティングシステムに指示 ねえ、あなたは再びこのメモリを使用することができますが、これがnullに変更されることはありません またはいくつかの特殊文字は、それは、これを変更しない それは、Hまたはeまたは何か他のもののいずれかの場所でLまたはlまたはoを変更することはありません。 絵の面では、できるだけ早くあなたが自由に、何も変化を呼ぶ。 なぜならもし私がその後、このプログラムで、そこにゴミの値の起点に位置してい そのようなGetStringまたはmallocまたは何かでより多くのメモリ用のオペレーティングシステムを尋ねる およびオペレーティング·システムは、確かに、私はちょうど解放された12バイトのメモリを持っている、と言う これらを使用して、あなたは何を手渡しするつもりですか? あなたは、私たちが一般的に描くだろうとメモリの塊を手渡しすることになるだろう 疑問符を含むが、これらの疑問符は何ですか? 彼らは、H-E-L-L-O、H-E-L-L-Oであることが起こる。 これらはできるだけ早くあなたがそのメモリを解放としての新しいガベージ値です。 現実世界の含意がここにもあります。 これは、RAMで行うことになりますが、コンピュータ 実際にはディスクと同じことを行う。 我々は、科学捜査に焦点を当て、将来の問題セットで、特にこのことについて話します。 しかし、あなたがあなたのデスクトップにいくつかの重要な財務ファイルがある場合は実際に何が起こるのか またはいくつかの不完全なJPEGとあなたのゴミ箱にドラッグし、 あなたがゴミ箱やごみ箱にドラッグしたときに何が起こるか? あなたは、私が何を話しているかを知っていた。 [笑い] あなたのごみ箱またはゴミ箱にその証拠をドラッグしたときに何が起こりますか? [聞き取れない生徒の応答] まあので注意。あなたがそれを行うとどうなりますか? 短い答えは右、何もありません? スケッチや機密ファイルはまだちょうどあなたのハードドライブのどこかにそこに座っています。 私たちのほとんどは、少なくともあなたのゴミ箱を空にする必要があり、ハードな方法を学んできました またはあなたのごみ箱は、実際にファイルを削除します。 そして実際には、右クリックするか、ゴミ箱をクリックしてコントロールすることができたとき またはファイル、ゴミ箱を空または何を選ぶ そして実際にゴミ箱や実際にこの絵に次に何が起こるかごみ箱、空? もっと何もありません。だから、何も実際にディスク上に起こりません。 我々だけで一時的に脱線して書き込む場合と - I'llはちょうどこれの裏を使用しています。 だから今の話は、プログラムが存在するところであるRAMから変化している あなたは彼らが長期的に保存されている場所である、ディスクには、それらを実行している間 電力は今のところ、外に出るときでも - と我々は将来的にはこれに戻ってくる - ただこれは、コンピュータのハードドライブの内部を表しているふりをしてみましょう ので、戻って一日で、彼らははるかにフロッピーディスクのように、円形のディスクであることを用いた。 あなたには、いくつかの敏感なExcelファイルを持っているそうだとすれば、それはメモリの塊を取るかもしれない お使いのコンピュータのディスクに、と私はちょうど同じ任意の1と0を描いてる。 あなたのゴミ箱にそのようなファイルをドラッグするか、ビンをリサイクルすることができ、 AppleとMicrosoftは決めたから、文字通り何も起こりません ごみ箱とごみ箱は実際には単なる一時的なプレースホルダです。 たぶん、最終的にOSがあなたのためにそれを空にしますが、一般的に、それは何もしません、 あなたが宇宙には本当に残り少ない少なくともまで。 ただし、空のゴミ箱やごみ箱を空に行くとき、 同様に、何もこの絵に起こりません。 お使いのコンピュータ上の他の場所に起こるすべてのことですが、テーブルのいくつかの種類があります。 それは、、としましょう​​、と言って少しカンニングペーパーのようにソートのresume.docだ ので、あなたのハードディスク上の場所123に住んでいたMicrosoft Wordファイルであなたの履歴書、 メモリではなくではなくRAMにしかし、あなたのハードディスク上、 と456であなたの大ざっぱなJPEGの生活、あなたのExcelファイルが789で、またはどこに住んでいます。 あなたが実際にゴミ箱やごみ箱を空にしてファイルを削除すると、 この絵は変わりません。ハードドライブ上の0と1はどこにもありません。 しかし、この表には、ある種のこの小さなデータベースは、変更を行います。 ファイルはいくつかの意味で削除されているかのようにあなたの履歴書を削除すると、それは、ある その事は、ハードドライブ上のどこに住んでますが、すべてのコンピュータが忘れされません。 あなたの履歴書またはこれらの他のファイルのいずれかを構成する0と1はまだそのままです。 あなたが誤ってこれをしたのであれば、非ゼロの確率はまだある あなたは、Norton Utilitiesまたはいくつかの商用ソフトウェアを使用してデータを回復できること その目的は生活の中で一種の孤立されたことを、0と1を見つけることで、 ここで忘れてしまっていますが、データを取り戻すことができるように、ここを去った。 または警察やFBIの法医学調査官は、実際にはハードドライブを取るだろう そして実際には、Excelファイルのように見えますが、JPEGのような0と1その表情のパターンを探して とコンピュータがそれらを忘れてしまった場合でも、それらをそのように回復します。 だから我々は、将来的に説明しますと、データを削除するには、本当に唯一の方法は、 することで、ファイルやハードディスクをスクラブまたは拭くことです - あなたは本当に、0と1を取り除くことができない そうしないと、ギガバイトのハードドライブで開始したいので、 あなたは常に削除された場合、あなたは、メガバイトのハードディスクドライブで終わるだろう 文字通り、0と1。 あなたが本当にあなたの曲をカバーしたいならそれで、あなたは何をしますか そして根本的な問題はまだディスク上に0と1があるということです? 私はあなたがデバイスを物理的に壊してしまうことをジェスチャーを誰かを参照してください。それが動作します。 [笑い]しかし、それはより合理的であるもの高価な解決策のようなものだかな? うん。 >> [生徒]、それらを上書きします。 >>何でそれらを上書きしますか? >> [生徒]その他のデータ。 その他のデータ。あなただけの0または1またはすべて0、すべて1を使用してディスクを上書きすることができます。 そして、それはいくつかのソフトウェアが何をするのか本当にです。 あなたは、ソフトウェアを購入したり、無料のソフトウェアを取得することができます さらに、Windowsで少ないので、これらの日のMac OSに組み込まれ、 安全に消去する機能です。 実際に、あなたがMacを持っていて、これを行う場合は、今日すべてのホームランをしてみたいのなら、 あなたが持っている場合は、ゴミ箱の中にいくつかのものは、あなたは、確実にゴミ箱を空にするを行うことができます これは、まさにその作業を行います。 ちょうどここにファイルを消去するのではなく、それは、ここで0と1を消去しません むしろ、それだけで0とドット、ドット、ドットには、例えば、それらをすべて変更します。 だから、あなたの将来のpsetの一つは、実際には意図的にデータを回復するであろう - 我々は人々、場所、キャンパス上のものの撮影した写真 私たちは、デジタルカメラのメモリーカードのフォレンジックイメージを作ってあげる そのまったく同じ考えです - あなたは、実際に見つけるために挑戦しなければならないでしょう ハードドライブ上のJPEGファイルを表すパターン ずっとそのメールその元学生のように私は数週間前に読みました 妹の写真を回復する。 なぜ我々はここで5分間の休憩を取ることはありません、我々はメモリの詳細に再編成します。 そこでここでは、物事は少しハラハラドキドキ取得する場所ですが、これは非常に強力なステップです このすべての詳細を理解するため。 ここpointers.cと呼ばれるプログラムです。 それは今日のサンプルコードの一つです。 最初の数行は、22〜19で、私たちがやっていることすべてがGetStringメソッドのようなものであることに注意してください とsに格納し、アドレスを返す。 今後のpsetさえ3用したい場合はしかし、PSET 4と上 あなたは自分自身をオフこれらの補助輪を取るために始めることができる場所、 文字列がもう存在しているふりをする理由はありません。 それは確かにただのchar *を言って起動しても大丈夫です。 余談ですが、オンラインの参考文献に、書籍では、多くの場合、変数の横に星が表示される場合があります。 あなたも、それの両側の前後にスペースが表示される場合があります。 それらのすべてが機能的に正しいです。 ただし今のところ、我々はスーパーを明確にするために、このアプローチを標準化します そのchar *は文字ポインタを言っているようなものです。 これはデータタイプです。 そして、変数の名前は、このケースではsです。 だから我々は文字列を得ていると我々はそれだと呼んでいます。 その後ダウンして、ここで私は実際に策略を少しやっていることに気づく。 これは超簡単なの一種でポインタ演算を、と呼ばれています。 それだけでポインタに数字を加算および減算を意味します。 しかし、これは実際に動作します。 このプログラムは明らかにそのような最終的な結果は、その行あたりの文字列の1文字を出力します - ちょうどので、私たちは、これがどこに行っているか台無しにポインタを作り、ポインタを実行し、私がズームインさせることができます 今私は、ハローのようなものでタイプAとタイプ入力してみましょう そしてそれは1行につき1文字を出力します。 最大秒前まで、我々は、角括弧表記でこれをやっていただろう。 我々はループのために持っているだろうと我々は、sのprintf行うと思います[i]は、我々は再び、何度も何度もそれを行うと思います 各行の末尾にバックスラッシュnです。 しかし、このプログラムは異なります。このプログラムは、文字通り、算術を使用しています。 だからここで何が起こっているのですか? まず第一に、このループがあっても実行する前に、ちょうど明確にするために、実際の何ですか? Sはありますか? >> [生徒]アドレス。 >>アドレス。 そしてそれは、ハローの場合には、hでその単語、の最初の文字のアドレスです。 だからsは、この特定の例では、hのアドレスです。 だから何それがS + Iを行う意味があるのですか? まあ、私は、このforループでは0から始まります。我々は、何回もやった。 私は明らかに、文字列の長さまで行くつもりです。 だから、このループの最初の繰り返しで、私は明らかに0である。 したがって、この式は、S + Iを言っている - むしろ、S +0、つまりちょうど明らかにSさん。 だからここに* sは何ですか? 今、私たちは少し異なる方法でスターを使っている。 我々はtとsのコピーの話をやっているので私が先に行くと、トンを取り除くましょう。 今、私たちは単にsを含むストーリーをお伝えしたいと思います。 ので、この瞬間に、string型をした後、私たちの世界は、それが以前と全く同じように見えます ちょうどSがHのアドレスを格納し、より一般的にハローの文字列を指している。 私は今、*(S + I)のような行を行う場合は、これを試してみましょう。 だから*(S + I)。これが0であるので、私はこれを簡素化しましょう​​、これは*(S 0)です。 まあ、ちょっと待って。さらに簡素化されます。これは*(s)である。 さて、今括弧は愚かなの一種であるので、今ちょうど* sは行いましょう。 だから、このループの最初の繰り返し、ハイライト表示さ​​れ、その行は26で、 これを印刷にほとんど同等である。 * sのデータ型は何ですか? この文脈では、星がS自体の隣にあることを起こるので しかし、より具体的には、私たちはもはや、sを宣言されていないため、 我々はもはや変数を作成していない、26行目のchar *の言及は、ありません キーワード文字列の言及がありません、我々だけでは、sという変数を使用している それが今では星が意味を混乱させて、確かに、少し異なるがあり、判明した。 ここで* sは存在するものは何でもsおよび印刷のアドレスに送られることを意味します。 だからsがここにある、* sが - のような滑り台とはしごのようなものには、矢印をたどる - ここ。 だから、これは* sです。 だから、26行目でそのループの最初の繰り返しで何が印刷される? 私は文字のプレースホルダです%cを、プリントアウトする その後、新しい行の\ n。 *(S + I)iは0がちょうどこれですです。 だから私は%cにに何charを置けばよいでしょうか。 H. これがどこに行っているか、あなたはおそらく見ることができます - - ループの次の反復で 次の繰り返し私は明らかに1であるので、この手段の1、 その後すぐに私は今、星は言う必要があるため、括弧が必要なのでしょうか メモリアドレスの1に行く。 sは何ですか?のが時間内にロールバックし、この矢印が今、実際に私達に好意をやっていないとしましょう​​。 これはナンバー123を保存していると言うより具体的にしてみましょう この文字列の先頭がhello、これはアドレス123であるので、これは等124である、と。 だから私は、S 1を言って2回目の繰り返しで、それは、123 1を言ってようなものだ そうでなければ124として知られているので、何charは2回目の反復に印字されますか? メモリアドレス124でE。 次に+を再度、125、126、127、と私たちはここに来る前に、このループは、ありがたいことに停止します 私は私が高すぎカウントされないことを確認するためにstrlenを使用していますので。 だから、あまりにもそれである。 繰り返しますが、これは、我々は一週間前に行われたかのようになります。 我々は両方を行うにはしたくないにもかかわらず、私はその下の行に書いてみましょう。 これはここと同じです。 だから我々は数週間のためにそれを求めてきたようにsは、文字列であっても、sは本当にchar *である。 私たちはスーパー肛門になりたいのであれば、それは、特定の文字を書くことが本当に適切だ これらの数値アドレスとこの星の演算子を使用してi番目の位置で、 しかし率直に言って、これはちょうどそんなにクリーナーです。だから、これは悪いことではありません。 いいえここに27行をやって停止する理由はありませんが、26は機能的には同じですが、 そしてそれは我々がこれまで扱ってきたまさに理由のために、機能的に同じです。 そして最後に、29がちょうど良い習慣です。 sのフリーコールすると、今あなたがGetStringメソッドはあなたを与えていたメモリをバック与えていることを意味します 再び、私は週にgetString、月曜日に述べたようので、 あなたのコードにバグを導入してきました。 週間のあなたのコードは、メモリリークがありました それによってあなたは、メモリにGetStringを求めてきたが​​、あなたが戻ってそれを与えるされていなかった。 そして、それは意図的に教育的に当社が選ばれました それが早い段階で考えるようにあまりにも多くのだから。 しかし、今、私たちはより多くの対称性を必要としています。 あなたがメモリをコンピュータに言わせれば、として、GetStringメソッドの場合である などの場合は、malloc関数らしいが あなたも無料のpset 4以降、このようなメモリのために今しなければならない。 これは、int nを言って異なっていることに注意してください。 あなたがGetStringメソッドを呼び出していませんでしたので、これを解放する必要がありません そしてあなたは、mallocを呼び出していませんでした。 そして、我々は最終的にわかるようにあなたはgetIntを呼ばれた場合でも、 あなたが実際に整数の周りを通過できるので、getIntはあなたのためのメモリを割り当てません 我々は数週間のために行ってきただけの方法山車と文字。 本当に彼らは複数の文字を連結しているので、文字列は、しかし、特別なものです。 そこで、彼らは文字や山車やintからわずかに異なっているなどが挙げられる。 しかし、我々はそのずっと前に戻るでしょう。 次に、ポインタのこの初めに何か質問はありますか?うん。 [聞こえない学生の質問] ああ、非常に良い質問です。 便利であるCは、実際にあなたのためにいくつかの選択肢の中からひとつ、 それはサイズがデータ型である何あなたのための割り出しれ そして次にあなたのための乗算のようなものを行います。 ほとんどの場合charは1バイトですので、これは文字の場合には関係ありません ので、これだけで動作します。 しかし、議論のために、あなたが実際に整数を印刷していた場合 そしてあなたは、整数を指していたいくつかの値sをプリントアウトしようとしていた あなたは、同様に、intは4バイトであるという理由だけで+4 * iを実行する必要はありません。 ポインタ演算は、Cコンパイラがあなたのためのすべてのその計算を行うことを意味します。 あなたが気にしなければならないすべては、人間の感覚のようなもので計算したものです。うん。 [学生]は、forループの中の文字列を宣言する場合は、後でそれを解放しなければなりませんか? 良い質問です。 forループの文字列を内部に宣言された場合は、後でそれを解放する必要がありますか? あなただけがgetStringでまたはmallocと割り当てることメモリを解放する必要があります。 あなただけの何かが好きと言うのであれば - すべてのコードが関係しているので、私は今、中括弧を置くことができます。 あなたはこのようなbuggilyいえ何かを、やっているならば、char * T = S、 トンは、mallocまたはGetStringの一切の言及を伴わないので、あなたは自由をtにする必要はありません。 あなたがこれをしなかった場合はこれとは対照的に、GetStringメソッドは、[はい、あなたは自由トンに作る必要があるでしょう。 そして、実際には、何にあなたの唯一のチャンスは、同じ有効範囲の問題のため、このループの内側になりました 我々は過去に議論してきたこと。 そうしないと、メモリを割り当てるメモリを割り当て、メモリを割り当てることがしたい、 と、プログラムの終了時には、そのループの外にいるので、 tが存在していませんが、オペレーティング·システムを言わなかった あなたはもう、そのメモリを必要としなかったこと。 やがて、psetの4または5のために我々は、Valgrindのと呼ばれるプログラムを身につけるよ それは、それは難解なインターフェイスから多少持っているという点で、精神でGDBに似ています しかし、生活の中で、その目的は、あなたを助けることである。 とValgrindは将来的にあなたのプログラムを検索するプログラムです メモリリークを探し、GetStringまたはmallocからかどうか、 その我々はできるだけ多くCS50ライブラリを使用して停止すると、すべての詳細を使用して起動します。 我々は最終的に今の語彙と理論的にはメンタルモデルの並べ替えのようなものを持って この壊れたプログラムを解決するためにどのと。 だから、この壊れたプログラムでは、スワップは、スワップの内部で動作 メインではxとyのリコール、渡されたので、それは実際にメインで働いていたことはありません そしてそれらはいわば、値によって渡された。 それらのコピーは交換するために与えられた。 スワップの終わりまでには、aとbは実際に交換されていたが、 もちろん我々は月曜日に述べたように、xとyは、されていなかった。 だから私は、これはここで実際に解決することをここに緑色で提案する。 そして実際に、私はちょうど一致しているように私の星を動かしてみましょう にもかかわらず、再び、機能的にこれは問題ではありません。 ときに、なぜそれが問題か将来週間後に我々は説明します。 だから緑色になりましたソリューションです。 私はこれらすべての星を持っているので、率直に言って、それは全体の多くの乱雑に見えます。 私は一つのことを指摘してみましょう。 それがint * aとint型* bを言うここで一番上の行 それが常に持っているので基本的には同じことをやっている。 これは、交換する2つの引数またはパラメータを宣言している と呼ばれるintポインタであるのは、最初に 第二は、bと呼ばれるint型のポインタです。 この時点で新しいだ唯一のことは、星がそこにあるという事実である。 どういう意味ですか? int型ではありませんが、bがint型ではありません。 intのアドレスであり、bは異なるintのアドレスです。 私はCが混乱取得認めるところダウンここで、これはです。 今、私たちは星を使っているが、それはこの文脈で異なる意味を持ちます。 我々がここでアップしているように、我々はポインタを宣言していないので、 ここで我々は物事を逆参照しています。 したがって、厳密には、スワップの内側に第一、第二、第三行のこの文脈でのスター ちょうどそこに行くことを意味し、間接参照演算子である。 私の指は、hに矢印を追ったので、同じように *そのアドレスに移動して、私にはありint型を見つけることを意味します。 * bはアドレスに行くと何があるか私を渡すことを意味します。 だから、今のフレームのスタックを使用してのは、月曜日から画像を再描画してみましょう の底1は、メインになるだろう の上位1は、スワップになるだろう 私たちの世界はこのように、ちょうど月曜日のように、見えるように。 ここでの主な使用しようとしているメモリのチャンクです。 プログラムはちょうど2つの変数を持っていたことを思い出して、月曜日から、 1は、xとyと呼ばれる1と呼ばれ、私はそこに1番と2番を入れていた。 今私は、私は月曜日に行ったように、スワップを呼び出したとき 以前に私はこのようになり、このプログラムの赤バージョンを、使用した場合 私は2つのパラメータaとbを持って、我々はこことここに何を書いたのか? 文字通り1と2は、xとyのコピー。 今日、我々はそれを変更します。 代わりに整数aとbを渡すの今日は2アドレスを渡すつもりです。 これらのアドレスは、intを指すように起こるが、それらのアドレスは、自分自身をINTSされていません。 彼らはアドレスです。それは代わりに郵便住所のようなものだ。 だから今我々は、単に画面上でもう少し詳細に自分自身を与える必要があります。 それはすべての一日だったので、これは私のコンピュータのメモリです。 今我々はいくつかの任意の番号付け方式を必要としています。 だから、これはメモリアドレス123、124であることを、ただ偶然、言うてみましょう。 ただ、これは125であると言いましょう、これは126であるなど、それは全くの自由です。 私達はちょうど私の記憶のいくつかのナンバリングスキームを必要としています。 だから今、私は実際に、xとy方向に通過したとき、私は、xとyを渡すつもりはない。 私はXの、yの、いわば、住所を渡すつもりです 何こことここに格納されることではない1と2になるように しかし、あなたはこことここで渡されるもの、私の小さなテキストを見ることができるかどうか? [聞き取れない生徒の応答] >>その通りです。 123はここに入れて取得し、124はここに置かれます。 今、私は一番上にあるここでは、この非常に最初の行のようにスターを使用したので、 私のプログラムはちょうど彼らが明らかに整数でいるにもかかわらず、その123と124を知っている どんな人間が気づくことができること、それらがアドレス、数値アドレスとして解釈されるべきである。 彼らは、彼らがしているアドレスは、intで、それ自体がありません 私は明示的にそこに星を入れているので、それはです。 だから今ここで何が起こるかを実際のコードの私の第一、第二、第三行目の? のは、画像の残りの部分を描きましょう。 tmpはちょうどそれが月曜日にあったようなものです。 tmpに何も特別なことはありません。 それはちょうどローカル32ビットの変数であり、その内部に、私は明らかに*の値を格納しています。 さて、私が今言っている場合TMP = A、私はここに何を入れるでしょう? >> [学生] 123。 123。しかし、それは私がやっているものではありません。 私はtmpを言っている= * A。スターはそこに行くことを意味します。 そこでここでは、123です。どうやってそこに行くのですか?矢印があるようなふりをする。 まあ、それは、1がある。どうやら、tmpに何が格納される?わずか1。 だから、他の言葉で、tmpは、現在のアドレスに行く* A、*手段であり、 これは明らかに123です。 さて、ここで我々は123の場所にあり、私は、番号1を参照 ので、私はそこに数字の1を入れてするつもりです。 今私は2行目に何をすればよいでしょうか、* A * B =? この1つは、今何があるため、もう少し複雑ですか?それは123だ。 だから*どこにあるのでしょうか?右ここで私が前にあった。だからそこに行く。オーケー。 さて、最後に、そして最後に、これは、うまくいけば、意味を理解するために開始されます * bは、bに何を意味する? 124。だから私は2である、そこに行く必要があります。 だから私は、どこに何を入れますか? * bは*に行くので、2がここに入ります。だから私はそれをするつもりだ。 そして、あなたはすでに私たちはそんなに近づいているのだから、多分、見ることができます 初めて正しくこの愚かな、単純な問題を解決するための 今、我々はまだ、xが何であったかの記憶を持っているので、 我々は、Yの、確かに、2つのコピーを持っている しかし、3行目は* bは言う。 だからここにBはAの。 * bはそこに行くことを意味します。だから場所124はどこにあるのでしょうか? ここは明らかにだ。だから私はここに何を入れますか?明らかに、tmpです。 だから今、私はこれを行う。だから私はここに1と2をここに持っている。 そして今何がこのすべて、123、124、約1? もうすぐスワップ戻ると、このメモリは失われているようにように良いです とすぐにスワップリターン、オペレーティングシステムなどのため 将来再びそのメモリを自由に使用できます。 このいわゆるスタックの一番下にある唯一のメインのメモリが周りにこだわっています。 それで我々は最終的に今取り組んでバージョンを持っています。 私はswap.cに入り、次のことがわかりましょう。 プログラムの先頭に、私はあることが私のプロトタイプを変更したint型* aとint型* bです。 私が悪かった赤、緑から良いです、に行くように変更だけだそう、 私が今日、これらの星を追加されます。 しかし、その後、ダウンここで自分自身を交換する私はコピーしなければならなかった、ただのスライドにあったものに貼り付けます。 私は、ここにここに星を星を持っている - プロトタイプと一致する - その後これらの事のすべてでtmpを除く星を持っている 一時的な変数を使用するので、新しいものは何もありません。 私はちょうどint型のための一時的なストレージが必要です。 だから我々はそこにスターを必要としません。 我々は任意の境界のこの種を越えることができるように、私達はちょうどスターが必要 私のコンピュータのメモリ内のこれらの2つのフレーム間。 しかし、一つの最後の事は変わらなければならない、あなたはすでにそれをちらっと見たかもしれません。 他のラインは明らかに異なるとは何ですか? >> [生徒]&xになります。 ええ、そう25、私はこれが機能するために、変更する必要のあるコードの最後の行です。 一週間前にしても月曜日には25行目では、このように見えた、xとyを入れ替える あなたが言う場合ので、これがちょうど壊れていたスワップ(x、y)は あなたは、それは、そのことをやって、交換するxとyのコピーを与えている しかし、実際にはxとy自体を変えたことがないている。 だからあなたは、コード内のアンパサンド前にこの文字を見たことがない場合であっても、 単なる推測を取る。アンパサンドは、明らかに、何をしますか? [学生]アドレスを取ります。 >>は、アドレスを取ります。 だから、アンパサンドは私にxのアドレスを与えると言っている。 それがどこにあるか誰が知っているか?それが123であることを起こる。私は気にしないでください。ちょうど私にxのアドレスを与える。 &Yは私にyのアドレスを与えることを意味します。 その時点で話は、我々は少し前に描いた絵と完全に一致している。 私が最初にこれを習い始めたときにだから私は、私のために確かに、ポインタを認めるよ 間違いなく私の心の周りをラップするために、最も難しいものの一つであった。 しかし、我々は物事のこれらの種類と再生し続ける、特にとして、実現 あなたはこれらの超簡単なソートにそれを打破する場合知的に問題が面白くない ただ、周りのポインタを持つ多くの混乱への答えを数値を動かす 実際にこれらの非常に基本的な力学から導出することができる。 こちらのアドレスです。星とそこに行く。 あるいは逆に、ここでは、アンパサンドだ。アドレスが実際に何であるかを見つけ出す。 かしこまりました。 だからここで、このメモリのすべてがから来ている? 我々は数回この絵を描かれた、と私は、我々は、それに戻ってくると約束守る しかしここで、あなたのコンピュータのメモリを表現したものです ここでもう少し私たちの黒板よりもラベルが付いていることだ。 上部のテキスト·セグメントは、プログラムに関して何を表して? [聞き取れない生徒の応答] >>申し訳ありませんが?もう一度言う。 [学生]実際のプログラム。 >>実際のプログラム。 だから、0と1は、Cのコードを書いた後コンパイルした後、Clangの実行 と、0と1を生成するまでメモリにそこに隠れされてしまう あなたは二重使いのMacまたはPC上のアイコンをクリックすると、なぜなら またはディスクからあなたのプロンプトで、0と1でマリオのよう​​なコマンドを実行します。 コンピュータがそれらを操作できるようにメモリにロードされ より迅速にそれらを実行する。 だから、初期化されたデータと初期化されていないデータは、我々は、それらについて多くを話すことはありません しかし、それらは単なるグローバル変数です。 初期化では、値を与えたグローバル変数を意味する; 初期化されていないあなたはまだに値を与えていないことをグローバル変数を意味します。 その後、私は完全に私の手を振るよ、これらの環境変数はあり しかし、彼らはそこにあり、そのユーザー名のような店の事 低レベル詳細や他の種類。 しかし、あなたのメモリのレイアウトのジューシーな部分は、スタックとヒープと呼ばれるこの事である。 スタックは、再び、明確にするために、関数が呼び出されるたびに使われているメモリであり、 ローカル変数があるときは必ず とするたびに周りに渡されるパラメータがあります。 スタック内で起こるすべてのこと。 ヒープは、私たちは話をしますが、ヒープを使用し推測を取るていない。 メモリのちょうど別のチャンク。 それが一番上にここで描かれるようなことが起こるが、それは任意の絵大会だ。 誰がどうやら週間のヒープからメモリを使っている? それは間接的に、技術的にだが。 >> [生徒] GetStringメソッド。 GetStringメソッドとmalloc関数。だからここに根本的な違いです。 あなたがメモリを必要とするならば、単に変数を宣言することを過去数週間のために知っている。 あなたは多くのメモリを必要とする場合は、右の内側関数の配列を宣言します。 あなたが関数のローカル内で変数を宣言した場合しかし、我々が直面して守ってきた問題があり、 とすぐに関数が戻ったとして、何がメモリと、それらの変数はどうなるのでしょうか? ちょうど、もはやマーケットが来ないの並べ替え?それは単に概念的のようなものを表示されなくなります。 それは明らかに、物理的にそこにまだあるが、それは、もはや使用する権利はない。 あなたは生活の中で関数を記述したい場合、これは明らかに問題がある 実際にメモリを割り当てて、それをすぐにお返しをしないこと。 ポイントのケース:生活の中でGetStringメソッドの目的は、事前に見当がつかないことである どのように私はキーボードでタイプするつもりの文字列の大きな、 それはデヴィッドまたはhelloを保持するためのメモリを割り当てることができるように持っている ユーザがログイン入力した可能性があることや全体エッセイ だからGetStringメソッドは、mallocを使用してきました。 mallocは高くないスタックを使用する必要があります。 代わりに、それはヒープと呼ばれるこの事を使っている。 メモリについてのさまざまなことは何もありません。それは速くなったり遅くなったり、またはそのような何もありません。 それは別の場所に物理的にだけだ。 しかし、ルールはそのヒープに割り当てられているメモリ 呼び出すまであなたから取り去られることはありません - 推測を取る - 無料。 これとは対照的に、任意のメモリがあなただけの配列を宣言することによってスタック上を求める あるいは、我々は数週間のために行ってきたように変数を宣言する、 つまり、デフォルトではスタックに終わる。 そして、それは時間の偉大な90%に動作しますが、それらのまれな場面で あなたは、メモリを割り当てて、それを周りに残しておきたい場所 次にあなたは、mallocのような関数を使用する必要があります。 あるいは、我々は、順番に、mallocを使用してGetStringを、次のような関数を使用してきました。 これは分解してからBINKYでかいま見を取る可能性のある場所を見てみましょう。 将来的にはそれに戻ってくる。 ここでは、最初の2行で何をしている超簡単なプログラムは何ですか? 英語では、コードのこれらの最初の2行は、メインの内側に何をすればいいですか? [聞き取れない生徒の応答] 注意してください。それは私にxまたはyのアドレスを与えるものではありません。 [学生] int型へのポインタを与えます。グッド。>>整数に私に2ポインタを与える。 言い換えれば、私が今日図面を保存しておくことをメモリの2チャンクを与える にもかかわらず、私は正方形として、今、それを消した。 - 私のメモリを2チャンク、xという1、yと呼ばれるものを与える 以前の私はそれらのsとtと呼ばれる - とメモリのチャンクの種類は何ですか? これは、アドレスを格納するために起こっている。 これは、int *型の一つだ。 だからintのアドレスは、最終的には、xに住むようになる intのアドレスは、最終的には、yに住むようになる しかし当初は、xとyの内側は何ですか?誰が知っているか?ゴミの値。 これは、ポインタとは何の関係もない。 我々はそこに実際にあるものを知っているそこに何かを入れていない場合はどうなりますか? 今は、x。ここで何が起こりますか? xがポインタであるので、これは今では合法です。それはint *です。 だから私は、xにメモリの一部チャンクのアドレスを置くことができることを意味します。 malloc関数は何を返すのでしょうか?パーフェクト、それは、アドレスを返す メモリの全体のチャンク内の最初のバイトのアドレス。 これは明らかにアプライアンスでは、例えば、どのように多くのバイトを割り当てていますか? intのサイズは何ですか? 4。 あなたが週1に戻って考えるなら、それは、常にそれを覚えておくことが重要スーパーではありません しかしこのケースでは、4バイトを知っておくと便利です。 だから、これはヒープの4バイトに割り当てている そして、それは任意に、私には最初のもののアドレスを返している。 さて、xが何をやっている? * X = 42は何をやっている? 我々はいくつかのゴミ値で次のようになります。xを、持っている物語で、この時点で場合 これは現在、3行目で、私は4バイトを割り当てられましたが、今ではいくつかのゴミ値とyです。 この絵は、本質的にこ​​のように見えます。 これは任意のアドレス123である場合、またはより具体的には、これは私たちの話は今のように見えるものです。 * X = 42は今何を意味する?それはアドレス123に移動して、そこ番号42を置いたことを意味します。 我々は文字列をやっていないので、私はこれらの線を描画する必要はありません。 私はちょうどこのような、ただのデモのためにそれを書かれているはずですが、 int型の種類として42は、4バイトを多くのスペースを占有します。 だから、それはそこに起こったことが、問題は今そこだ。 * Y = 13。ここで何が起こるだろう? 問題は、私たちの世界では簡略化* yはちょうどyのアドレスに行くことを意味しています。 yには何ですか?それはいくつかのゴミ値だ。 だからゴミの値が、そのような狂気何か5551212であると仮定してみましょう。 * yは5551212に対処するために行くことを意味します。 それはこっちのようなものだ。その中には、たとえば、存在しません。 だから* yは私がここで13を描画しようとしている13の手段を取得します。それは存在しません。 私は黒板のセグメントを超えました。私は何を手に入れたのか? 私はメモリに入れしようとしているので、その謎めいたメッセージセグメンテーションフォールト 存在しない場所で、13のような値です。 そうでない、その時点までのプログラムの残りの部分は大丈夫ですが、アップに働くかもしれない。 それでは、この話をしてみましょう。 我々は六角の話したら、我々はそれに戻ってくる。 、のはこれに戻ってBINKYと呼ばれるこの事で締めくくりましょう そのリコールは、クレイと一緒に遊んで自宅で座ってスタンフォード大学の教授である まさにその同じプログラムの話をします。 それはちょうど約3分の長さです。ここでは、BINKY持っています。 [ビデオの男性話]ちょっとBINKY、目を覚ます。これは、ポインタの楽しみのための時間です。 [BINKY]それは何ですか?ポインタについて学ぶのか?ああ、すごーい! [男性話]さて、始めるために、私たちはカップルのポインタが必要になるだろうと思います。 [BINKY]オーケー。このコードは、整数を指すことができます2ポインタを割り当てます。 [男性話]さて。まあ、私は2ポインタを参照してください、しかし、彼らは何を指していないように見えます。 [BINKY]そうですね。最初は、ポインタが何を指していない。 それらが指すものは指示先と呼ばれ、それらの設定は別個のステップですされています。 [男性話]ああ、右、右。私はそれを知っていた。指示先が別になります。 erが、それでは、どのように指示先を割り当てるには? [BINKY]オーケー。このコードは、新しい整数指示先を割り当て、この部分は、xがそれを指すように設定します。 [男性話]ねえ、それが良く見えます。 だから、何かを作る。 >> [BINKY]オーケー。 私は間接参照ポインタxがその指示に番号42を格納するよ。 このトリックのために私はデリファレンスの私の魔法の杖が必要になるでしょう。 [男性話]間接参照のあなたの魔法の杖?それは素晴らしいことだ。 [BINKY]これは、コードがどのようなものです。私はただの数字を設定してよ... [ポッピング音] 見て[男性話]ちょっと、そこに行く。 だからx上の間接参照を行うと、矢印がその指示にアクセスするために、次の この場合には、そこに42を格納する。 ねえ、他のポインタ、yを通じて番号13を格納するためにそれを使用してみてください。 [BINKY]オーケー。私はちょうどyにこっちに行くと13番が設定され得るでしょう その後ちょうど逆参照との杖を取る... [賑やかな音]おっと! [男性話]やあああ、うまくいきませんでした。 BINKY、言う、私はyを間接参照するのは良いアイデアだとは思わない 指示先を設定することは別個のステップですので、 と私は、私たちが今までそれをやったとは思わない。 [BINKY]うーん、良い点。 [男性話]うん。我々は、ポインタyを割り当てられているが、我々は指示先を指すように設定することはありません。 [BINKY]うーん、非常に注意深い。 [男性話]ねえ、あなたは、そこにBINKYの良い探している。 あなたは、xと同じ指示先にyが点になるようにそれを解決することができますか? >> [BINKY]確かに。 私はポインタ代入の私の魔法の杖を使用します。 [男性話]前のような問題になることですか? [BINKY]いいえ、これは指示先に触れていない。 それはちょうど別のと同じものを指すように、一つのポインタを変更します。 [ポッピング音] [男性話]ああ、なるほど。 xと同じ場所になりましたy点。 だから、待ってください。今すぐYは固定されています。それは指示先を持っています。 だからあなたは13歳以上を送信するために再び逆参照の杖を試してみることができます。 [BINKY]ええと、大丈夫。ここに行く。 [ポッピング音] [男性話]ねえ、それを見てみましょう。今すぐyの作品を間接参照。 ポインタはその1指示先を共有しているため、彼らは両方とも13を参照してください。 [BINKY]うん、共有。ものは何でも。 だから我々は今の場所を切り替えるつもりですか? [男性話]ルックああ、私たちは時間がなくなってしまい。 >> [BINKY]しかし - [男性話] 3ポインタのルールをただ覚えている。 番号1は、基本的な構造は、ポインタを持っていることであり、それは指示先にポイント以上。 しかし、ポインタと指示先は独立しており、一般的なエラーは、ポインタを設定することです しかし、それを指示先を与えることを忘れている。 番号2は、ポインタの間接参照は、ポインタから始まり、上で矢印を次 その指示にアクセスすることができます。 我々はすべて知っているように、ポインタの指示がある場合にのみ動作しますが、 どの種類の番号1を支配するために戻って取得します。 番号3は、ポインタ代入は1ポインタを受け取り、それを変更します 別のポインタと同じ指示先を指すように設定します。 だから代入した後、2のポインタが同じ指示先を指すようになります。 時にはそれは、共有と呼ばれています。 そして、それは本当にこれだけです。今バイバイ。 これはBINKYです。これはCS50です。我々は、来週お会いしましょう​​。 [拍手] [CS50.TV]