1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
DAVID Malan: Hola, e benvida de volta ao CS50. Polo tanto, este é o fin de semana catro. Só un anuncio en primeiro lugar. Así, o chamado quinto segunda sexa chegando este próximo luns. Esta é a oportunidade para cambiar de SAT / unsat a unha carta grao, ou de carta grao SAT / unsat. Importunamente, este proceso esixe unha sinatura, porque ten que cubrir fóra destes add / drop formas-de-rosa. 

Porque técnicamente, o SAT / unsat ea versión clase da letra teñen números de catálogo distintas. Pero non é gran cousa. Só ten que chegar ata min ou a Rob ou Lauren en calquera momento. Ou correo electrónico, se non ten o tipo de papel que precisa hoxe, e nós non se esqueza de axudar a tomar coidado de que antes de luns. 

Todo ben, entón hoxe en día - De feito, hai un pouco de eco. Podemos ton me un pouco para abaixo? Aceptar. Entón, hoxe, nós introducimos un tema coñecido como punteiros. E eu admito que este é un dos temas máis complexos que adoitan cubrir nesta clase, ou realmente calquera curso introdutorio que emprega C. 

Pero teña miña palabra para ela, sobre Se a súa mente se sente un pouco máis curvada hoxe e nas próximas semanas. Non é representativo de queda peor neste iso significa só que é un tema particularmente sofisticado que eu prometer, algunhas semanas Por iso, vai parecer moi impresionante simple en retrospectiva. 

Aínda me lembro até hoxe. Eu estaba sentado no Elliott Dining Hall, sentado á beira do meu TF Nishat Mehta, que era un residente de Elliott casa. E por algunha razón, este tema só click. O que quere dicir que eu tamén loitaba con el por moito tempo, pero eu farei o meu mellor para axudar a evitar calquera loita con un tema que, por fin, é moi poderoso. 

De feito, un dos temas que discutir nas próximas semanas é que de seguridade, e como realmente pode explotar máquinas de formas que non se destina. E esas explotacións son tipicamente o resultado de erros, erros que as persoas fan por non comprender algunhas da implantación subxacente detalles a través do cal os programas son feitos. 

Agora, para facelo parecer máis user agradable, eu penso en xogar a 10 segunda previa dunha pequena claymation figura chamado Binky que foi traído para vida por un amigo noso en Stanford, Profesor Nick parlante. Entón, permítame darlle este teaser do Binky aquí. 

[REPRODUCIÓN] 

-Ei, Binky. Espertar. É tempo para divertirse punteiro. 

-Que é iso? Máis información sobre punteiros? Oh, goodie. 

[FIN reprodución de vídeo] 

DAVID Malan: Isto é Stanford ciencia da computación. Entón, máis sobre iso máis para vir. 

[Aplausos] 

DAVID Malan: Sentímolo, Nick. 

Entón, lembro a última vez que rematou en este suspense realmente emocionante polo cal esta función simplemente non funciona. Polo menos intuitivamente, sentín como debe funcionar. Só ten que cambiar os valores de dous enteiros. Pero lembre que cando impreso a valores orixinais no inicio, un e dous, eles aínda eran unha ea dous e dous e non un. 

Entón deixe-me realmente cambiar ao dispositivo. E escribín algo de código esquelético en avanzar aquí, onde eu afirmo que x será de 1, y será 2. Eu, entón, imprimir tanto da súa valores con f impresión. 

Eu, entón, afirmar aquí que imos trocalos. Deixei un espazo baleiro aquí para nós encher hoxe en só un momento. Entón, eu vou afirmar que a dúas variables foron trocados. Entón eu vou para imprimir los de novo. E así espera, debería ver 1, 2. 2, 1. Ese é o super sinxelo obxectivo agora. 

Entón, como é que imos cambiar dúas variables? Ben, se eu propoño aquí que estes vasos pode representar en memoria dun ordenador. Esta é algunhas mordidas, este é máis algunhas mordidas. Poderiamos ter un voluntario veña para arriba e mesturar connosco algunhas bebidas, se familiar? Imos para arriba. Cal é o seu nome? 

Jess: Jess. 

DAVID Malan: Jess? Veña, Jess. Se non lle importa, temos que poñer o Google Vidro en ti para que poidamos inmortalizar este. OK, vidro. Gravar un vídeo. E Aceptar, somos bos para ir con Jess aquí. Todo ben. Pracer en coñece lo. 

Entón o que me gustaría facer aquí - se puidese, moi rapidamente - só nós derrama metade dun vaso de laranxa zume e medio vaso de leite, representar efectivamente os números 1 nun vaso e dous no outro vaso. 

Isto vai ser bo filmación. 

Jess: Sentímolo. 

DAVID Malan: Non, non. É Aceptar. Niza. Todo ben, entón temos catro bytes pena de zume de laranxa. Imos chamou o valor 1. Agora, catro bytes por valor de leite. Vai chamalo de valor 2. Así, X e Y, respectivamente. 

Todo ben, agora a tarefa á man - para ti, Jess, diante de todos dos seus compañeiros - é cambiar os valores de x e y tales que queremos que o zume de laranxa no outro vaso e do leite neste vaso, como quizais ti - antes de que realmente fai el - vai facer sobre iso? 

OK, sabia decisión. Entón tes que de un pouco máis de memoria. Entón, imos reservar un temporal vaso, se quere. E agora proceder a cambiar xe y. 

Excelente. Entón, moi ben feito. Moitas grazas, Jess. Aquí está. Unha pequena lembranza. 

OK, entón, obviamente, super sinxelo idea. Totalmente intuitiva que necesitamos algo máis espazo de almacenamento - deste xeito, un vaso - se realmente queren intercambiar estas dúas variables. Entón, imos facer exactamente isto. Ata aquí no medio onde eu afirmo que eu son vai facer algún troco, eu vou dalle declarar temporal. E eu vou define-lo igual a, digamos, x. 

Entón eu vou para modificar o valor de x só como Jess fixo aquí co leite e zume de laranxa ser igual a y. E eu vou cambiar y ser igual non x, porque agora estariamos preso nun círculo, senón temporais. Onde temporalmente - ou onde Jess temporalmente poñer o zume de laranxa ante sobrepasar que cunca co leite. 

Entón deixe-me ir adiante agora e facelo. Chámase noswap.c. E agora déixeme correr sen intercambio. E, de feito vexo, se eu ampliar a fiestra un pouco, que x é 1, y é 2. E entón x é 2, y é 1. 

Pero lembre que o luns fixemos cousas un pouco diferente en que eu en vez aplicada unha función auxiliar, se, que era, en realidade baleiro. Liguei para el cambiar. Eu dei-lle dous parámetros, e eu chamei Lles un e liguei para eles b. 

Francamente, eu podería chamalos de xe y. Non hai nada que impida me de facelo. Pero eu diría que é, a continuación, algo ambigua. Porque recordo para o luns que nos argumentou que estes parámetros foron copias dos valores pasados ​​dentro Polo que só move co seu mente, eu creo que, se usa exactamente as mesmas variables. 

Entón, eu vou chamalos dunha vez eb, só por razóns de claridade. Pero poderíamos chamalos máis calquera cousa que queiramos. E eu vou copiar e pegar eficazmente este código alí de arriba baixo en aquí. Porque eu só vin que funciona. Entón, iso é en moi boa forma. E eu vou cambiar o meu x para un, o meu x a un, a miña y ab e meu y ab. 

Polo tanto, noutras palabras, exactamente a mesma lóxica. O mesmo que Jess fixo. E entón o único que teño que facer-se aquí, por suposto, está agora invocar esta función, ou ligue para esa función. Entón eu vou chamar esa función con dous insumos, x e y, e bateu en Gardar. 

Todo ben, entón fundamentalmente o mesmo. En realidade, eu probablemente xa fixo o programa innecesariamente complexa por escribir unha función que só está tomando preto de seis liñas de código, mentres eu anteriormente había aplicado isto en só tres. 

Entón deixe-me ir adiante agora e refacer tanto, non fan intercambio. Todo ben, eu estraguei todo aquí. Este debe ser un erro que se pode ver cada vez máis comunmente como a súa programas se fan máis complexas. Pero hai unha reparación doado. Déixeme rolar para atrás ata aquí. 

E o que é o primeiro erro que eu estou a ver? Declaración implícita. O que significa que normalmente indican? Oh, eu esquezo o prototipo. Esquecín de ensinar o compilador que cambio vai existir, aínda que non existe en principio do programa. Entón, eu só vou dicir nula, intercambio, int, un int b, punto e coma. 

Entón, eu non estou indo a reimplementar lo. Pero agora coincide co que está aquí debaixo. E noten, a ausencia de un punto e coma aquí, o que non é necesario cando de execución. 

Entón deixe-me refacer esta, non fan intercambio. Moito mellor forma. Realizar sen intercambio. E dane-se. Agora estamos de volta onde estabamos o luns, onde a cousa non cambiar. 

E cal é a explicación intuitiva por que ese é o caso? Si? 

Estudante: [inaudível]. 

DAVID Malan: Exactamente. Así, a e b son copias de xe y. E, de feito, en calquera momento que estivo chamar a unha función, de momento, que pasa variables como ints - só como intercambio está esperando aquí - Vostedes foron pasando copias. 

Agora, iso significa que ten un pouco de tempo, unha fracción de segundo, a ordenador para copiar os bits dun variable para os bits de outro. Pero iso non é un negocio tan grande. Pero son, con todo unha copia. 

E agora, no contexto de intercambio, Eu son de feito correctamente cambiando a e b. De feito, imos facer un rápido proba de sanidade. Imprimir un f é% i, a nova liña. E ficha imos nun. Agora imos facer o mesmo con b. E imos facer o mesmo aquí. 

E agora, déixeme copiar as mesmas liñas de novo na parte inferior da función despois dos meus tres liñas de interesante podería executado, e imprimir a eb novo. Entón agora imos facelo, non fan intercambio. Deixe-me facer a xanela da terminal dun pouco máis alto, para que poidamos ver máis dunha vez. 

E realizar ningún intercambio. x é 1, y é 2. a é 1, b é 2. E, a continuación, o é 2, b é 1. Entón, el está a traballar, así como Jess fixen aquí dentro de intercambio. Pero, por suposto, está tendo ningún efecto sobre as variables de inicio. 

Entón vimos un truco polo cal podería solucionar isto, non? Cando se depara con este ámbito problema, podería só punto e facer x e y que tipo de variables en canto? 

Podería tornalos global. Pon-os na parte superior do arquivo como fixemos, mentres que no xogo da 15. Usamos unha variable global. Pero no contexto dun partido 15, é razoable ter un mundial variable que representa o consello, porque a totalidade de todos é 15.c sobre a aplicación deste xogo. Iso é o que existe no arquivo para facer. 

Pero, neste caso aquí, eu son chamando un intercambio de función. Quero cambiar dúas variables. E iso debe comezar a sentir só desleixado a solución para todos os nosos problemas cando son executados no ámbito cuestións é facelo global. Debido moi rapidamente noso programa é vai facer unha gran desorde. E nós fixemos iso con moita moderación como resultado, en 15.c. 

Pero resulta que hai unha mellor forma completamente. Permítanme, en realidade, voltar e eliminar a imprimir de f, só para simplificar o código. E déixeme propoñer que este, de feito, é malo. Pero se eu, no canto de engadir algúns asteriscos e as estrelas, podo transformar isto en vez función en que se realmente operativo. 

Entón déixeme volver aquí e recoñecer dicindo asteriscos sempre é difícil, entón eu vou dicir estrelas. Vou confesar para iso. Todo ben. E agora, o que eu vou facer no seu canto? 

Entón, primeiro de todo, eu vou especificar que no canto de pasar un int en a función de intercambio, estou xa de vai dicir int estrela. Agora, o que a estrela indica? Esta é a idea de que un punteiro que Binky, o personaxe claymation, foi referíndose a un momento atrás. 

Entón, se nós dicimos int estrela, o significado isto agora é que unha non será pasado polo seu valor. El non vai ser copiado dentro Pola contra, a dirección é un será pasado dentro 

Entón, lembro que no seu ordenador é un monte de memoria, se non, coñecido como RAM. E que a RAM é só unha grupo enteiro de bytes. Polo tanto, se o seu Mac ou PC ten dous gigabytes, ten 2 mil millóns de bytes de memoria. 

Agora imos supor que só a manter as cousas agradables e ordenada, que asignar unha dirección - un número - para cada byte de memoria RAM no seu computador. O primeiro byte das dúas millóns é polo número cero. O seguinte é un número de un byte, o número dous, todo o camiño cara arriba, dot dot punto, para preto de 2 millóns de dólares. 

Así, pode número de bytes de memoria no seu computador. Entón imos supor que isto é o que queremos dicir con un enderezo. Entón, cando vexo unha estrela int, o que está a suceder para ser pasado en cambio agora é o enderezo dun. Non o seu valor, pero sexa cal sexa a súa voz enderezo é, por así dicir - a súa localización na memoria RAM. 

E do mesmo xeito para b, vou para dicir o mesmo. Int, estrela, b. Como un aparte, tecnicamente a estrela podería ir en outros lugares. Pero imos estandarizar a estrela estar xunto ao tipo de datos. 

Entón cambiar sinatura significa que agora, dáme a dirección de un int, e chamada que un enderezo. E darme outro enderezo dun int e chamar este enderezo b. 

Pero agora o meu código aquí ten que cambiar. Porque se eu declarar int temperatura - que aínda é do tipo int - pero gardar nel un, que tipo de valor? Para ser claro, eu estou poñendo un con o código como está escrito agora? 

Estou poñendo o lugar nun. Pero eu non me importa o situación agora, non? Temp existe só terceira cunca de Jess existir, para que finalidade? Para almacenar un valor. Leite ou zume de laranxa. Non, en realidade, almacenar o enderezo de ningunha destas cousas, que se sente un algo sen sentido neste certo contexto do mundo de calquera maneira. 

Entón, realmente, o que quero poñer en temperatura non é a dirección dun, pero a contido dun. Entón, se a é un número como 123, este é o byte 123 de memoria que un só pasa a ser ocupante, que o valor de en que se produza ser ocupante. 

Se quero ir a este enderezo, Eu teño que dicir unha estrela. Do mesmo xeito, se eu fose para cambiar o que é na páxina un, eu mudo isto para iniciar unha. Se eu queira gardar en que está no localización dun co que está no lugar en b, estrela b estrela. 

Así, en breve, aínda que iso non é moi afundindo aínda - e eu non esperaría que sería tan rápido - entender que todo o que eu estou facendo é prefixar estas estrelas para os meus variables, dicindo que non incorporarse os valores. Non cambiar os valores. Pero, si, ir a eses enderezos e obter o valor. Ir a este enderezo e cambio o valor aí. 

Entón, agora déixeme rolar para atrás ata o cumio, só para corrixir esta liña aquí, a cambiar o prototipo para corresponden. Pero agora eu teño que facer unha cousa. Intuitivamente, se eu mudei tipo intercambio de argumentos que está esperando, o que máis me teño cambiar o meu código? 

Cando eu chamo de intercambio. Por agora, o que máis me Eu pasando a cambiar aínda? O valor de x e o valor de y, ou leite e zume de laranxa. Pero eu non quero facelo. Eu no canto quere pasar en que? A localización de xe o lugar de y. Cales son os seus enderezos postais, por así dicir. 

Entón, para facelo, hai un e comercial. Ampersand tipo de sons como o enderezo. así n, comercial, a dirección de x, e o enderezo de Y. Por iso é deliberado que usan ampersands ao chamar a función, e as estrelas cando declarar e cando execución da función. 

E só de pensar e comercial como o dirección do operador, e unha estrela como o ir alí operador - ou, máis correctamente, o Operador de referencia. Entón, iso é unha chea de palabras só para dicir que agora, por sorte, cambio vai sendo correctas. 

Déixeme ir adiante e facer - imos realmente cambiar o nome do ficheiro, para que non este programa aínda ser chamado sen intercambio. Eu afirmo que imos chamalo swap.c agora. Entón faga, cambie. Dot, Slash, cambie. 

E agora feito, x é 1, y é 2. E entón, x é 2, y é un. Ben, imos ver se non podemos facelo un pouco diferente, como o que se pasando aquí. En primeiro lugar, deixe-me achegar na nosa pantalla de deseño aquí. E déixeme propoñer por un momento - e cada vez que chamar aquí será espello alí enriba agora - déixeme propoñer que aquí está unha morea de memoria, ou RAM, dentro do meu ordenador. 

E este será o número mordida, digamos, un. Este será o número 2 bytes. E eu vou facer unha chea de outras, e logo, un grupo de Dot Dot puntos para indican que hai 2 millóns destas cousas. 4, 5 e así por diante. 

Polo tanto, hai os cinco primeiros bytes de memoria do meu ordenador. Todo ben? Moi poucos de 2 millóns de dólares. Pero agora eu vou propoñer a continuación. Vou propoñer que x vai almacenar o número 1, e y vai para almacenar o número 2. E déixeme ir adiante agora e representa estes valores como segue. 

Imos facelo do seguinte xeito. Déame só un segundo. Un segundo. Aceptar. Quero facelo un pouco - imos facelo de novo. Se non, eu vou e usando o mesmos números, sen querer, varias veces. 

Entón, só por iso temos números diferentes para falar, imos chamar iso de byte número 123, 124, 125, 126, e dot dot dot. E déixeme afirmar agora que vou poñer o valor 1 aquí, e o valor de 2 aquí, tamén coñecido como xe y. Entón, resulta que este é x, é dicir y. 

E só por algún azar, o ordenador, o sistema operativo, pasou a poñer x no lugar número 123. E y acabou no lugar 124 - caramba. Eu debería ter corrixido iso. Oh home, que eu realmente quero facer iso? Si, quero corrixir isto e b adecuada sobre iso hoxe. Sentímolo, novo nisto. 

127, 131, e eu non quero ser esa complexo, pero por que eu cambiar o números alí? Porque quero que os ints para en realidade, ser de catro bytes. Entón, imos ser super anal sobre iso. Así, se un pasa a ser dirixido 123, o 2 será no enderezo 127, porque iso é só 4 despedidas distancia. Isto é todo. E imos esquecer todo o outros enderezos do mundo. 

Así x está na posición 123, Y está na posición 127. E agora, o que realmente quere facer? Cando eu chamo de intercambio agora, o que é realmente está a suceder? Ben, cando eu chamo de intercambio, eu estou pasando en o enderezo de X e o enderezo de Y. Así, por exemplo, se estas dúas pezas de papel representan agora os dous argumentos a eb para intercambiar, o que eu son indo a escribir na primeira delas, que eu vou chamar ao refiren como un? 

Exactamente, 123. Entón, iso eu afirmo é un. Este é un parámetro. Estou poñendo a dirección de x alí. 

¿Que é iso? 

¿Que é iso? 

Non, non. Iso é OK. Menos mal, menos mal. Polo tanto, este é un. E agora o segundo anaco de papel, este será b, e que son eu será escrita en este anaco de papel? 127. 

Entón o único que cambiou desde noso entendemento anterior desta historia é, ao contrario de, literalmente, un e dous, eu son vai pasar en 123 e 127. E eu estou indo agora para poñer-los dentro desta caixa, non? Así que a caixa negra representa agora a función de intercambio. 

Mentres tanto, imos agora ter alguén aplicar a función de intercambio. Será que alguén aquí quere ser voluntario? Imos para arriba. Cal é o seu nome? Charlie. Todo ben, Charlie. Imos para arriba. 

Entón, Charlie vai xogar o papel da nosa caixa negra. E Charlie, o que me gustaría que faga agora é aplicar intercambio de tal xeito que, dado os dous enderezos, estaba indo realmente para cambiar os valores. E eu vou sussurra no seu oído como realizar a TV aquí. 

Entón vai adiante, e é a caixa negra. Chegar alí. Que valores ve un, e os valores que aparecen para b? 

Nash: o é 123 eb é 127. 

DAVID Malan: OK, exactamente. Agora, hai unha pausa por un momento. O primeiro que vai facer agora, segundo o código - que Agora eu vou puxar arriba na pantalla - será para reservar un pouco bits de memoria chamado Temp. Entón, eu estou indo a ir adiante e darlle a memoria. 

Entón, iso vai ser unha terceira variable que ten acceso a ten chamado Temp. E o que vai escribir o anaco de papel temporal? 

Charlie: Punteiros, non? 

DAVID Malan: OK, así, non necesariamente punteiros. Así, a liña de código que eu teño destaque no lado dereito, imos comezar por aí. Di que unha estrela. Así, unha está almacenando o número 123. E, así, intuitivamente, o que que estrela 123 significa? 

Pero especialmente, se é un 123, unha estrela significa o que? O valor dun. Ou, máis casual, vaia alí. Entón deixe-me propor que, sostendo a unha en súa man, vai adiante e tratar este coma se fose un mapa. E camiñar-se para o ordenador do memoria, e atopar-nos o que é na posición 123. Exactamente. 

Así, podemos ver na posición 123 é o que, obviamente,? OK, entón o valor agora é vostede vai poñer en temperatura? Exactamente. Entón vai adiante e facelo. E escriba o número 1 no anaco de papel que está actualmente titulada temporal. 

E agora o seguinte paso que está indo a aplicar será o que. Pois ben, no lado dereito da seguinte liña de código é a estrela b. b, de Por suposto, almacena un enderezo. Que aborda 127. Estrela b significa que, casualmente falando? 

Ir a este local. Entón vai adiante e atopar-nos o que é na posición 127. Aceptar. Claro que, na posición 127, aínda é o valor 2. Entón, o que está indo agora en tenda o que está no lugar nun? Entón, estrela contorna ir ao lugar a. Cal é a localización de un? 

Exactamente. Entón, agora, se quere cambiar o que está nese lugar - Eu vou adiante e executar a goma está aquí. E agora poñelas de novo na cepillo. Cal é o número que vai escribir no cadro en branco agora? 

Exactamente. Polo tanto, esta liña de código, para ser claro - imos me deter o que Charlie está facendo e destacar aquí, que acaba de facer é escribir para a caixa no lugar 123 O valor que se anteriormente en b. E así temos agora aplicada de traxe Nesta segunda liña de código. 

Agora, por desgraza, non hai aínda unha liña restante. Agora o que está en temp literalmente? É evidente que é o número un. Isto non é un enderezo. É só un número, unha especie de unha variable a partir dunha semana. 

E agora, cando di estrela b, o que significa ir ao enderezo de b, que é de curso aquí. Entón, cando chegar alí - Eu vou adiante e eliminar o que é realmente alí - e que é vostede vai escribir agora en 127 localización? 

Charlie: Temp, que é un. 

DAVID Malan: Temp, que é un. E o que pasa a temperatura ao final? Ben, nós realmente non sabemos. Nós realmente non me importa. Cada vez que nós Implementar unha función ata o momento, as variables locais ten son, de feito local. E eles simplemente desaparecen. Están recuperados pola operación sistema eventualmente. 

Así, o feito de que aínda ten a temperatura valor 1 é unha especie de fundamentalmente desinteressante para nós. Todo ben, entón unha salva de palmas se puidésemos a Charlie. Moi ben feito. 

Todo ben, entón o que máis fai Isto significa que podemos facer? Así, verifícase que fomos contando algunhas mentirinhas por algún tempo. De feito, parece que a corda, todo este tempo, non é realmente un secuencia de caracteres por si só. É o tipo de é que intuitivamente. 

Pero, técnicamente falando, a cadea é unha tipo de datos que declarada dentro a biblioteca CS50 para simplificar o mundo para as primeiras semanas de clase. O que unha cadea é realmente é o enderezo dun personaxe en algún lugar na RAM. A corda é realmente un número, como 123 ou 127, que pasa a demarcar onde unha cadea comeza en a memoria do seu ordenador. 

Pero isto non supón a cadea, por si só, en si. E podemos ver iso do seguinte xeito. Déixeme ir adiante e abrir un código que está entre exemplos de código fonte de hoxe. E eu estou indo a ir adiante e abrir ata, digamos, compárese 0.C. Este é un programa buggy que vai para ser aplicada como segue. 

First. Eu vou dicir unha cousa. Entón, eu estou indo a ir adiante e obter unha cadea do usuario nesa liña seguinte. Entón eu vou dicilo de novo. Entón eu vou ter outra corda do usuario. 

E noten, eu estou mostrando un dos cordas nunha variable chamada s, e outra desas cordas nunha variable chamada t. E agora vou reclamar, moi razoablemente, que se s é igual é igual a t, as cordas son as mesmas. Escribe o mesmo. En caso contrario, as cordas son non é o mesmo. 

Despois de todo, a entrada de dous enteiros, dous caracteres, dúas carrozas, dous dobres, todos de tipo de datos que falamos ata agora para comparalos-los - lembro que fixemos moi claro hai un tempo atrás que non facelo, porque a único signo de igualdade é, por suposto, o operador de asignación. Entón, iso sería un erro. 

Usamos o signo igual xeito, que de feito se compara cousas para unha verdadeira igualdade. Pero eu afirmo que é buggy. Se eu ir adiante e facer comparar cero, e entón non dot barra comparar cero. E eu escribir, imos dicir, Olá E entón, imos dicir Hola de novo. Literalmente o mesmo, o ordenador reclamacións que eu escriba cousas distintas. 

Agora, quizais eu só ingresaran mal algo. Vou escribir o meu nome neste momento. Quero dicir, Olá Olá É diferente a cada momento. 

Ben, por que isto? O que realmente está a suceder debaixo do capo? Ben, o que realmente está a suceder debaixo a portada é a cadea, a continuación, Eu escriba en que por primeira vez, por exemplo, é a palabra Ola, claro. Pero se representar esta debaixo o capó, lembre que unha cadea é nunha matriz. E nós dixemos, tanto no pasado. 

Entón, se eu tomar esa matriz como este, eu son vai representar algo moi similar ao que fixemos hai pouco. E hai realmente algo especial tamén. O que fixemos foi determinar a Ao final de cada corda? Si, esta barra invertida cero, o que é só a forma de representación, literalmente, 00000000. Oito bits 0 nunha fileira. 

Non sei, a verdade, o que é despois diso. Isto é só unha banda de máis memoria RAM dentro do meu ordenador. Pero esta é unha matriz. Nós falamos sobre matrices antes. E nós tipicamente falar matrices como localización cero, a continuación, un, despois dous. Pero isto é só por conveniencia. E iso é totalmente relativo. 

Cando está realmente quedando memoria o ordenador, é, por suposto, calquera 2 millóns de algúns bytes impares, potencialmente. Entón, realmente debaixo do capó, todo este tempo, si. Isto pode moi ben ser o soporte cero. Pero se cavar aínda máis fondo baixo o capó, que é realmente abordar número 123. Este é o enderezo 124. Este é o enderezo 125. 

E eu non quería romper ese momento. Estes son agora unha bytes separados por que razón? Que grande é un char? Un char é só un byte. Un int é tipicamente catro bytes. É por iso que eu fixen 123, 127, 131 e así por diante. Agora podo manter a matemática sinxela e só facer máis 1. E agora é o que está realmente a suceder por baixo do capó. 

Entón, cando declarar algo como iso, cadea s, que é, en realidade - pasa - estrela Char. Star, claro, significa enderezo, punteiro aka. Polo tanto, é o enderezo de algo. Qué é o enderezo do? 

Ben - Eu son o único que pode ver o moito punto importante que eu estou facendo, ou pensan Eu estou facendo. Entón cadea - o triste é que eu teño un monitor alí onde podería ver isto. 

Todo ben, entón cadea s é o que Eu declarei anteriormente. Pero resulta que, grazas a un pouco maxia na biblioteca CS50, todo iso cadea de hora ten literalmente foi estrela de char. A estrela significa novo punteiro ou enderezo. O feito de que é o seguimento caracter de palabra significa que é a enderezo dun personaxe. 

Entón, se conseguir cadea chámase, e eu tecleo en H-E-L-L-O, propoñer agora o que se corda foi literalmente volvendo todo Neste momento, aínda que, no canto simplista do mundo? Que significa obter corda realmente volver como o seu valor de retorno? 

123, neste caso, por exemplo. Xa dixen anteriormente que se cadea simplemente devolve unha cadea, unha secuencia de caracteres. Pero iso é un pouco de unha mentira branca. A forma como se cordas realmente funciona debaixo do capó é que queda a corda do usuario. El se Estatela os personaxes que el ou ela tipo de memoria. Ela pon un cero barra invertida ao final daqueles secuencia de caracteres. 

Pero entón o que se cadea literalmente volver? É, literalmente, retorna o enderezo do primeiros bytes en RAM que se usa para esa forza. E verifícase que só devolvendo un único enderezo da primeiro carácter da cadea, que é suficiente para atopar a totalidade a cadea. 

Noutras palabras, conseguir a cadea non ten para volver 123 e 124 e 125. Non ten que me dar un paso lista de todos os bytes miña corda está a usar. Porque un, todos eles están de volta para tras. E segundo, baseado na primeira dirección, I pode descubrir que a cadea remata. Como? 

O carácter nulo especial, a barra invertida cero ao final. Así, noutras palabras, se pasa ao redor - dentro das variables - o enderezo de un char, e asume que, ao final de calquera cadea, calquera secuencia de caracteres como nós, seres humanos pensar en cordas, se asumir que a finais de tal cadea hai un cero barra invertida, é ouro. Porque sempre pode atopar ao final dunha cadea. 

Agora o que realmente está a suceder, a continuación, en neste programa? ¿Por que este programa, compararse 0.C, con erros? O que realmente está a ser comparado? Si? 

Estudante: [inaudível]. 

DAVID Malan: Exactamente. É comparando as posicións das cordas. Polo tanto, se o usuario introduciu en Ola unha vez máis, como eu fixen, a memoria pode acabar dese xeito. Se, a continuación, o usuario escribe en Ola de novo, pero chamando obter corda de novo, c é non é particularmente intelixente, a menos que ensina que sexa intelixente, escribindo código. 

C - e ordenadores en xeral - se escribir a palabra Ola de novo, vostede sabe o que vai conseguir. Vas só para ter unha segunda matriz de memoria que, si, pasa ser almacenar H-E-L-L-S e así por diante. 

Terá o mesmo aspecto de nós seres humanos, pero este enderezo pode non ser 123. El só podería acontecer que o sistema operativo ten algúns dispoñibles espazo, por exemplo, a localización - digamos que algo arbitrario, como este é lugar 200. E este é o lugar 201. E este é o lugar 202. Nós non temos ningunha idea de onde iso é será na memoria. 

Pero o que significa isto é que o que se será almacenado, finalmente, en s? O número 123. Que será almacenada en t, neste exemplo arbitraria? O número 200. E todo isto significa, entón, por suposto, 123 non é igual a 200. E así esta condición Ná valorada como certa. Por corda get está a usar distintas anacos de memoria de cada vez. 

Agora podemos ver iso de novo outro exemplo. Déixeme ir adiante e abrir copia 0.C. Eu afirmo que este exemplo vai probar - pero non - copiar dúas cordas como segue. 

Vou dicir unha cousa para o usuario. Estou pasando entón a ter unha corda e chamalo s. E agora, eu estou facendo esta verificación aquí. Mencionados iso un tempo atrás. Pero cando pode ter secuencia de retorno null, outro carácter especial ou especial símbolo digamos. Se é falta de memoria. 

Por exemplo, se o usuario é realmente ser difícil e tipo de atroz número de caracteres no teclado e folgas Intro. Se ese número de caracteres simplemente non pode caber na memoria RAM para calquera tolo razón, así se podería corda moi ben volver nulo. 

Ou se o seu propio programa está facendo moi doutras cousas e non só Non hai memoria suficiente para a corda get para ter éxito, pode acabar Voltar nulo. Pero imos ser máis preciso como o que é iso. Cal é o tipo de datos de s realmente? Estrela Char. 

Entón non é que agora podemos casca apoiar a capa de nulo. Acontece que, nula é - si, obviamente un símbolo especial. Pero o que é realmente? Realmente, nulo é só un símbolo que os seres humanos utilizan para representar cero tamén. 

Así, os autores C e ordenadores máis xeralmente, decidiu anos que, xa sabe o que. Por que non é seguro que ningún usuario datos é que nunca, nunca, nunca gardado a bye Cero? De feito, mesmo no meu exemplo arbitrario antes, eu non comezar a numeración de bytes en cero. Comece nun. Porque eu sabía que as persoas no mundo decidiron reservar o cero byte en ninguén RAM como algo especial. 

A razón de ser, a calquera hora que quere sinal de que algo está mal no que se refire aos enderezos, é devolto null - tamén coñecido como cero - e por que sabe que non hai ningunha lexítimo de datos na páxina cero, claramente que significa un erro. E é por iso que, por convención, comprobe a nula e volta algo como un deses casos. 

Entón, se rodar agora, este é só logo comprobación de erros, só no caso algo deu mal con [? fianza?] completamente e saír do programa volvendo máis cedo. Esta liña agora podería ser reescrito como este, o que significa o que? Na parte esquerda, dáme outra punteiro para un personaxe, e chamalo de t. O que eu estou almacenando dentro t, baseado sobre esta liña de código? 

Estou almacenando un lugar. En concreto, a localización que foi en s. Polo tanto, se o usuario introduciu en Ola, e que primeiro pasa Ola acabar aquí, a continuación, o número 123 é volverá de obter corda e ser almacenado - como dixemos anteriormente - en s. 

Cando eu declaro agora outro punteiro para un char e chamalo de t, o número é literalmente vai acabar en t segundo a historia? Entón, 123. 

Entón, tecnicamente agora ambos s e t están apuntando para o exacto mesmos anacos de memoria. Entón, teña en conta o que vou facer agora para probar que este programa é buggy. 

Primeiro vou afirmar, con un f impresión, capitalizando a copia da cadea. Entón eu vou facer algo comprobación de erros. Vou ter seguro. Imos estar seguro de que a cadea t está en menos maior que cero en lonxitude, polo que hai algún personaxe alí para realmente feito. 

E entón pode lembrar esta dos exemplos anteriores. 2 máis - o que é en o ficheiro ctype.h. T franxa de cero dáme o cero caracter da cadea t. E 2 superior do mesmo valor, de Por suposto, convértese para maiúsculas. 

Así, intuitivamente, esta liña destacada do código está capitalizando o primeiro letra t. Pero non é feito, de forma intuitiva, a primeira letra s. Pero se está a pensar no futuro, o que eu son a piques de ver, cando executar este programa e imprimir o orixinal, s, ea copia chamada, t? 

Están, en realidade, será o mesmo. E por que é que van ser os mesmos? Ambos están apuntando para exactamente o mesmo. Entón, imos facelo. 

Facer copia cero. El recompila Aceptar. Déixeme executar copia cero. Déixeme escribir algo como Hola en todas as letras minúsculas, a continuación, prema Intro. E afirma que tanto o s orixinais ea copia son realmente idénticas. 

Entón, o que realmente pasou aquí? Déixeme redesenhar esta foto só para contar a historia dunha xeito un pouco diferente. O que realmente está a suceder debaixo do capuz cando declarar algo como s de char comezo, ou cadea s, Estou recibindo un ponteiro - que pasa a ser de catro bytes no aparello CS50 e en unha morea de ordenadores. E eu vou chamar iso de s. E iso ten actualmente algún valor descoñecido. 

Cando declara unha variable, a menos que colocar un valor alí, que sabe o que está aí. Pode ser unha secuencia aleatoria de bits de execución anterior. Entón, cando, na miña liña de código fai cadea, e despois gardar o regreso valor en s obter secuencia de algunha maneira - e imos finalmente descascada como obter obras de cordas, de algunha maneira atribúe unha matriz que probablemente parece algo como isto. H-E-L-L-S, invertida cero. 

Imos supor que este é o enderezo 123 só primeiro consistencia. Polo tanto, obter corda retorna, o liña destacada alí, el retorna o número dixemos, 123. Entón, o que realmente pasa dentro s aquí? 

Ben, o que realmente pasa dentro s é 123. Pero, francamente, eu estou quedando un pouco confuso por todos estes enderezos, todos estes números arbitrarios. 123, 124, 127. Entón, imos realmente simplificar o mundo un pouco. 

Cando falamos de punteiros, francamente, a nós seres humanos, quen diaños lle importa onde as cousas están na memoria? Isto é completamente arbitraria. Dependerá de como cantidade de RAM que o usuario ten. Dependerá de cando, o día executar o programa, é posible, e que a entrada do usuario lle dá. Estamos vivenda en detalle sen importancia. 

Entón imos abstraerse e dicir que, cando executa unha liña de código coma este, carbonizar estrela s recibe o retorno valor da cadea get. Por que non en vez de só deseñar o que seguir chamando un punteiro como se fose apuntando a algo? Entón eu afirmo agora que s up existe un puntero - debaixo do capó é un enderezo. Pero é só apuntando para o primeiro byte na cadea que foi retorno. 

Se eu volver agora para o código aquí, o que está pasando nesa liña? Pois ben, nesta liña destacado agora, Estou declarando parecer outro variable chamada t. Pero tamén é un punteiro, entón eu vou deseña-lo como, en teoría, a exacta mesma caixa de tamaño. E eu vou chamalo de t. 

E agora se volver para o código novo, cando almacenar está dentro t, o que eu son tecnicamente poñendo dentro t? Ben, tecnicamente, este foi o número 123. Entón, en realidade eu debería estar escribindo o número 123 existe. Pero imos levalo de nivel superior. t, se é só un punteiro, intuitivamente, é só iso. Isto é todo o que está a ser aí almacenados. 

Entón, agora nas últimas liñas interesantes de código, cando realmente ir sobre capitalizando o cero en t, o que está a suceder? Ben, t franxa de cero agora está a apuntar para o personaxe, presuntamente? 

Está apuntando h. Porque t franxa de cero - lembra, esta é vella sintaxe. t soporte de cero significa só que se t é unha cadea, t franxa de cero significa conseguir o cero personaxe no que a forza. Entón, o que realmente significa é ir a esa matriz - e si, iso pode ser 123, isto pode ser 124. Pero é todo sobre, lembre-se. Sempre falando dunha matriz, temos a vantaxe de falar índices de Google. 

E agora, podemos só supor que te soporte cero é h. Entón, se eu chamar 2 superior sobre el, o que é facendo realmente está capitalizando o h minúsculas a maiúsculas H. Pero, claro, o que se s? Está apuntando para a mesma secuencia danado. 

Entón, iso é todo o que está a suceder neste código ata o momento. Entón, cal é entón a implicación? Como é que imos corrixir estes dous problemas? Como podemos comparar con cordas reais? 

Ben, intuitivamente, como é que vai sobre a comparación de dous cordas para a verdadeira igualdade? 

O que significa que dous cadeas son iguais? Claro que non son os seus enderezos igual na memoria, porque iso é un baixo detalle de implementación nivel. Todos os caracteres son idénticos. Entón deixe-me propor, e deixe-me presentar na versión dun compare.c aquí, entón compararse 1.c. 

Déixeme propoñer que aínda obter un punteiro chamado s, e unha tenda na que o devolver o valor de secuencia de get. Imos facer o mesmo con t. Así, a parte do código é diferente. Eu estou indo a engadir un pouco máis a comprobación de erros agora. Entón, agora que estamos especie de descamação de volta este capas CS50 que unha cadea realmente é, necesitamos ser máis anal sobre asegurarse de non abusar valores non válidos como nulos. 

Entón, eu só vou comprobar. Se s non é igual a nulo e t non igual nulo, isto significa que estamos Aceptar. Sexa corda non romper quedando calquera destas cordas. E pode, quizais, creo que agora, o que non STR CMP presuntamente facer? Cadea de comparación. 

Polo tanto, se programa en java antes, dicir como o método equals no clase cadea. Pero para aqueles de vostedes que non teñen previsto antes, esta é só unha función c. Pasa a entrar nunha arquivo chamado string.h. É aí que el é declarado. 

E corda comparar - Realmente esquecer o seu uso, pero non importa. Lembre que podemos facer home, mexa comparar. E iso vai levar o Manual de desenvolvedores Linux. E, francamente, algo enigmática. Pero eu podo ver que aquí, si. Teño que incluír string.h. 

E di aquí en descrición, "a función de comparación compara cadea as dúas secuencias S1 e S2. "E S1 e S2 son, ao parecer, os dous argumentos pasados ​​dentro Realmente non lembro o que const é, pero agora entende - e pode ver iso xa cando usa as páxinas de manual, se ter todo - aquela estrela char é só sinónimo con cadea. 

Entón, el compara as dúas cordas, S1 e S2, e retorna un enteiro menor que ou igual a ou maior que cero S1 atópase, respectivamente, para ser inferiores ou iguais, ou ser maior que S2. Isto é só un xeito moi complexo de dicir esta secuencia comparar retorno cero dúas cadeas son intuitivamente idénticas, personaxe de personaxe para personaxe. 

El retorna un número negativo se s, por orde alfabética, se quere para vir antes de t. Ou retorna un número positivo s debe vir despois de t en orde alfabética. Así, con esta función simple, podería vostede, por exemplo, clasificar unha todo morea de palabras? 

Así, nesta nova versión, vou para ir adiante e facer compare1. Dot barra comparar un. Vou escribir Ola en todas as letras minúsculas. Vou escribir Ola en todas as letras minúsculas novo. E por sorte agora entende Eu escriba o mesmo. 

Mentres tanto, se eu escribir Ola en baixa OLA caso e en letras maiúsculas e comparalos-los, eu escriba cousas distintas. ¿Por que non son só os enderezos diferente, pero estamos comparando diferentes personaxes de novo e de novo. 

Ben, imos alí e corrixir un outro problema agora. Déixeme abrir unha versión de copia, que agora dirixe esta cuestión do seguinte xeito. E este se ve un pouco máis complexa. Pero se pensar sobre o problema que que resolver, espera que este será claro en só un momento agora. 

Polo tanto, esta primeira liña, char inicio t, en termos laicos alguén podería propoñer o que esta liña aquí significa? Char estrela t, que é o que está facendo? 

Bo Crear un punteiro para algúns lugar de memoria. E déixeme refinala-lo un pouco. Declare unha variable que pode almacenar o dirección dalgún carácter na memoria, só a ser un pouco máis axeitada. 

OK, agora no lado dereito, eu teño nunca vin unha desas funcións antes, malloc. Pero o que podería dicir? Distribución de memoria. Distribución de memoria. 

Así, ao parecer, ata agora, nós realmente non tiña un xeito poderosa de pedindo o sistema operativo, Dáme un pouco de memoria. Pola contra, agora temos unha función chamada malloc que fai exactamente iso. Aínda que iso é un pouco de distracción, agora, entender que en entre ambos os parénteses está só vai ser un número. Onde eu escriba en cuestión as marcas poden ser un número. 

E ese número significa, darme 10 bytes. Déame 20 bytes. Déame 100 bytes. Malloc e fará o mellor para pedir ao sistema operativo - Linux, neste caso - hey, son os seus 100 bytes de memoria RAM dispoñible? Se é así, devolver eses bytes para min por volvendo a dirección de cal os bytes, quizais? O propio primeiro. 

Polo tanto, aquí tamén - e isto é predominante en C, a calquera hora que está xestionar enderezos? Está case sempre lidando co primeiro enderezo tanto, non importa o grande unha peza de memoria que está sendo devolveu, por así dicir. 

Entón imos mergullar aquí. Estou tentando reservar como moitos bytes, exactamente? Well. Lonxitude da corda de s - imos facer un exemplo concreto. Si s é Ola, H-E-L-L-O, que é o lonxitude da corda de s, obviamente? Por iso, é de cinco anos. Pero eu estou facendo un máis un no que, por que? Por que quero seis bytes no canto de cinco? O carácter nulo. 

Non quero deixar de fóra este carácter nulo especial. Porque se eu fai unha copia do Ola e só facer H-E-L-L-A, pero eu non poño ese carácter especial, o ordenador non pode ter, por casualidade, unha barra invertida zerar alí para min. E así, se eu estou tentando descubrir o lonxitude da copia, eu podería pensar que é 20 caracteres, ou un millón caracteres se eu nunca ocorrerá a bater un cero barra invertida. 

Por iso, precisamos de seis bytes para almacenar H-E-L-L-S, invertida cero. E entón este é só ser super anal. Supoñamos que eu esqueza o que o tamaño dunha char é. Nós mantemo-nos dicindo que é un byte. E xeralmente é. En teoría, podería ser algo diferentes, nun Mac diferente ou unha Ordenador diferente. 

Entón non é que hai ese operador chamado sizeof que se pasalo a nome dun tipo de datos - como char, ou int ou float - el lle vai dicir, de forma dinámica, cantos bytes un char ocupa neste determinado ordenador. 

Polo tanto, esta é efectivamente só como veces un ou dicindo veces nada. Pero eu estou facendo iso só para ser super anal, que só no caso dun char diferente no seu computador contra a miña, deste xeito a matemática sempre está indo a check-out. 

Finalmente, aquí eu verifico a nulo, que sempre é unha boa práctica - de novo, calquera momento que estamos lidando con punteiros. Se malloc non foi capaz de dar me seis despedidas - o que é pouco probable, pero só no caso - voltar un inmediato. E agora, vai adiante e copiar a corda como segue. E esta é a sintaxe familiar, aínda que nun papel distinto. 

Eu estou indo a ir adiante e comezar a cadea lonxitude de s e almacena-lo no n. Estou pasando entón a iteración i é igual a cero ata e incluíndo n, maior o igual a. De forma que en cada iteración, engada o carácter om de s no om carácter de t. 

Entón, o que realmente está a suceder debaixo a capa aquí? Ben, se este, por exemplo, é s - e eu escriba a palabra H-E-L-L-O e hai un cero barra invertida. E unha vez máis, esta é s apuntar aquí. E aquí é agora t. 

E iso está a apuntar agora para unha copia de memoria, non? Malloc deume un todo anaco de memoria. Non sei o que é, inicialmente, en calquera destes lugares. Entón, eu vou pensar niso como unha morea de puntos de interrogación. 

Pero así que eu comezar Looping de cero encima ao longo da lonxitude s, t soporte cero e soporte t 1 - e eu vou poñer iso agora na sobrecarga - t soporte cero e s soporte media cero que eu vou estar copiando iterativamente h aquí, o E-L-L-S. Ademais, porque eu fixen o máis 1, barra invertida cero. 

Entón, agora, no caso de que comparalos 1.c, ao final, se eu imprimir o capitalización de t, temos que ver que s mantén-se inalteradas. Déixeme ir adiante agora e facelo. Entón faga copy1. Dot barra copy1. Vou escribir Ola, Intro. E agora observar, só a copia foi capitalizar. Porque realmente teño dous anacos de memoria. 

Por desgraza, pode facer algún ben cousas malas e moi perigoso aquí. Déixeme puxar arriba un exemplo aquí agora, , Que nos dá un exemplo de algúns liñas diferentes. Entón, só intuitivamente aquí, a primeira liña de código, int x estrela, está declarando unha variable chamada x. E cal é o tipo de datos desta variable? Cal é o tipo de datos que a variable? Aquel non era o momento de angustia. 

O tipo de datos int é estrela. Entón, o que significa isto? x vontade gardar o enderezo dun int. Simple como iso. Y vai almacenar o enderezo dun int. ¿Que é a terceira liña do código está facendo alí? É atribución cantos bytes, probablemente? Four. Debido ao tamaño dun int é xeralmente catro, malloc de catro dá me facer a dirección de unha peza de memoria, o primeiro de cuxos bytes é almacenado agora en x. 

Agora estamos movendo un pouco rápido. Estrela x significa o que? Isto significa ir a este enderezo e poñer o número de alí? Engade o número 42 alí. Estrela y significa ir ao que está en y e poñer o número 13 alí. 

Pero agarde un minuto. O que está en y no momento? O enderezo é y almacenamento? Non sabemos, non? Nunca xa usar a asignación operador inclúen y. Entón, y, segundo declarou na segunda liña de código é só un valor de lixo, un gran punto de interrogação, por así dicir. Pode-se apuntar ao chou a calquera cousa na memoria, que xeralmente é malo. 

Así, logo que se loita esa liña alí, estrela y é igual a 13, algo malo, algo moi malo está pasar con Binky. Entón imos ver o que vai acabar suceder con Binky aquí neste minuto ou entón buscar. 

[REPRODUCIÓN] 

-Ei, Binky. Espertar. É tempo para divertirse punteiro. 

-Que é iso? Máis información sobre punteiros? Oh, goodie. 

-Ben, para comezar, creo que estamos Vai ter un par de punteiros. 

-Aceptar. Este código aloca dous punteiros que pode ligar a números enteiros. 

-OK, así, eu vexo os dous punteiros. Pero eles non parecen ser apuntando para nada. 

-Iso mesmo. Inicialmente, os punteiros non apuntar para calquera cousa. As cousas que eles apuntan chámanse pointees, e configure-los é unha etapa separada. 

-Oh, non, non. Eu sabía. Os pointees son separados. Así como reservar un pointee? 

-Aceptar. Ben, este código aloca un novo enteiros pointee, e esta parte define x para apuntar para el. 

-Ei, iso parece mellor. Polo que facer algo. 

-Aceptar. Vou cancelar o punteiro x para almacenar o número 42 no seu pointee. Para este truco, eu vou ter a miña maxia vara de dereferencing. 

-A súa vara máxica de dereferencing? Uh, iso é óptimo. 

-Isto é o que o código parece. Eu só vou definir o número, e - 

-Ei, mira. Alí vai el. Así, facendo un desreferenciava en x segue a frecha para ter acceso ao seu pointee. Neste caso, 42 para almacenar alí. Hey, proba usalo para gardar o número 13 a través do outro punteiro, y. 

-Aceptar. Vou pasar por riba aquí para y e O número 13 configurar. E, a continuación, tomar a vara de dereferencing e só - Guau! 

-Oh, hey. Isto non funcionou. Digamos, Binky, eu non creo que o dereferencing y é unha boa idea, porque a configuración do pointee é un paso separado. E eu non creo que nós xa fixemos. 

-Hmm. Bo punto. 

-Si, alocamos punteiro y. Pero nós nunca configuralo para ligar a un pointee. 

-Hmm. Moi observador. 

-Ei, está mirando bo alí, Binky. Pode resolve-lo, para que y puntos ao mesmo pointee como x? 

-Claro. Vou usar a miña vara máxica de asignación de punteiro. 

-Será que vai ser un problema como antes? 

-No. Isto non tocar os pointees. El só cambia un punteiro para ligar o mesmo que o outro. 

-Oh, eu vexo. Agora y apunta para o mesmo lugar que x. Entón, agarde. Agora y é fixo. Ten un pointee. Así, pode probar a vara de dereferencing novo Enviar a 13 terminado. 

-Aceptar. Aquí vai. 

-Ei, mira iso. Agora dereferencing obras sobre y. E por que os punteiros están compartindo que un pointee, eles tanto ver a 13. 

-Si. Compartindo. Calquera que sexa. Entón imos cambiar de lugar agora? 

-Oh, mire. Estamos sen tempo. 

-Pero - 

-Teña en conta que de tres normas punteiro. O número un, a estrutura básica é que ten un punteiro. E apunta máis a un pointee. Pero o punteiro e pointee son separados. E o erro común é crear un punteiro, pero a esquecer dun dato pointee. 

Número dous, enlace dereferencing comeza no punteiro e segue o seu frecha sobre a acceder á túa pointee. Como todos sabemos, iso só funciona se hai é un pointee, que volve ao regra número un. 

Número tres, a asignación de punteiro leva un punteiro e cambia-lo para apuntar Nas mesmas pointee como outro punteiro. Así, tras a concesión, os dous punteiros apuntar ao mesmo pointee. Ás veces iso é chamado de reparto. E iso é todo o que existe para ela, realmente. Bye bye agora. 

[FIN reprodución de vídeo] 

DAVID Malan: So máis sobre punteiros, máis sobre Binky a próxima semana. Vemo-nos o luns.