Jason Hirschhorn: Welcome a A5, todos. Temos unha semana emocionante por diante de nós, sobre todo porque hai tantos novos afronta nesta sala. É marabilloso. Moitos de vostedes están aquí por casualidade, o que é aínda mellor. Polo tanto, esperamos que continuará unirse a nós. Esta semana estamos indo a gastar a maior parte da sección preparado para o quiz. Entón por nosa axenda, imos falar un pouco sobre os recursos para a clase, , Senón tamén para a proba e, a continuación, de novo, pasar a maior parte da clase falar sobre as preguntas. Xa que estamos a facer responder a súa preguntas, ou se as súas preguntas naturalmente levar a algunha codificación, eu Ten problemas de mostra midterms pasado que vai codificar en directo na sección xuntos que tamén traer algún outro bos temas para cubrir. Entón, primeiro, coma nós pasamos ao dúas últimas semanas para lembra-lo caras, hai unha tonelada de recursos dispoñibles para este curso. Moitos deles van ser moi útil para ti como continuar a estudar para concurso 0, porque é martes pola tarde. Entón, todos vostedes foron estudar un pouco. Hai notas de clase e fonte código que debe definitivamente check-out. Assist os calzóns. Consulte study.cs50.net. E, a continuación, enumerados a continuación, un número doutros recursos. Unha vez máis, quiz 0 é mañá á 1 hora. Se non ten feito isto, comproba Sobre o documento quiz 0 no páxina de inicio do curso para descubrir onde está tomando o quiz. O concurso comeza ás 1:10 e remata 70 minutos máis tarde. Entón, se mostrar-se despois 1:10, está terá que moitos menos minutos de 70 para facer a proba. Polo tanto, asegúrese de que está alí na hora. Se vostede é un estudante de extensión ou ter algunhas outras consideracións de proba, é dicir pode non ser a 1:00 de mañá. Pero, de novo, comproba a 0 sobre Quiz documentar para asegurarse de que vostede sabe cando está tomando o quiz. Escribín 75 minutos aquí. Eu creo que é iso mesmo, non 70. Ela abrangue todo o material a partir dunha semana 0 a charla da semana pasada o mércores. E, de novo, para esta proba, por que documento, que obtén un de dous lados e 8 1/2 por 11 folla de papel que obteña para usar como notas durante o quiz. Moita xente, se non a maioría da xente, ten descubriu que o único xeito máis útil para estudar para o exame é facer unha folla de estudo, unha one-Sider, da súa propia. Entón mire para os últimos xa viu os últimos. Chegar aos amigos a ver que están poñendo nos seus. Pero as mans para abaixo, o mellor xeito que poida estudo é que pasar por todo e tallar-lo para o que deben ou non pertence a esa folla de papel, porque iso é só un realmente xeito útil para que teña seguro está pasando por todo e ter algunha familiaridade con el. A maioría da xente, atopamos, aínda que ter a folla de papel sentado á beira deles no cuestionario, non chame para iso, xa que, de novo, que moi proceso de ir a través da información axudou a aprender. Alguén ten algunha dúbida sobre cuestionario 0? Ten todos - Eu non vou facer un concerto de mans. Nunca mente. Eu ía preguntar quen comezou a estudar. Pero eu non quero facer todo non levanten as mans. Entón, como eu dixo - si, Avi, vai adiante. AVI: O que sería unha cousa útil para poñer no one-pager? ALUMNO: Isto é contigo. Jason Hirschhorn: Comeza para utilizar o seu xuízo. Cousas útiles para poñer no one-pager, Se está confuso sobre o gran O tempo de execución de distintos tipos de investigacións e tipo, poñer isto alí nun gráfico dandy accesible. Desta forma, se é proposta que en cuestionario, non tentar e figura lo ou razón pola execución. Pode simplemente copia-lo para abaixo. Se ollar para quizzes pasado, unha serie de veces, non está executando cuestións de tempo. Así que sería un exemplo dun bo cousa para poñer no seu one-pager. Outras cousas boas de poñer, se está confuso sobre como declarar un función ou que as diferentes partes a declaración da función é, escribir que alí, unha versión xenérica e logo, se cadra un exemplo. Se está confuso sobre punteiros, un diagrama de como punteiros traballo é probablemente realmente útil. Se está confuso sobre recursión, un probar función recursiva alí Tamén pode chegar a ser moi útil. Será que isto lle dar algunhas ideas? AVI: Debe entender a todo o proceso de compilación, como como iso todo funciona? Jason Hirschhorn: Todo que foi cuberto podía aparecer no quiz. Preguntas - pero, de novo, algunhas cousas van ser ponderados fortemente que outros. Algunhas cousas veñen-se de novo e de novo en clase, en charla e sección. Outras cousas que non ten xorden a miúdo. Nós falamos moito sobre # include e -L algo e que aqueles significan en o proceso de compilación. Nós falamos moito sobre o GDB, se agarran, esas bandeiras diferentes que usan cando compilar algo, e que make15, por exemplo, realmente significa e realmente fai. Non falar tanto sobre cada paso na o proceso de compilación. Nós aínda falamos sobre iso. Por iso, aínda é algo que debe estar familiarizado. Pero, de novo, non imos ser - cousas que xorden con máis frecuencia en clase son máis propensos a chegar a máis e adoitan ser máis fortemente ponderados no quiz. Legal. Calquera outras preguntas sobre proba 0? OK, entón eu coloque unha lista de temas sobre a placa. Eu atravesei o programa. Eu atravesei a sección de revisión de onte á noite e os diapositivas para chegar cunha lista non exhaustiva de temas que nós Cubrimos ata agora en CS50 e cousas que poden aparecen no quiz. Entón eu non vou pasar por cada un único destes. Isto levaría moito máis tempo do que o que temos agora. Pero eu coloque iso aquí esperando jog súa memoria como a cousas que poden ou pode non ser tan familiar con vostede. E eu adoro pasar a maior parte do sección respondendo as súas preguntas sobre estes temas, temas que non son aquí tratados. Podemos escribir un código pseudo. Podemos escribir o código real, para garantir que - Podo responder a súa pregunta e axudar todo fundamentalmente entender un Moitos destes temas de xeito que sente preparado e cómodo indo a o mañá quiz. Entón lea sobre a lista. Vostede espera chegar a sección con algunhas preguntas tamén. Cando estea listo, levante a man e imos comezar. Teña presente, as preguntas que ten, non hai preguntas estúpidas. Escoitamos moito iso. E as preguntas que ten, estou disposto apostar, moitas outras persoas, tanto aquí sentado e asistir en liña teñen tamén. Así, só pode axudar a xente facendo preguntas. Marcus. MARCUS: entre a pila e o pila, hai unha condición asignado porcentaxe de memoria que é definido como é dicir, para a pila ou ao monte? Ou como é que funciona isto exactamente? Jason Hirschhorn: Gran pregunta. Eu estou indo para tras trazar un pouco. Será que todo o mundo - por favor, sexa honesto aquí. Sei que estou pedindo para aumentar a súa man por diante dos seus compañeiros. Pero hai persoas que se senten incómodo coa pila e pila e quere pasar por riba dese eo que os significa? Levante a man se - Aceptar. Grazas. Entón, imos pasar por riba da pila e a pila moi rapidamente e, a continuación, moverse en responder a súa pregunta. Entón, se nós sacar unha caixa para representar memoria no seu ordenador, o que son algúns cousas que van nesa caixa? Main. A función principal. Onde a principal ir? Estudante: [inaudível]. Jason Hirschhorn: Entón nós imos poñer principal aquí. O que máis vai nesa caixa? ALUMNO: As funcións que chama. Jason Hirschhorn: As funcións que chamamos. E onde van? ALUMNO: Na pila. Jason Hirschhorn: Eles ir na pila. Entón, imos chamar iso de cousa aquí abaixo do conxunto. E alí enriba, temos a heap. Así, a memoria non é unha caixa así. Pero é realmente moi semellante. Vai ser unha morea de caixas ao longo do e máis, dependendo de como é grande o seu ordenador é ou o quão grande é a súa memoria. Ao entre comiñas "bottom" é a pila. E hai moitas cousas que van para a pila. E aqueles dependen das funcións ten no seu código. Sempre ten unha función no seu código chamado de inicio, polo que sempre hai un sección aquí no apilar dedicado á principal. Estas seccións da pila son chamados cadros de pila. Cando chamar outra función, dicir principal chama unha función de procura binaria, imos poñer outro cadro na pila. En concreto, nós imos doar un anaco de memoria na nosa ordenador para almacenar binario busca de lugares variables e para realizar o binario código de busca. Entón chamamos busca binaria. Neste anaco de memoria, nós imos para almacenar as súas variables locais. Estamos indo para almacenar as súas chamadas printf. Pase o que pase, esta función é será almacenado alí. Busca binaria vai realizar. El vai para completar a execución. Cal é a palabra en C que significa unha función que debe completar a súa execución? ALUMNO: Return. Jason Hirschhorn: Return. Así, sempre que ve unha instrución de retorno, os extremos de función cando bate aquel. Entón busca binaria vai acertar o seu regreso. Esta parte da memoria será, esencialmente, ser liberada. E principal vai voltar a execución. Así principal fará unha pausa cando era, chamada busca binaria, obter un valor de retorno, e continuar a execución. Este cadro de pila vai. Se chamarmos unha función recursiva, que é unha función que chama a si mesmo ao longo do e máis, podemos chegar - dicir que fixo busca binaria recursiva. Podemos obter unha versión binaria de investigación, busca binaria dous, busca binaria tres, busca binaria catro, busca binaria cinco. E entón esta investigación binario final cinco vai bater o caso base, ea pila cadros volver e manter peche ata chegar de volta á principal. Podemos pasar por riba de recursão en algo. Pero todo isto é para dicir que, se está a chamar varias funcións á vez, haberá pila múltiple cadros na pila. A pila, por outra banda, se aquí, non é para as funcións, non para variables locais. É para alocada dinamicamente variables. Entón, estas son as variables que se poden iniciar o principal ou unha Función que principais chamadas. En calquera lugar no seu código, eles se pode inicializar. E para arrincar un dinámicamente variable alocada. Cara a unha función en C que usan? ALUMNO: malloc. Jason Hirschhorn: malloc. Vostede chama malloc. Vostede gañou un espazo de memoria. E que o espazo de memoria está no heap. E ese espazo de memoria permanece alí ata que chame gratis. Entón variables alocadas dinámica en pila vai existir por tanto tempo como vostede quere que existen, e eles non van ir ata que explicitamente dicir-lles para ir aínda. Podes crealos nunha función. Aquela pila de función cadro vai. Pero esa variable aínda haberá na pila ata que sexa liberado, potencialmente pola función que chamou busca binaria ou o que sexa. Entón, estas variables heap estar alí durante o tempo que sexa eles para estar alí. E se poñer aquí. E, a continuación, o seguinte é colocado alí. Manteñen-se cuberto, e eles estar alí ata que chame gratis. E, esencialmente, a pila ea pila, quedando á pregunta de Marcus, crecen en dirección un ao outro. E se executar para o outro, ten usou toda a memoria do seu ordenador, eo seu programa vai saír porque non ten máis memoria deixaron de usar. Entre eles, hai potencialmente outras cousas. Pero, para o ámbito deste curso, Non se preocupe con iso. Entón esa foi a resposta á súa pregunta. Non hai problema con iso. Pero esa era a resposta longa. Todo o que precisa saber é o pila ea pila vai - un comeza na parte inferior. A pila fai. A pila está alí enriba. Vai ser crecer máis preto un do outro. E se tocar, iso é un problema. Vostede quedou sen memoria. Pero tamén, ademais de saber onde están, o que está almacenado en ambos os pila e heap. Curtis. CURTIS: Cando chocan, é que un estourido de pila? Jason Hirschhorn: Cando chocan, iso non é un estourido de pila. Un estourido de pila é unha área diferente que podemos pasar por riba se quere. OK, imos voltar a iso de aquí a pouco. Estudante: Cal é a palabra chamada cando baten un no outro, o pila e da pila? Jason Hirschhorn: De momento, non se preocupe. Só sei - Vou responder a esta pregunta despois da aula. No caso de que corren para o outro, foi para fóra de memoria, por que non hai máis espazo alí. ESTUDANTE: Sentímolo, pero o que é un fallo de seguridade? Jason Hirschhorn: Un segmento fallo pode ser chamado para - depende por que chamou o culpa seg. Ás veces, o estourido de pila, vai dicir seg fallos como o erro. ALUMNO: E sobre dereferencing unha variable null? Isto é un fallo de seguridade? Jason Hirschhorn: Dereferencing un punteiro nulo - OK, entón se ten un punteiro que definir igual a nulo, punteiros, recall, enderezos de memoria tenda como os seus valores. E un punteiro nulo é esencialmente almacenamento de 0, o 0-th abordar nesa variable. Así 0x, 0, 0, 0, 0, etcétera. Isto 0-th enderezo na memoria que non é na nosa imaxe, que está alí enriba nalgún lugar, que está reservado para o ordenador. Non temos permiso para tocalo. Así, cando o programa está en execución, se algo está intentando ir á memoria enderezo 0, el sabe que que é un valor baleiro. El non sabe nada debería estar alí. Entón, se tentar empregar algo alí e tratar algo como alí ou tentando ir a ese lugar, está terá un fallo ou un erro seg. Isto responde a súa pregunta? E agora imos voltar de estourido de pila. As cousas na pila, como vostedes teñen visto antes, en - imos deseñar un close -Se dun cadro de pila. Todos poden ver iso? Entón, nós temos o noso cadro de pila. Estamos a gardar unha matriz como un lugar de variable nesta función. Entón, dicir que a nosa matriz ten cinco puntos. Todos os cinco destes será almacenado nese cadro de pila. Se comezar a escribir para alén do límites deste conxunto - por iso, se comezar a escribir en, imos dicir que é 0. Estes son os cinco índices da nosa matriz. Se comezar a escribir en índice 5, que non temos cando temos unha matriz de tamaño 5, comezan a escribir en índice de 6, 7, 8, 9, podemos obter unha Stack Erro de estourido. Xeralmente non é - probablemente vai ter problemas se pasar por riba por un. Pero, xeralmente, vai entrar no máis problemas, se pasar por riba dun monte e ir tan lonxe máis que se escribe sobre o enderezo de retorno que función, que está situado no parte inferior do cadro de pila. Porque, non? Entra - no - desculpe. Non ", porque a dereita." No cadro de pila, ten súas variables locais. Na parte inferior da pila cadro é o enderezo de retorno. É aí que a función vai cando acabar. E se substituír ese retorno enderezo, a continuación, cando este cadro de pila, cando está indo a través da pila enmarcar e execución de cada liña, está indo a ir ao seu novo enderezo de retorno que está escrito alí en vez de o un real. E é así que nós vimos algúns fallos de seguridade pode ocorrer cos ordenadores. Entón estourido de pila, en suma, é cando substituír o papel na pila debería usar, o lugar de variable que pode usar, e en especial, cando comeza a eliminar cousas importantes, como o enderezo de retorno. E é aí onde vai ter un erro. Ou quizais mesmo pode comezar mesmo escribindo en - dicir de busca binaria foi logo enriba inicio. Se substituíu moito, podería escribir en principal. Pero, xeralmente, que obtén un erro antes entón, xa que o ordenador sabe está facendo algo que Non debería estar facendo. É. Estudante: Cal é a diferenza entre un estourido de pila e un buffer overflow? Jason Hirschhorn: Buffer overflow é un tipo máis xenérico de o que eu acabo de describir. ALUMNO: Entón un estourido de pila é un exemplo dun buffer overflow. Jason Hirschhorn: Exactamente. Esta é unha matriz que podemos pensar como buffer, un espazo para que as cousas van dentro Este é un estourido de buffer de pila. Poderiamos ter un estourido de buffer de pila. Se houbo un tapón, o cal moitas veces existe é unha matriz do conxunto, e nós overwrote destes límites, entón nós ter un estourido de buffer de pila. E alén do alcance deste curso, son detectados un pouco diferente. O compilador ten especial medios de detección de cada unha. Pero un buffer overflow é un máis xenérico tipo do que eu describe, que foi un estourido de buffer de pila. Será que isto responde a súa pregunta? Doce. Había outras cuestións relacionadas para a pila ou a pila? É. ALUMNO: Sei que ten que cordas libres porque están no heap e non quere baleirar memoria. Pero ten que liberar as variables globais e cousas así? Ou son liberados automaticamente? Jason Hirschhorn: Boa pregunta. Así, en CS50.H, creamos esta cousa para vostede chamou unha cadea. Unha corda é realmente o que? ALUMNO: Char estrela. Jason Hirschhorn: Unha estrela char, un punteiro a un personaxe, un punteiro para un conxunto de caracteres. Iso é o que a corda é. Entón, necesitamos liberala, porque getstring, que usan moito - nome da secuencia coincide getstring - que mallocs para nós un pouco de memoria no heap e retorna un punteiro para a primeiro carácter que corda, unha estrela de char. Entón, ao parecer, se non ten sido escribindo libre en calquera das súas cordas que xa chamou ata agora, ten foi vazando un pouco de memoria. Claro que nós non falamos de lo, de xeito que ninguén chegou en problemas para facelo. Pero de aquí para diante, si. Cando chamar getstring, está mallocing algún espazo no heap. E se non chamar libre, máis tarde, que corda, ten un escape de memoria. Isto responde a súa pregunta? Si Estudante: Entón, para facelo, usan dereito libre antes do retorno? Como, no ámbito de, eu creo que se dicimos, como, int main, dentro do ámbito do código que está dentro dos chaves, ben antes - sabe onde desexa costume poñer retorno. Vostede pon libre antes diso? Jason Hirschhorn: Entón pode pór libre onde queira que poñer-libre. Porque estes son alocados dinamicamente variables, porque poden vivir máis aló do ámbito dunha determinada función, se chamar malloc nun función separada, por exemplo, getstring, pode conectar de balde no inicio. Non precisa de chamalo en función onde malloc se chama. Pero ten que facer para chamalo antes da volta principais. E iso realmente depende. Depende de cal malloced que espazo, en primeiro lugar. Algunhas persoas van chamar liberar moi rapidamente. Algunhas persoas non van chamar de balde ata Ao final do seu programa. E eles van pasar por e libre de todo. Depende de por que chamou malloc. ALUMNO: E o que diría se chamou uso getstring? Vostede diría que libre o que? Jason Hirschhorn: Entón a sintaxe de balde é simplemente libre, paréntese aberta, preto paren, e o nome do punteiro. Entón, se escribir iguais cadea nome getstring, pór o nome aquí. Ese é o nome do punteiro. E el sabe que para liberar memoria. Estudante: Entón, cando libera a memoria, o punteiro aínda apunta a aquel lugar na memoria? Ou é o punteiro tamén estaba baleira de a dirección que apunta. Jason Hirschhorn: Debemos intentar iso. Debemos codificar iso. Imos volver cando chegamos codificación, e imos codificar iso. E se queres descubrir a resposta para iso, tamén se pode código que no mesmo período. Pero iso é unha grande importancia. ALUMNO: É posible algo libre cedo de máis? Entón, aínda que para o seu programa, e liberou ese espazo de memoria? Jason Hirschhorn: si. É posible, se algo libre e despois de usalo de novo, vai atopou con un erro. Pero isto é para ti, porque liberou algo e, a continuación, chamou-lle máis tarde. Entón iso foi un erro do programador. Pero si. Podes escribir isto. Máis algunha pregunta sobre - Si Estudante: Entón, se se quere que a só liberar-lo, en xeral antes da programa remata, isto significa que se o programa remata e non libera-lo, que a memoria aínda é asignado? Jason Hirschhorn: O programa remata e esqueza liberar algo, entón que a memoria foi alocada ao longo a vida útil do seu programa. Cando o programa se pecha completamente, que a memoria non está a suceder para estar alí para sempre. O ordenador é intelixente dabondo para saber que cando o programa é pechado, el que se librar de toda a memoria que asociouse co referido programa. Sen embargo, existen ferramentas que poden ser executados nun programa para detectar se, cando o programa rematar, esqueciches para liberar memoria. E para o seu próximo conxunto de problemas onde estará usando malloc e usando punteiros, estará correndo este programa no seu programa para ver se, cando volve principais, tivo algún cousas que foron deixadas non liberado. Entón, eles non van estar malloced para sempre no seu computador. Iso sería un desperdicio porque moi rápido, ordenadores ía quedar sen memoria. Pero, se eles corren ata o final do seu programar e eles non están liberados e seu programa sae, isto aínda é un problema que esta ferramenta pode axudar a resolver. ALUMNO: É iso Valgrind? JASON Hirschhorn: É chamado Valgrind. E vai ser - ALUMNO: Pero non temos que saber que, para o exame, aínda que? Quero dicir, foi falado un pouco na charla. Jason Hirschhorn: Entón Valgrind é o nome desta ferramenta. Saber o que fai é suficiente para o quiz. Pero non telo usado aínda no seu conxunto de problemas, porque non tivemos unha conxunto de problemas que ten explicitamente tratado con malloc ou está a usar malloc. Entón, vostede non usou Valgrind aínda. Pero vai usalo, máis cedo en vez de máis tarde. ALUMNO: Pode repetir Valgrind que é? Jason Hirschhorn: Sentímolo? ALUMNO: Pode repetir o que finalidade de Valgring é? Jason Hirschhorn: Valgrind é o nome - como GDB axuda a depurar o seu programa, Valgrind axuda a descubrir se as cousas non foron liberados cando o programa é pechado. Entón vai executa-lo no seu programa. E o seu programa sae, e só pode dicir seu programa chamado malloc iso moitos veces por iso moitos bytes, e só chama libre iso moitas veces. E así deixou eses moitos bytes sen ser liberados. Ou que vai dicir que liberou todo. Bo traballo. ALUMNO: Aceptar. E el chámase Valgring? Jason Hirschhorn: V-A-G-G-N-I-N-D. ALUMNO: Unha pregunta sobre punteiros. Entón, digamos que teña n protagonizar x é igual a algo. Isto equivale a, o que está poñendo alí, é que o que está a ser colocado dentro o que x está a apuntar cara, ou o punteiro de x? Jason Hirschhorn: Pode repetir a pregunta? Podemos chamar a isto mentres di iso? ALUMNO: O cuestionario, en realidade, a aquel que nos enviou, era como, char estrela certo é igual a CS50 rochas, non? Entón, isto significa que este CS50 rochas é o que a realidade está a apuntar cara? Jason Hirschhorn: Entón está falando sobre unha estrela de carácter nunha cadea, como que funciona? É. Aceptar. Imos chamar iso aquí. [SIDE conversa] Jason Hirschhorn: Entón esta variable será do tipo char estrela. Que grande é unha variable do tipo char estrela? Cantos bytes? ESTUDANTES: catro. Jason Hirschhorn: É catro bytes. Cantos dereitos é unha variable do tipo int estrela? ESTUDANTES: catro. Jason Hirschhorn: Catro bytes. De ser un punteiro, entón é sempre catro bytes, pois os punteiros, a súa valor é unha dirección de memoria. E os enderezos de memoria sobre o CS50 aparello son catro bytes. Entón, cando chamamos getstring, ou cando digamos, Nomedestring iguais, e, a continuación, en comiñas colocar unha corda, estamos poñendo - ben, iso é un pouco diferente. Nós imos facer getString como o exemplo. Ou char estrela algo é igual á cadea. Sentímolo, me dea o exemplo que leu? ESTUDANTE: char estrela certo é igual a "CS50 pedras" entre comiñas dobres. Jason Hirschhorn: Entón esta estrela, este imos chamar esta variable x para o noso propósitos xenéricos. Creamos unha variable chamada x. É tipo char estrela. É un punteiro para unha serie de caracteres. Entón, aquí abaixo - Polo tanto, esta é a forma como iso sería traballo na memoria. Isto ía almacenar un enderezo de memoria. Sería almacenar o enderezo de memoria o primeiro carácter na matriz. E entón, cando seguiu punteiro, faría obter o primeiro carácter. E se está lendo esta cousa como unha corda, o ordenador é intelixente o suficiente para saber, le todo isto ata chegar a unha reacción 0. Pero se está lendo isto nun personaxe un tempo, así que está interactuando a través esta cadea, entón só vai ler un carácter de cada vez ata chegar ao barra invertida 0. Isto pode non responder á súa pregunta. ALUMNO: Si, pero non ten malloced que o espazo Aínda para este punteiro. Jason Hirschhorn: Entón, eu non estou seguro exactamente o que está mirando, porque eu non fixen que quiz. Isto era para ser un útil recurso de outro TF. Se está creando unha corda no pila ou como unha variable local, que vai ser só matriz de carga, no canto de xeralmente unha estrela de char apuntando para outra cadea. Pero eu non sei. Isto podería ser un punteiro a outro cadea na pila tamén. É. ALUMNO: Sei que precisa asignar memoria o punteiro está sendo declarada dentro doutra función. Debe facer o mesmo, se é ser declarada dentro principal, está a usar-o dentro do principal? Jason Hirschhorn: Entón, si. Pode declarar un punteiro para calquera enderezo de memoria na memoria. Pode ser o enderezo de memoria dun lugar de variable, aínda que, moitas veces, a xente non declarar os enderezos de memoria a variables locais, porque eles van lonxe, xa que a función devolve, o que É por iso que xeralmente malloc cousas. Senón, podería declarar un punteiro a outra variable local. É non só xeralmente feito. Pero podo dar un ollo ao que cousa específica despois da aula. É. ALUMNO: Eu creo que iso é unha especie do que está a ser solicitado. Parece estraño para ser inicializado un punteiro non como un enderezo, pero como o parece ser un valor. Parece que o CS50 é o que está dentro a cousa que está a ser apuntado e non o enderezo real, non? Jason Hirschhorn: Entón é iso non é o caso, porén. Non é iso que está a suceder. Cando declara unha estrela char, é un enderezo de memoria. Os punteiros son todos os enderezos de memoria apuntando a algo máis. Que outra cousa podería estar no pila, pero é case sempre sobre o amontoar en como vai velo usado. Pero Nomedestring igual de comiñas dobres "GetString", podemos ver iso e nós pode ollar por iso e codificar iso. getString cadea non está a ser gardado en esta variable, ou o que a cadea nome non está a ser gardado na medida en que variable, non porque é así que punteiros funcionan. Será que isto ten sentido? ESTUDANTE: Yeah. Jason Hirschhorn: Aceptar. Afortunadamente, iso non era confuso para calquera. Pero se fose, podemos ollar para el de novo de aquí a pouco, porque en realidade estamos indo codificar algo que veña a traballar con cordas e axudar a sentir-se máis cómodo con eles. Calquera outras cuestións relacionadas con estes temas ou outros temas que Vou poñer de volta? E - agora. Si, Alden. ALDEN: Entón iso é completamente alleos, pero podemos simplemente pasar por riba moi rapidamente o que precisa saber sobre a diferenza entre un 32 e Máquina de 64 bits? Jason Hirschhorn: si. Así, 32 bits é cantos bytes? ALDEN: É catro bytes. Jason Hirschhorn: É catro bytes. E 64 bits é cantos bytes? ALUMNO: Oito. Jason Hirschhorn: Oito bytes. Entón, de novo, oito bits é un byte. O aparello é CS50 unha máquina de 32 bits. Así, os enderezos de memoria son catro bytes de lonxitude. Hai 2 ao 32 enderezos de memoria. De 0 a 2 ao 32 menos 1. E eu non son positivo, pero iso é probablemente o alcance do que precisa saber para unha máquina de 32 bits, que a memoria enderezos son, unha vez máis, catro bytes de lonxitude, e esa é a cantidade máxima de enderezos de memoria. Ademais, os tipos de datos - isto pode ser algo tan ben, iso é digno de nota. O tamaño dun tipo de datos depende a máquina que está a traballar. Así, un char, un único personaxe, é como moitos bytes na nosa aparello CS50? Un byte. E é realmente un byte como ben nunha máquina de 64 bits. E a maioría dos tipos de datos son o mesmo número de bytes en ambas as máquinas. Pero algúns tipos de datos será diferente en ambas as máquinas. Así que sería potencialmente único que ten que saber. Pero aínda que, eu creo, está alén dos límites - Estou case seguro, se ollar cara atrás en quizzes vellos, di que, para asumir codificación problemas que está a usar unha máquina de 32 bits. Pero hai, para ir xunto con iso en Pode que o interesado, hai tipos de datos que son os mesmos tamaño en todas as máquinas. Se xa viu algo parecido uint32_t, pode ou non vin iso. Isto é un tipo de datos. Isto está dicindo, sexa de 32 bits non importa o que esta máquina está activada. Entón, cando a xente está escribindo portátil código, eles probablemente non vai utilizar Ints. Eles en vez vou usar estes outros datos tipo que sabe que vai ser o mesmo tamaño en cada máquina individual. Madhu. Madhu: Eu tiña unha pregunta sobre o proceso de compilación. Entón, se está escribindo un programa que usa unha biblioteca como CS50 ou algo así, sei que esta biblioteca Ten que, nalgún momento, ser compilado e conectado dentro Pero canto do que acontece durante a compilación do seu programa? Que parte dese proceso biblioteca ocorre cando está compilar o seu propio programa? Jason Hirschhorn: Entón imos pasar por riba en xeral, os pasos do presente proceso. Vostede escribe o seu arquivo c .. No seu arquivo c., Vostede # include seu bibliotecas de cabeceira, por exemplo, cs50.h. O que isto pechada inclúen liña de facer para o seu programa? Akchar. AKCHAR: Engade os prototipos de as funcións a partir do cabeceira arquivos das bibliotecas. Jason Hirschhorn: Exactamente. Engade eses prototipos de función ao seu código. Entón, cando o seu código está compilado en etapas iniciais, o compilador sabe que estas funcións realmente existen, e que nalgún lugar eles foron definidos. Os ficheiros. H non inclúen o definicións para estas funcións ou como eles realmente funcionan. Cs50.h só inclúe algo que di getstring é unha cousa real que pode ocorrer. E standardio.h di printf é unha cousa real que pode ocorrer. Polo tanto, a súa linguaxe c con iso. Cabeceira ficheiro é transformado en algúns código de lectura óptica, que eventualmente transformouse en binario código, 0 e 1 do. E ese é o código que, en última instancia é executado. A l liña CS50 - por exemplo, cando está escribindo Clang - e entón incluírse l CS50, que escribe dentro E ve iso. Cando escribe fai, vai ver que formación aquí. E imos ver que nun segundo cando codificamos ou máis tarde, cando código. Pero a liña que CS50-l fai algo un pouco diferente do que o # include cs50.h. O que fai liña que-l CS50 facer? Avi? AVI: Eu quero dicir que se vincula a biblioteca para a función chamar, como os ficheiros. Ó. Jason Hirschhorn: Entón moi preto, se non spot-on. A l-CS50 leva o ficheiro binario e fúndese co seu ficheiro binario. Entón cs50.h, non hai punto de inflexión cs50.h da linguaxe C para binario cada única hora que está a ser usado. Iso sería tontería, porque iso sería un desperdicio de tempo. Por iso, xa foi feita e se converteu nun executable. E agora que vai ser fundidas co seu arquivo ao final. Polo tanto, aqueles 1 e 0 van fundir-se cos seus seres e 0 na final. Entón, agora vai realmente ter o real 1 e 0 que definen como getstring, por exemplo, traballa, ou como printf, por exemplo, funciona. E para máis información, hai unha compiladores curtas que Nate dá que ten que comprobar que por estes pasos. Pero - Si ALUMNO: están sempre en arquivos S. cando están en forma de biblioteca, pronto a ser incorporado, conexionado - como están no código binario? Jason Hirschhorn: Aceptar. Que - ALUMNO: É sempre o caso para as bibliotecas cando liga-los? Jason Hirschhorn: si. Polo tanto, hai ficheiros, o que será o é. S o código de máquina, que tamén será enigmática para ti. Non se preocupe eses. Pero, xeralmente, si, eles van estar no formato. o arquivos preparados para ir. Estudante: Entón, cando enviar a unha biblioteca, non só enviamos o h. eo. o? Non enviar a. C ou o. S. Jason Hirschhorn: So - e este é neste curto, así como, se esta información parece chegar a pouco rápido. Pero o curto en compiladores fala sobre iso tamén. Cando envía unha biblioteca, se publique o h., o ficheiro de cabeceira, os prototipos de función, ea 1 de e 0 de, iso é todo o que precisa para dar. Non precisa dar a forma na que o función funciona, o arquivo c .. Porque o punto de abstracción, ou o apuntar APIs, o punto neste SPL, a biblioteca portátil de Stanford, é para non se preocupar de como novo GRect funciona, ou como mover obras, ou como engadir obras. Todo o que precisa saber é que add é unha función que se pode usar, e fai iso. Entón, o que realmente non precisa saber como está escrito en C. Só ten sabe, aquí son as funcións, o que facer, e aquí están as de 1 e 0 cando realmente quere usalos. Legal. Máis algunha pregunta sobre compiladores ou doutros temas sobre a tarxeta? ALUMNO: Eu teño unha pregunta de implantación de funcións recursivas. Unha pregunta sobre a recursividade. Eu tiña a sensación de que ía vir cara arriba. Entón, imos rapidamente pasar por recursão cun específico exemplo, unha función factorial. Porque este é un exemplo que moitas veces xorde ou se usa para ilustrar a recursividade. Así, "4" é lido como 4 factorial. E o que 4 factorial significa? O que isto fai? Como calcular 4 factorial? 4 veces 3 veces, 2 veces 1. Así, outra forma de escribir 4 factorial é escribir isto. 4 veces 3 factorial. Por 3 factorial é 3 veces, 2 veces 1. SO 4 veces 3 factorial é 4 veces 3 veces, 2 veces 1. É por iso que factorial é un gran demandante a recursão, porque é claro que non é algo que pasa máis e máis e máis nun menor número de cousas ata chegar ao final. Cando chegar a 1, 1 factorial é 1. Non pode ir moito máis lonxe. 0 factorial tamén é definida como 1. Entón, cando comeza a 1 ou 0, está ao final, e pode comezar a ir para arriba. Entón, se nós quería escribir unha recursiva función para calcular a factorial, imos escribir algún pseudocódigo para iso agora. Antes de escribir que pseudocódigo - Vou dar a vostedes un par de minutos para escribir o código pseudo ou só pensar sobre iso - hai dúas cousas a cada función recursiva precisa. Que son esas dúas cousas? JACK: Ten que identificarse. Jason Hirschhorn: Noah? Oh, Jack. Dalle. JACK: Ten que identificarse. Jason Hirschhorn: Entón unha recursiva función precisa dunha chamada recursiva, unha chamar a si mesmo. Esta é unha. E cal é a outra cousa? JACK: Un caso base. Jason Hirschhorn: Un caso base. Un caso base é, aquí é cando paramos. Polo tanto, a súa función é chamada. O caso base ven en primeiro lugar. Quere saber se está ao final. E se non está no fin, se facer a súa chamada recursiva. E pasar por esta función de novo, comprobar o seu caso base de novo. Se non é o final, fai outra chamada recursiva, et cetera, et cetera. É por iso que funcións recursivas sempre precisa destes casos base e aqueles chamadas recursivas. Se non ten unha chamada recursiva, el non sería unha función recursiva. Se non ten un caso base, ía para sempre e non habería final. E o caso base sempre ven en primeiro lugar, porque vai sempre querer comprobar se está ao final primeira. Entón, antes de facer un pseudocódigo, por que non dea un minuto para pensar sobre como unha función factorial recursiva sería escrito? Ademais, como moitos como está facendo, escrita Lo nunha folla de papel é o que vai ter que facer sobre a proba de mañá. Entón, probablemente, unha boa práctica para facer Asegúrese o código que está escribindo abaixo na folla de papel - ou pode facelo. Vostede sabe onde as comas son. Vostede recorda da sintaxe. Porque non está poder ter unha compilador dicir que fixo un erro. Ademais, ao longo destas liñas, mañá, cando ten problemas de codificación, se está apresurado para o tempo, ou se está moi confuso acerca de como debería escribir a cousa particular en c, é cabería a escribir pseudo-código ou escribir comentarios no ben. ¿Por que non hai crédito parcial a un Moitas das preguntas sobre o quiz. Entón pode ser apresurado, ou só podería ser confundido. Escribindo en comentarios ou pseudo-código son frecuentemente formas que pode obter crédito parcial. Polo tanto, non deixe algo en branco ao cuestionario. Non hai penalidades para poñer as cousas dentro En realidade, poñendo en pseudo-código ou Comentarios axudará o alumno descubrir se realmente sabe o que está falando, e quizais premio lle un crédito parcial para iso. Tamén nese sentido, escribir con claridade. Se non podemos realmente o que está escribindo, Non imos chamalo á medianoite de mañá a figura o que escribiu. Nós só estamos indo para sacar puntos. Escribe de forma clara para que poidamos escoitar, ou mellor, podemos ler o que escribiu. E se el di dúas frases, Non escriba un parágrafo. Siga as instrucións. Escribir de forma clara. E escribir nestes comentarios ou pseudocódigo para cuestións que poderían crédito parcial premio. OK, imos ao factorial. Polo tanto, temos unha función factorial. Se eu fose realmente escribir isto en C, o que eu teño para poñer antes do nome da función? O tipo de retorno, o cal, neste caso, imos darlle int. E, a continuación, dentro das claves, é o que pasa dentro das claves para unha función? ESTUDANTES: tipo de argumento. Jason Hirschhorn: Os seus argumentos. Entón, probablemente, factorial tomar un argumento. El probablemente vai ter só un argumento. E imos dicir que vai levar un enteiro chamado x. E unha vez máis, ao escribir o prototipo unha función ou escribir a función no seu código antes de define-la, escribir o tipo de datos e nome esta variable a só esa función. Así, pode pasar un número a este función, que vai ser referido como x internamente. Temos a nosa función factorial. Necesitamos dúas cousas, un caso base e unha chamada recursiva. Que é o caso base para factorial? Alguén que escribiu-lo e que non ten falado aínda, o que é a base caso para factorial? ALUMNO: Se n é menor de 2, voltar 1. Jason Hirschhorn: Se n é inferior a 2, volver 1. Me gusta diso, porque iso coida de 0 e 1. Entón, imos facer x <2, o retorno 1. Se conseguir pasar 0, se temos pasou 1, esta función voltar inmediatamente 1. Se conseguir pasar algún número maior ou igual a 2, imos temos a nosa chamada recursiva. E entón, como é que vai funcionar? Pode alguén que traballou neste que aínda non teña falado me dar a chamada recursiva para esta función en pseudocódigo? Se conseguir pasar nun número x e é superior a 2, o que que queremos facer? Temos tamén un exemplo escrito no banda que se lle dar unha información. ESTUDANTE: Call x veces o factorial de x menos 1? Jason Hirschhorn: Exactamente. Nós imos voltar x veces o factorial de x menos 1. E iso, aínda que eu escribín, basicamente, o que dixo en inglés, esta función factorial chamarase novo. El vai executar en x menos 1. Vai volver con algún enteiro, e el vai multiplicar estes dous en conxunto, e ese valor será volveu para o que chamou este función factorial, o que pode ser outra instancia do esta función factorial. Así que é un exemplo dun recursiva función, unha moi función recursiva simple. Pero a maioría deles vai ser así. Se desexa un bo recursiva desafío para a proba, proba codificación busca binaria recursiva. Porque se fixo a busca binaria para conxunto de problemas de tres, probablemente o fixo iterativa en un loop while. Pero tamén pode ser escrito de forma recursiva. Vas a necesidade de escribir o seu propio función separada que leva moito diferentes argumentos de liña de comandos - ou nin argumentos de liña de comandos, algúns diferentes argumentos só regulares. Pero pode escribir de busca binaria recursivamente ben. ALUMNO: Entón vostede podería ter escrito tamén, en vez de x menos 1, tamén podería escribir x menos menos, ou podería ter escrito menos menos x. Pode só explicar moi rapidamente porque estes serían cousas distintas, como o que é a diferenza entre x menos menos e menos menos x? Jason Hirschhorn: Non, eu non son vai entrar nesa. Pero vou falar con vostede sobre iso despois clase. x menos menos, menos negativo x diminuír x por 1. Pero eles fan isto un pouco diferente. Pero eu non quero entrar en detalles. Outras preguntas sobre recursão ou esta función? Isto non é realmente mesmo pseudocódigo. Iso é basicamente o código C lle escribiría para iso. OK, calquera outras preguntas sobre temas aquí enriba? É. ALUMNO: Eu teño un rápido resumo punto flotante de precisión e. Jason Hirschhorn: Flotante punto e precisión. Pode alguén realmente rápido déame un resumo de punto flotante e precisión? Todos vostedes tiveron que facelo para o seu conxunto de problemas, de xeito que é todo familiarizado con el. Ou quizais non todos vostedes. Calquera? Dáme un punto de comezar. Punto flotante e precisión. Cal é o problema? Si Vitoria? VANESSA: Vanessa. Jason Hirschhorn: Vanessa. Sentímolo. VANESSA: Hai só un número finito de números que poden ser representados porque está nun na nosa caso, un sistema de 32 bits. Entón medio que ten que facer-se algúns números. Jason Hirschhorn: Entón é iso exactamente correcto. Hai só unha certa cantidade de números que poden ser representados. Se multiplicar dous números moi grandes, pode rebosar a cantidade de espazos que ten de representar un enteiro. É por iso que ás veces usamos un long long en vez de un int. Isto ten máis espazos. Que pode conter un número maior. Punto flotante de precisión ten a ver coa que, aínda que tamén ten que ver co feito de que os números decimais son Non sempre representados. Sentímolo. Deixe-me poñer iso de volta. O número decimal 1.0 non sempre é representado como sería de esperar, 1,000 millóns. Ás veces é representado como 1,000000001 ou 0,999999999. Pode-se incluso 89 xogados en algún lugar. Así, os números decimais non son representado exactamente como faría esperar que sexan representados. Así, no conxunto de problemas - era dous? - conxunto de problemas dous, onde lidamos con números de punto flotante, cando queriamos los para representar exactamente o que queriamos los para representar o número de moedas de un centavo, ou o número de centavos, nós multiplicala los por 100. Nós facemos eles. E, entón, cortar todo detrás do punto decimal. Iso era para garantir que eles ían realmente igual exactamente o que queriamos los para igualar. Porque cando toma algo que é a flotar e transformalo en un int, vostede cortar todo á dereita do punto decimal. Porque hai algún punto flotante imprecisión, 100.000 poderían ser representada como 99,999999999. E se acaba de cortar todo para o dereito de inmediato, vai obter o número incorrecto. É. ALUMNO: Eu tiña unha pregunta sobre o reparto. Que orde ocorre en? Se faría flotar, soportes, 1 dividido por 10, fai 1 dividido por 10, a continuación, obter 0,1, a continuación, chame Lo nun coche alegórico? Jason Hirschhorn: Se fai flotar 1 dividido por 10 - ALUMNO: Si, e, a continuación, é igual a - Ben, sería normalmente telo en igual - É. Quere facelo un coche alegórico, non? Jason Hirschhorn: OK, entón imos usar isto para segue en descubrir as respostas a estas preguntas a través de codificación. Porque probablemente vai ter unha chea de estas preguntas minutos, e unha boa forma para resolvelos los é a través da codificación. Entón, nós estamos indo a codificar iso agora, e entón imos volver e codificar a pregunta que tiña. Así, a primeira liña - Eu non debería ter escrito - o que é o primeiro que queremos facer cando abrir un novo arquivo no gedit? ALUMNO: Engadir. Jason Hirschhorn: Incluír o que? ALUMNO: biblioteca CS50. Jason Hirschhorn: Aceptar. O que máis hai que incluír? Nós só estamos indo para comprobar o que pasa cando publicar algo a unha boia. Pero o que necesitamos incluír, se estamos vai escribir un programa en C? ALUMNO: Estándar I / O. Jason Hirschhorn: stdio.h. Nós realmente non necesita, para este programa, cs50.h, aínda que sexa sempre útil para inclui-lo. Pero sempre necesitamos stdio.h. ALUMNO: Cando a codificación en C? Jason Hirschhorn: Cando a codificación en C. Así que garda-lo como este ficheiro c .. Eu recibín un bo destaque de sintaxe. Escribín baleiro dentro principal. Que o baleiro significa? ALUMNO: Non tomar calquera argumentos de liña de comandos. Jason Hirschhorn: medio baleiro, neste caso, o principal non se argumentos de liña de comandos. Noutros casos, isto significa que a función non leva argumentos de liña de comandos. Ou a función, se eu fose escribir baleiro main (void), que diría principais do non devolver nada. Entón baleiro só non significa nada. O que eu ía escribir, se eu fose ter argumentos de liña de comandos? ALUMNO: int arco c corda do arco v Jason Hirschhorn: int argc argv cadea. É iso mesmo? ALUMNO: É carac soportes estrela argv. Jason Hirschhorn: Entón vostede podería escribir soportes de corda argv ou char estrela argv corchetes, pero ten que dos corchetes. Porque argv é un array de cordas, lembre-se. Non é só unha cadea. Entón corda argv é, aquí está unha corda chamado argv. Soportes de Cordas argv é, aquí está unha matriz de cadeas. Entón int argc argv soportes cadea sería algo que me probablemente escribir. Entón quería gardar nun enteiro? ALUMNO: Si, enteiro. Ou, nun coche alegórico. Jason Hirschhorn: Nunha boia? Como, float x é igual a 1 dividido por 10. Jason Hirschhorn: Aceptar. ¿Como imprimir un float en printf? O que? ALUMNO:% f. Jason Hirschhorn:% f. ¿Que é un número enteiro? d ou i. ¿Que é unha cadea? ALUMNO: s. Jason Hirschhorn: s. ¿Como obter unha nova liña? ALUMNO: barra invertida n. Jason Hirschhorn: Que eu retorno se principal é executado correctamente? ESTUDANTE: 0. Necesito escribir esta liña, aínda que? ALUMNO: Non OK, non imos escribilo lo, entón. Calquera pode ler isto? Parece un pouco pequeno. Todos poden ver, ou debería Eu facelo máis grande? Creo que para a cámara, imos facer un pouco máis grande, con todo. Jason Hirschhorn: Se eu quero converter este . C arquivo nun arquivo executable, o que que eu escriba? ESTUDANTE: Fai proba. Jason Hirschhorn: Sentímolo? ESTUDANTE: Fai proba. Jason Hirschhorn: Fai proba. Estabamos falando sobre esta liña anterior. Clang. ¿Que hai de bumbum? O nome do compilador. Que é esa liña? ALUMNO: Establece-lo para o seu uso de GDB. Jason Hirschhorn: Establece Lo para o seu uso de GDB. Esta liña, que é isto? ALUMNO: O código fonte. Jason Hirschhorn: Ese é o ficheiro de orixe, o arquivo c .. Que estas dúas liñas de facer? Ou estes dous non liñas. ALUMNO: It nomes que probar. Jason Hirschhorn: Entón o guión o di, nomealo algo diferente. E aquí está chamando-o de proba. Se eu non teño iso en, o que sería o nome diso? ALUMNO: a.out. Jason Hirschhorn: a.out. O que isto fai? ALUMNO: Ligazóns da biblioteca matemática. Jason Hirschhorn: Liga a biblioteca matemática. Non incluír a biblioteca de matemáticas, pero xa que é tan común, teñen make escrito para incluír sempre a biblioteca de matemáticas. E do mesmo xeito, iso inclúe a biblioteca de CS50. OK, entón se alistar, agora temos un executábel chamado proba. Para executalo, eu escriba proba. Vexo que o meu punto flotante, como se esperaba, é igual a 0. Será que iso - so - Estudante: Entón, se pór flotar o momento, como lanzalo como float - Jason Hirschhorn: Intérpretes o 1 a unha boia? ALUMNO: Non, tire a cousa completa - si. Se acaba de facelo, non que facelo de 0,1? Jason Hirschhorn: OK, entón moi rapidamente, 1 dividido por 10, son enteiros sendo dividido. Entón, cando dividir enteiros, son 0, e se está salvando que 0 nun flotar, xa que a barra está só división enteira. Entón agora estamos transformando algo nun coche alegórico. Imos ver o que acontece. Nós imos facer exame. Entón, agora podemos ver que este corte non era división enteira, estaba flotando división punto. Porque un dos seus argumentos fora convertido nun float. Entón, agora estaba dicindo, tratar esta división como estamos lidando con Os puntos de flotación, non con números enteiros. E, así, obter a resposta que esperamos. Imos ver o que pasa - oops. Se eu quixese imprimir máis decimal manchas, como eu podería facelo? ALUMNO: Punto punto f, ou como moitos cifras decimais que quere. Jason Hirschhorn: Entón eu imprimir 10 puntos decimais. E agora vemos que estamos recibindo algunhas cousas estrañas. E iso vai voltar á súa pregunta preto de punto flotante imprecisión. Hai cousas estrañas gardados aquí. OK, iso responde a súa pregunta? Que máis queres para codificar rapidamente? ALUMNO: Eu só quería ver se ou non, se liberou algúns punteiro, se ese punteiro aínda tiña almacenado no que o enderezo que fora apuntando anteriormente. Jason Hirschhorn: OK, entón imos facelo. Char PTR estrela, iso crea unha variable chamado PTR do tipo char estrela. ¿Como escribir malloc? Alden? ALDEN: Só malloc. Pero, entón, ten que ser o tamaño, e neste caso, eu creo que estar apuntando para char. Así, sería de char. Jason Hirschhorn: OK, entón máis xenericamente, Dentro - imos editar. Dentro malloc, quere que o número de bytes na pila. Xeralmente, o que vimos que estamos facendo é que estamos indo a malloc cadeas, por exemplo, ou matrices de enteiros. Polo tanto, se queremos 10 enteiros, ou 10 caracteres, 10 daranos 10. E, a continuación, tamaño de caracteres daría nos de que o tamaño de caracteres, que na Neste caso, é de 1 byte. Estivemos con 10 bytes. Se fósemos escribir tamaño int, que nos daría 40 bytes. Entón, máis xenericamente, dentro malloc é o número de bytes que quere. Neste caso, estamos a recibir un byte. Que parece ser un uso estraño de malloc, pero para o noso propósitos ten sentido. Polo tanto, non é iso. Imos chamar libre. Nós se librar del e usamos PTR novo. E o que quere comprobar? ALUMNO: Eu só quería comprobar se houbo ou non calquera cousa no interior do mesmo. Jason Hirschhorn: Entón, se sinalou algo? ALUMNO: Si, exactamente, se el aínda tiña un enderezo de memoria. Jason Hirschhorn: Entón quere para comprobar o valor do PTR? ALUMNO: Si, exactamente. Jason Hirschhorn: O que eu escribo aquí se eu queira comprobar o valor do punto - o que é, en Xordania Dito isto, o valor? Ou o que é almacenado dentro do PTR? ESTUDANTE: Este enderezo de memoria. Jason Hirschhorn: Este enderezo de memoria. Entón, se eu escriba só iso, que vai dáme o valor de PTR. E como fago para imprimir unha dirección de memoria? Cal é a cadea de formato a un enderezo de memoria? ALUMNO:% p. Jason Hirschhorn:% p. % S é unha cadea. % N para punteiro. É iso mesmo? Iso é certo. Entón PTR coincide - aínda ten algo no mesmo. Este é probablemente un maior pregunta interesante. Que esta liña fai? ALUMNO: Lun fallos. Jason Hirschhorn: O que? ALUMNO: Coido que SEG fallos. Jason Hirschhorn: Hm? ALUMNO: Eu creo que vai SEG culpa. Jason Hirschhorn: Entón esta liña de código, estrela PTR, o que que a estrela significa? ESTUDANTE: Contido. Jason Hirschhorn: Yeah. Ir para o contido de. Polo tanto, este está indo a ir á memoria dirixir alí e me dar iso. Adoitaba% c certo aquí, porque hai son personaxes almacenados alí. Entón, nós estamos indo a ir a que enderezo acabo de ver - ou probablemente vai ser un pouco agasallo diferente xa que executar o programa. Pero imos a este enderezo que sabemos que aínda existe e ver o que está aí. Entón non SEG culpa. El só non nos deu nada. El podería realmente nos deu algo, nós só non podemos velo. E iso vai volver a esta idea - e nós non imos conseguir moito en iso, porque iso é ademais da alcance deste curso. Pero falamos aquí, se nós foi alén dos límites da matriz por 1, podemos non estar en apuros. Ás veces, cando acaba de saír por 1, está facendo algo mal, e podería estar en apuros. Pero non sempre terá problemas. Depende de canto de algo malo lle non, vai estar en apuros. O que non quere dicir, ser desleixado co seu código. Pero é para dicir que o programa non sempre desistir, mesmo se ir a algún lugar non debería ir. Un bo exemplo do que é, unha morea de persoas no seu conxunto de problemas 3, que tiña 15 anos, non se comproba a límites da tarxeta. Entón mirou á esquerda, mirou para o dereita, mirou cara arriba, mirou cara á parte inferior. Pero non comprobar a ver se o cumio foi realmente será na tarxeta. E unha morea de persoas que fixeron iso e virou-se que en, o seu programa funcionou perfectamente, porque sempre que este era almacenados na memoria, se fose un anterior, ou Comprobarase que a memoria enderezo, non había nada particularmente horrible sobre iso, para que o seu programa non era vai berrar con vostede. Pero aínda ía despegar puntos se non comprobar iso, porque estaban facendo algo que non estaba debería facer, e que podería ter ficar en apuros. As probabilidades son, con todo, probablemente non o fixo. Entón, iso é para demostrar que, si, aínda podemos ir a el. E nós non imos a problema neste caso. Se tentásemos facer ler a próximos 100 caracteres, teriamos probablemente terá problemas. E pode codificar a ler o seguinte 100 caracteres, se o desexa, facendo algunhas especie de loop for. É. ALUMNO: Dende que foron asignados que espazo un valor real, non teriamos realmente ser capaz de ver nada. Debemos tratar coa creación que igual a gustar c ou algo así? Jason Hirschhorn: Gran pregunta. ¿Como configurar este valor - que liña de código que eu escriba na liña sete para facer o que dixo? ALUMNO: Estrela PTR iguala único Cita c acabar aspas. Jason Hirschhorn: Para que está poñendo un personaxe, c, naquel lugar, porque unha vez máis, que a estrela significa ir máis alá. E cando se usa á esquerda do un operador de asignación, que é igual a asinar, nós non imos conseguir que valor tanto como se indica ese valor. Agora imos ver o que acontece. Poñemos algo alí e foi alí. Chamamos libre. Algunhas cousas probablemente aconteceu na pila. Polo tanto, non é máis alá. Pero, de novo, non estamos a recibir en apuros para ir alí. Estou facendo isto en código para ilustrar que moitos destes preguntas que ten, son realmente interesante responde a unha chea de tempo. E eles están realmente boas preguntas. E pode entendelo-los en seu propio, se, por exemplo, Non estamos na sección. É. ALUMNO: Por que non está enviando o punteiro en calquera lugar, ten que de usar malloc? Jason Hirschhorn: Entón, que vai volver á súa pregunta inicial. [? ?] É só unha variable local? Malloc aquí non é que convincente. O uso de malloc aquí non é que convincente por que é só unha variable local. ALUMNO: Entón vostede podería facer de char estrela PTR coincide Ola? Jason Hirschhorn: Ah. Entón, imos agora volver á súa pregunta inicial. Eu creo que non estaban satisfeitos coa miña resposta. OK? Así? ESTUDANTE: Yeah. Espera. Jason Hirschhorn: E onde que quere imprimir? Entón, imos imprimir unha cadea así? ESTUDANTE: Interesante. Jason Hirschhorn: Entón, iso di que esta argumento ten o tipo de carácter. Polo tanto, este debe ser un personaxe. ALUMNO: só ten o primeiro. Jason Hirschhorn: Entón iso é o que eu dixen antes. Como dixen, non está almacenando o corda dentro punteiro variable. É o almacenamento - ALUMNO: O primeiro valor da cadea. Jason Hirschhorn: O enderezo de o primeiro valor da secuencia. Se tivésemos que imprimir iso, estamos quedando o valor dentro do punteiro. E imos ver que é, de feito, unha dirección de memoria. Será que isto ten sentido? Sentímolo. Espera, iso responde á súa cuestión, aínda que? ESTUDANTE: Yeah. Jason Hirschhorn: Esta liña de código é creando unha cadea e logo outro punteiro variable que está a apuntar para esa secuencia, esta matriz. É. Estudante: Entón, se nós fomos unha memoria afondar, se chegamos a horas? Foi almacenado como unha cadea? Jason Hirschhorn: Como, nós fixemos - polo que este é valioso para facer. Este é o punto de aritmética, que vostedes teña visto antes e debe ser relativamente cómodo. Isto é semellante a escribir - se fósemos escribir esta liña de código, vimos a notación de matriz antes. Isto debería dar a segunda valor neste array, h. Se fixésemos iso, iso tamén debe dar nós o segundo valor do array. Porque non vai á memoria enderezo do primeiro, pero o enderezo de memoria da que se acabou. E entón os dereferences operador estrela ese punteiro. E unha vez máis, imos ver. Recibimos h novo. ALUMNO: Que fai dereference significa? Jason Hirschhorn: Dereference é unha palabra chique para ir. Ir a iso e conseguir o que está aí é para eliminar a referencia dun punteiro. É só unha palabra chique para iso. ALUMNO: Si quixésemos imprimir a corda toda, poderiamos facer punteiro e comercial? Jason Hirschhorn: OK, estamos vai facer unha pausa aquí. Imos rematar aquí. Ampersand dálle a dirección dun situación, por iso, cando fai comercial de unha variable, que lle dá o enderezo onde a variable está almacenada. Punteiro ampersand lle dará a enderezo de onde PTR PTR está na memoria. Non estamos indo para ir en con este exemplo. Pode descubrir estes as cousas por conta propia. Pero, de novo, isto pode ata ser unha beirando pouco máis do que precisa saber para o ámbito do presente intercalar - ou esta proba, mellor dito. Sentímolo. Imos seguir adiante, porque eu faría quere facer un problema de codificación antes de tempo é superior. E nós estamos indo a codificar o que eu penso é a máis convincente delas exemplos, atoi. Polo tanto, esta foi unha pregunta sobre un quiz, hai dous anos. E eu teño iso no consello aquí. Persoas foron convidados para o exame - recibiron un pouco máis en tesxt a pregunta, pero eu eliminou o texto, porque non era necesario para os nosos propósitos agora. Foi só algunhas fondo en que atoi fixo. Pero todos saben e son moi familiarizado con atoi. Suxiro que este código sobre unha folla de papel. Suxiro tamén que usar a estratexia que xa sabemos moito na nosa sección. En primeiro lugar, asegúrese de comprender atoi que está facendo. Fai un debuxo ou chegar a algún imaxe mental do que na súa cabeza. A continuación, escriba o pseudocódigo para iso. O cuestionario, se todo o que recibe é pseudocódigo, polo menos poñer algo para abaixo. E, a continuación, mapear este pseudocódigo para C. Se tes un cheque no seu pseudocódigo, como comprobar se algo é 1, que mapea a un caso estado e así por diante. E, finalmente, o código do programa en C. Entón volva para atoi e levar cinco minutos a este código nunha folla de papel, que é, probablemente, sobre a cantidade de tempo que levaría a unha quiz para atoi código. Cinco a 15 minutos, de cinco a 12, a cinco 10 minutos, é a cantidade de tempo que gastaría neste pregunta no cuestionario. Entón, levar cinco minutos, por favor. E se tes algunha dúbida, plantexa súa man e eu vou chegar preto. [Conversas paralelas] Jason Hirschhorn: OK, entón que foi de cinco minutos. Esta foi, probablemente, sobre a cantidade de tempo que gasta en que, nunha proba, quizais a baixa final da época. Imos recapitular un pouco. Imos comezar a programar iso. E se nós non temos todo o tempo, as respostas a este e este cuestionario cuestión están dispoñibles, unha vez máis, Outono de 2011 é cando esta pregunta apareceu no quiz. E valeu a pena de oito puntos a continuación, o cuestionario. Oito puntos é na parte alta da cantidade de puntos de algo paga a pena. A maioría das preguntas están na franxa de un a seis puntos. Polo tanto, esta é unha máis reto pregunta, con certeza. Alguén me pode falar? Xeralmente, o que imos querer facer con esta funcionar atoi, loxicamente? O que queremos facer? Entón imos escribir algúns pseudocódigo. ESTUDANTE: Converter caracteres en números enteiros. Jason Hirschhorn: Converter caracteres en números enteiros. Aceptar. Entón, cantos personaxes somos nós vai ter para pasar? ALUMNO: Todos eles. ALUMNO: Todos os personaxes na secuencia. Jason Hirschhorn: Todo caracteres na cadea. Entón, se nós quería pasar por todos os carácter nunha cadea, o que é unha cousa en C vimos que permitiu nós que pasar por todos os carácter nunha cadea? ALUMNOS: Un loop for. Jason Hirschhorn: Un loop for. Entón, nós estamos indo a percorrer cada personaxe en s. Entón, o que imos querer facer cando temos un personaxe específico? Digamos que se está pasou a 90. Estivemos coa 9. É un personaxe. O que queremos facer con que o personaxe 9? ALUMNO: restar carácter 0? ALUMNO: Engadir 0? Jason Hirschhorn: Restar lo do carácter 0? ESTUDANTE: Yeah. Jason Hirschhorn: Por que quere facer isto? Estudante: [inaudível] valor. O seu valor int. Jason Hirschhorn: OK, entón tomamos o carácter 9, subtrai-lo a partir de carácter 0 para obter unha enteiro real 9. Doce. E como vostede sabe que o personaxe 9 menos 0 personaxe é 9? O gráfico que mirar? ALUMNO: Hai nove loxicamente lugares entre 9 e 0. Ou pode ollar para a táboa ASCII. Jason Hirschhorn: táboa ASCII. Pero si, está correcto tamén. Entón subtraímos 0. Polo tanto, agora temos o enteiro 9. E o que queremos facer con iso? Se temos 90, é o primeiro número enteiro temos, o que queremos facer? ALUMNO: Eu colocaría nun enteiro temporal matriz, a continuación, facer a matemática para el máis tarde para facelo en un fin. Jason Hirschhorn: Aceptar. ALUMNO: Pode comezar a finais de a matriz e, a continuación, seguir adiante así que cada vez que se move cara adiante, vostede multiplicala lo por 10. Jason Hirschhorn: Aceptar. Isto soa como unha fermosa idea atractivo. Podemos comezar a finais da nosa matriz, e podemos utilizar strleng. Podemos usar strleng aquí. Imos obter a lonxitude da nosa cadea. Comezamos ao final. E o primeiro, só levamos iso enteiro, e quizais creamos como unha nova variable enteira enriba onde estamos almacenando todo. Entón, nós loop través de cada carácter en s de tras para a fronte, subtraímos 0, e entón imos leva-lo, e en función da onde está, nós multiplicala lo por unha potencia de 10. Como o primeiro, que é o que imos multiplicar o carácter máis á dereita por? ALUMNO: 10 ao 0. Jason Hirschhorn: 10 a 0. O que queremos multiplicar a segunda máis á dereita de carácteres por? Estudante: [inaudível]. Jason Hirschhorn: O que? ALUMNO: 10 a 1. Jason Hirschhorn: 10 para o 1. O personaxe terzo máis á dereita? ALUMNO: 10 a 2. Jason Hirschhorn: 10 para o 2. ESTUDANTE: Sentímolo, eu non entendo o que estamos facendo aquí. Jason Hirschhorn: OK, Imos volver, entón. Entón, nós estamos indo a obter aprobada nunha cadea. Porque estamos escribindo atoi. Por iso, son pasadas nunha cadea. Digamos que se está pasou na secuencia de 90. O primeiro que imos facer é definir unha nova variable enteiro que somos só vai crear como o noso novo enteiro. Iso é o que imos para volver ao final. Necesitamos pasar por todos os personaxes a corda porque temos determinado que necesitamos para tocar cada un e logo engadir lo ao noso novo enteiro. Pero non podemos simplemente engadir lo como un número. Non podemos coller e 9 engadir 9 ao noso enteiro. Depende de que lugar é na cadea. Nós imos ter que multiplicar el por unha potencia de 10. Porque é así que 10 obras de base. Entón, nós estamos indo a obter o real personaxe, ou o número enteiro real número, por carácter 0 subtraindo de carácter 9 como fixemos con subtraindo capital carácter Desde todo o que personaxe que tiña nun dos estes problemas. Entón, imos realmente ter un número de 0 a 9 gardados como un número real, e nós imos multiplicala lo por unha potencia de 10, dependendo de onde estamos na corda. E entón nós imos engadir lo de volta na nosa nova variable enteira. Entón, o que sería algo así como faría ser - imos chamar aquí. Se conseguir pasar na secuencia de 90 - Estudante: [inaudível]. Jason Hirschhorn: Pero atoi recibe unha cadea. Entón imos pasar por da explotación. Imos ter pasado en 90. Nós imos na parte de atrás para adiante. Tomamos a 0. ALUMNO: Eu sinto moito. Quizais iso é estúpido. Se estamos a ser aprobada nunha corda, por que é de 90 o que estamos pasou en? Porque 90 é un enteiro. Jason Hirschhorn: Por atoi leva un cadea e transforma-lo en o enteiro representación desta cadea. Pero a corda 90 non é o número enteiro 90 ou o número 90. A secuencia de 90 é un conxunto de dous ou tres personaxes, ao contrario, a 9 carácter, o personaxe 0, e a barra invertida 0 personaxe. E nós estamos escribindo atoi porque, por exemplo, cando toma o mando argumento de liña, e grávase en argv, gárdase como unha cadea. Pero se quere trata-lo como un número, ten que convertelo en un enteiro real. Que fixemos un dos nosos conxuntos de problemas. Que fixemos nun número dos nosos conxuntos de problemas. Todo o mundo que tivo un número enteiro como un argumento de liña de comandos. É por iso que a nosa función atoi recibe unha cadea. Entón, de novo, no noso exemplo aquí, estamos vai tomar o último. Estamos indo a restar o carácter 0 del, porque os personaxes 0 subtraído polo personaxe 0 dálle o número real de 0, segundo a a matemática ASCII que facemos. Como os carácteres son representados como diferente do que o real - o carácter dun, por exemplo, minúsculas é un 97. Non é - oops! Non é o que esperar que sexa, 0, por exemplo. Entón tes que restar o carácter dun para chegar a 0. Entón, imos facelo aquí para obter o número real. E entón nós estamos indo a multiplicala lo por unha potencia de 10, dependendo de onde é na cadea, e despois tomar ese e engadir lo ao noso espazo reservado variable, para que poidamos chegar a noso enteiro novo final. Será que ten sentido para todos? Entón, nós non estamos indo a este código agora, porque estamos ficando en curto tempo. Pido desculpas polo tempo do que iso. Pero iso é o que, esperamos, faría ser capaz de facer o cuestionario - no moito menos, obter este pseudocódigo escrito. E entón, se fósemos escribir o pseudocódigo, en realidade, poderiamos facelo moi rapidamente. Cada liña de comentarios que escribimos aquí se traduce en preto de unha liña de código C. Declarando unha variable nova, escrita un loop, algúns resta, algúns multiplicación, e algúns asignación. Nós probablemente tamén queren escribir unha liña de retorno. Tamén pode querer poñer algunhas comprobacións aquí. É. ALUMNO: Entón podemos tratar s como a secuencia real? Porque sei que é só un enderezo. Como, como obter a lonxitude de a corda que está a ser pasado a través de? Jason Hirschhorn: Entón, como é que a lonxitude dunha corda? Strlen. ALUMNO: strlen, si. Pero pode pór s como o argumento para iso? Jason Hirschhorn: Entón strlen leva unha estrela de char. E segue-se que a estrela char, e mantén a conta ata que se chega a un barra invertida 0. strlen era realmente un dos programas que ían código. Esta é outra boa para código. Este é un pouco máis fácil, porque se vai pensar sobre iso conceptualmente - Eu só dixen en voz alta - strlen segue un punteiro e segue indo e contar e manter o control ata chegar a unha barra invertida 0. ALUMNO: OK, entender. Jason Hirschhorn: Entón, o mellor de sorte na proba 0 mañá. Se ten algunha dúbida, eu vou estar fóra despois desta. Sinto-se a liberdade de me e-mail. Estenda a man para o seu propio TF se é non na miña sección, ou buscar o meu enviar correo-e, se quere. Se queres brotes e pode enviar me un e-mail, unha mensaxe freakout, vou mandar de volta, así como, un rostro sorridente, ou, tipo, unha broma ou algo así. Entón, sexa a vontade para facelo tamén. Boa sorte unha vez máis, e eu vou ver todos vostedes a próxima semana.