>> 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?
>> 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.
>> 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.