[Música tema] COLUNA 1: Olá, todos. Bem-vindo de volta à seção. Belo dia out-- que é por isso, eu sou certeza, existem apenas quatro de vocês aqui e não o nosso pacote de costume. Eu tenho estado doente neste fim de semana. Então, eu não tenho Starburst para vocês. E eu posso começar a tossir terrivelmente ao longo deste. Então, só tenha paciência comigo. Vou realmente tentar e passar por isso em primeiro lugar, porém, antes de eu ter um ataque de tosse. Mas apenas ser fácil para mim um pouco bit-- isso é tudo que eu peço. Portanto, a nossa agenda para today-- apenas um reminder-- seu teste é na próxima semana. Eu disse que isso na semana passada por isso não iria pegar você desprevenido. Então, eu estou lembrando de novo. Na próxima semana o seu quiz. Para esse fim, próxima semana seção será muito mais de-- eu vou tentar e trabalhar em alguma revisão. Então, se vocês poderiam me ajudar enviando-me coisas que você está confortável com, que você está preocupado, temas que você gostaria de me cobrir, isso seria ótimo. Então, eu posso tentar trabalhá-los em nossa seção na próxima semana ou enviar-lhe material extra ou prep que você não pode obter em outro lugar. Yeah! Mais pessoas estão chegando! Eu pensei, eu fiz isso mal passado semana, que ninguém quer voltar? Estou com medo. Assim, os outros três coisas que nós vamos passar por cima de são redirecionamento, arquivo I / O, e em seguida, ponteiros e memória dinâmica. Tenho certeza que você é tudo super animado sobre pointers-- tema favorito de todos, tão simples de entender. Tenho certeza que vocês todos tem isso, certo? Assim, as primeiras coisas primeiro, redirection-- este é basicamente apenas uma maneira para controlar como você entrada as coisas em seu programa, como você as coisas de saída de seu programa. As principais formas que vocês Foram interagir com ele é só por fora padrão com sua tela de impressão aqui. Mas existem maneiras de pipe-- como vemos aqui é um de nossa espécie palavras-- de tubo que a informação ou que os dados em um arquivo de um arquivo. É apenas maneiras diferentes de fazer as coisas em seu programa e fora de seu programa, em vez de apenas imprimi-los a esta tela ou introduzir coisas a partir da linha de comando. Então, primeiro é pouco maior do acento circunflexo. Então output-- ele só imprime a saída para um arquivo em vez de sua tela. Então, se você tinha algo que impresso "Olá, mundo!" para a tela, se você colocá-lo em vez para output.text, que cria esse arquivo chamado output.text. E quando você abri-lo, ele vai dizer "Olá, mundo!" lá dentro. Isto pode ser útil super se você tem uma tonelada de erros na verdade, como podemos ver em um presente. Se você fizer dois circunflexo, ele vai imprimir as mensagens de erro. Então, se você está tendo um problema com compilação, ele tem um monte de erros e você está ficando atolado na tentativa para percorrer em sua linha de comando através de todos eles, você pode apenas imprimi-los em um arquivo, abrir esse arquivo para que você pode percorrê-los mais fácil. Eu realmente usado que um muito quando eu estava depurando meus 181 Série de Exercícios para aprendizado de máquina. Por isso, pode ser super útil mais adiante. Também é útil se você tiver um programa de talvez que está a gerar uma biblioteca ou gerar algum conjunto de cordas, e você precisa de ser capaz de ver que está gerando-los corretamente. Esta é a maneira de fazer isso. Então, se você imprimi-los em um arquivo, você pode mais facilmente examiná-los, certo? Versus tentando deslocar através de sua linha de comando. E então uma coisa a notar é que, com apenas o maior do acento circunflexo, se você está escrevendo para um arquivo que já exists-- assim como se nós corremos este o primeiro tempo, colocá-lo para output.text, e depois tivemos um segundo programa que imprimiu isso como programa de dois e fez um maior do que a output.text, ele substituirá isso-- assim substituir o que foi sempre em esse arquivo para começar. Então, se você deseja anexar em um arquivo, como vemos aqui, você acabou de fazer dois sinais de maior que. E vai anexar a ele. Não vai substituí-lo. Então, se você precisa executar múltiplos programas e tipo de manter a par do que todos eles são retornando para você em um arquivo, isso é uma maneira de fazê-lo. Se você não se importa o que está em seu arquivo e é permitido para ser substituído, você pode apenas usar um único maior do que. Isso faz sentido para todos? AUDIÊNCIA: Como ponto barra Olá maior de texto de saída do ponto, como duas vezes, ele só vai mostrar apenas na saída texto dot um segundo tempo-- COLUNA 1: Certo. Por isso, seria basicamente apenas completamente substituir o que estava lá para começar. Se este arquivo aqui, o output.text já existe, basicamente, o que você chamá que novamente com um único maior que você pode apenas pensar nisso como como ele substituiu o arquivo. Como quando você está salvando uma Palavra documento e você salvar como, e você manter o mesmo nome, e ele substitui completamente ele-- este é o mesmo tipo de coisa. Alguém tem alguma dúvida sobre apenas a saída para um arquivo? Impressionante. Então, obviamente, se você inverter a arrow direção, ele pode fazer de entrada. Então, quando vocês tinham como César ou Visioneer e você tinha que entrada de alguma coisa, você tinha um argumento de linha de comando que, na verdade, introduzi-la. Esta é uma outra maneira de fazer isso. Então, em vez de esperar para um prompt de comando, como quando você pediu para o seu mensagem em César ou Visioneer, se você tivesse um arquivo de texto que teve a sua mensagem, você pode simplesmente digitá-lo para isso. Então, se isso fosse como ponto barra César 3 menos do que o texto de entrada flecha, que é a sua mensagem, que iria correr bem. Quando seu programa César realmente pediu a entrada do usuário, ele já teria porque você digitou neste arquivo. Isso é apenas uma outra maneira. Apenas um reverso da output-- Apenas a entrada para seus dados. E, em seguida, o último é um tubo. Então, de um presente muito legal. Porque ele permite que você levar a saída de um programa e colocá-lo como de entrada para outro programa. Eu não sei se algum de vocês jogado com o decifração CS50 que pode ter deu, mas seria permitir que você tome alguma amostra arquivo, digite-o em sua criptografia, e, em seguida, a partir daí tipo que em sua descriptografia para se certificar de que acabou o mesmo. Então, é tipo como laço de três vias. Vá em frente. AUDIÊNCIA: Se um programa tem múltiplas entradas, há uma maneira de contá-la que entrada usar o arquivo de texto ou a saída para? COLUNA 1: Ele tem várias entradas. Seja qual for o seu arquivo input-- quando é pedindo entrada que pela primeira vez, é vai assumir, eu acho, é vai tubo em todo o arquivo. Então se você tem várias entradas, você está vai ser tubulação em vários arquivos. Então, se você está pedindo mensagens três vezes em seu código, você vai estar colocando em três ficheiros diferentes. E ele fica louco. E você não deve ter que se preocupar com isso agora. Mas essa é a idéia. Então, sim, a tubulação é apenas saída de um programa utiliza a entrada para a outra. Todos bom lá? Legal. Está bem. Você provavelmente não terá fazer muito com ele. Mas você deve entender maneiras que você pode usar isso. E existem alguns casos em que você pode querer usá-lo. Então arquivo I / O- Eu sei o que você está dizendo-- que estamos acostumados a ler a partir de e escrever a nossa tela de lá, que é padrão e padrão para fora. E isso é o que vocês têm sido fazendo desde o início da aula aqui. Mas você também pode ler e gravar arquivos, que é tudo o arquivo I / O- assim arquivo de entrada, saída é tudo que ele representa. Então isso significa, basicamente, que você pode armazenar seus dados agora. Quando você apenas imprimi-lo para o tela, é basicamente ido embora, certo? Assim que você faz "Olá mundo "e executar" Olá, mundo " ele imprime "Olá, mundo" para a tela. Mas você realmente não pode fazer nada com ele de lá. Se você armazenar em um texto arquivo, em seguida, de repente você tem esses dados que você está autorizado manipular ou colocá-lo em um arquivo, ou colocá-lo em um programa mais tarde. Uma das razões por que fazemos isso é apenas como uma maneira de armazenar os dados para utilização posterior. Eu tenho um par de passos aqui apenas andando por padrão I / O. Na etapa um, você precisa criar uma referência para o arquivo com todos tampas de arquivo Arquivo estrela. Assim que cria um apontador para um ficheiro. Então você deseja abri-lo. E você diz, literalmente, apenas arquivo é igual a fopen. E isso vai voltar a Ponteiro para o arquivo que você acabou de abrir. Eu vi um par de você caras no horário de expediente. Mas uma das coisas é ponteiros recorde-- pode ser algum endereço ou nulo, certo? Se alguma vez ter um caso em que algo pode retornar nulo, o que temos que fazer antes de nós nunca usá-lo? Precisamos verificar se é nulo ou não, certo? Porque alguns de vocês podem ter tido o problema em que qualquer objeto estava sendo devolvido em fuga foi nula. Você tentou executar alguma função nele. E o seu site computador falha. Certo? Aposto que um par de você pode ter tido esse problema. Assim, com fopen, fopen vão quer retornar um ponteiro para o arquivo, ou se algo der errado, ele vai retornar nulo. Assim, você sempre precisa verificar que não tenha retornado nulo antes de tentar fazer qualquer outra coisa. Isto é como um paradigma padrão que você vai precisar aqui. Se há sempre uma chance de que algo poderia retornar nulo, certifique-se de que não antes de prosseguir. Caso contrário, você vai para obter falhas local lindo. E ninguém gosta de lidar com aqueles. Assim como vemos aqui, o primeiro argumento é apenas o caminho para o arquivo. Se esse arquivo não existir, que vai criar esse arquivo. E isso só vai ficar em branco. E, em seguida, o segundo argumento é o modo que você deseja. Não queremos ler a partir deste arquivo? Você quer escrever a partir dele? Você quer acrescentar? Então, na verdade o que acabei de disse- se o arquivo não existe e você está tentando ler ele, que vai lançar um erro. Se o arquivo nome-- gostar se não file.text não existe ainda e você quer escrever para ele, ele criará um arquivo em branco chamado file.text para você. E se você deseja anexar, você deve fazer a mesma coisa. Será que isso faz sentido? Se você está tentando ler um arquivo que ainda não existe, ele vai lançar um erro. Caso contrário, ele irá criar o arquivo para você fazer o que quiser com ele. Legal. Agora podemos ler a partir do arquivo. E esta é apenas uma espécie de ir através dos diferentes funções que temos de arquivo I / O. Esta vontade ser necessária em pset desta semana, se bem me lembro. Sim, é absolutamente será necessário pset desta semana. Então fgetc retorna o próximo caractere. fgets retorna apenas uma linha de texto. Ele irá retornar qualquer coisa até uma nova linha, e ele vai quebrar. Assim fread lê um certo número de bytes e os coloca em uma matriz, que é algo que você pode quer fazer com re-size-- pode ser útil. Quantas pessoas têm lido a especificação pset, pelo caminho? Está bem. [Inaudível] COLUNA 1: OK. Tudo certo. Definitivamente ler isso-- é um pset divertido. Você começa a recuperar a memória excluídos card-- realmente emocionante quando ele funciona. Mas, definitivamente, começar a ler isso. Venha falar comigo, se você tiver dúvidas sobre isso. OK, então como eu estava dizendo, fread lê um certo número de bytes. Isso é um número arbitrário que você está indo para definir. E então fseek apenas movimentos para uma determinada posição. Então, talvez você não se importa sobre os próximos 10 bytes. Você só quer pular. Você não se importa com aqueles. Você quer ler byte a partir de 11. fseek permite que você faça isso. Então, ele permite que você seja seletivo sobre o que você está lendo. Porque fgetc, fgets e fread leitura a partir de um determinado lugar no arquivo. Uma maneira de pensar sobre isso é se esta é o nosso arquivo, quando você abri-lo, você tem essa posição no arquivo que começa no início. Sempre que você chamar fgetc, fgetf, ou fread, ele vai começar a partir de este marcador de posição. Vamos dizer que você só quer ler este pedaço de memória aqui. Você não pode simplesmente ligar. Você tem que procurar por aqui e, em seguida, ler a partir daí ou ler, fica, ou getc, dependendo do que você quer. Então procure apenas permite que você pular partes da memória. E essa é a única forma, você pode pular as coisas sem lê-los em seu buffer. Isso faz sentido para todos? Obviamente, há uma monte de aqui- paralelo nosso redirecionamento de saída ou de entrada, você ler e escrever. Então fputc apenas escreve um caracteres para o arquivo. fputs escreve uma linha. Fprintf imprime uma saída formatada. Então se você tem abas, ou espaço, ou outros enfeites. E então fwrite escreve alguns matriz de bytes em um arquivo. Portanto, este é o mesmo caminho fwrite e fread são análogas fgets opposites--, fputs, e em seguida, os lotes fputc e fgetc-- de loucos, coisas rápidas. Apenas uma espécie de manter este handy-- você vai ter momentos diferentes onde talvez você só quer um carácter de cada vez. Talvez você quer uma linha inteira. Com seu pset-- dicionário que é em dois Série de Exercícios, Eu acredito, nós damos-lhe um todo dicionário em formato de texto que tem cada palavra separados por uma linha. Então, se você queria ler em uma palavra de cada vez, o que você pode usar se você estiver lendo e eles estão todos separados em novas linhas, e você só quer uma palavra de cada vez? Audiência: fgets COLUNA 1: Certo. Fgets-- porque que retorna o que está em uma linha. E, se cada palavra é sua própria linha, podemos usar fgets. Legal. Isso faz sentido, todos? Legal? Sim, nós estamos indo para chegar a a parte divertida com ponteiros muito em breve, onde você começa a fazer um pouco de matemática. E vai ser ótimo. Última step-- fechar seu arquivo. Com tantas coisas aqui, um dos nossos paradigmas é se ele pode retornar null, verifique se nulo. Se você abrir algo, é melhor fechá-lo. OK, então você não está feito até que você esteja feito a menos que você já fechou. Tipo de como não acabou até que a senhora gorda canta. Isso é como fechar seu arquivo. Como se diz aqui, apenas para reiterar, sempre abrir o seu arquivo antes de você lendo ou escrevendo para ele. E sempre fechá-lo se você já abriu. Tudo certo? Legal. Então aqui está um exemplo. Então tiny-- Eu não sei se você vocês podem ver isso muito bem. Se pudéssemos aumentar o brilho de alguma forma. Deixe-me realmente fazer isso se eu puder. OK, vocês não podem realmente ver que em tudo, não é? OK, vamos fazer isso, então. [Inaudível] Suponho que isso é muito melhor para ver. Qualquer pessoa pode ver onde a minha rato foi é a pergunta? Ah, lá é-- que se esforça! Está bem. Basicamente, vocês devem ter tipo de uma idéia do que isso está fazendo. Não é perfeito. Mas eu prefiro explicar isso do que gastar mais tempo tentando formatá-lo corretamente. Basicamente, como você vê aqui, começamos com o arquivo aberto. E nós temos alguns arquivo de banco de dados que estamos abertura que diz que é os nossos alunos. E nós estamos indo para escrever para ele. Então, é claro, retornar nulo. Então, temos que verificar a nulidade. E então, se não é null, nós atravessamos. E como você pode ver, estamos looping por aqui. Há alunos. Estudantes de hash é definida como três. E o que estamos fazendo é que estamos impressão para o arquivo, certo? Então o que estamos imprimindo ao nosso arquivo? AUDIÊNCIA: As pontuações que estão na matriz? COLUNA 1: Sim. As pontuações que estão em o array-- exatamente. Então estamos abrindo este arquivo de banco de dados, que Eu suponho que é algum tipo de banco de dados de notas. E nós estamos apenas imprimir o escores de cada aluno para esse arquivo. Legal? Boa. Impressionante. Está bem. Vamos voltar a-- AUDIÊNCIA: Eu tenho uma pergunta rápida. É o printf não no loop? Isso é apenas no caso loop? COLUNA 1: Não, é no loop for. Eu não consigo ver o meu mouse muito bem até aqui. Então, eu estou lutando para formato que adequadamente. Este suporte deve ser ido. Deve ser por aqui. Isto é o que está em seu loop. Lá. Agora é bonita. Então é assim que ele deve ser-- exceto para a última faixa que eu demiti. Está bem. Isso faz sentido para todos? Está bem. Nós vamos seguir em frente para a próxima coisa entăo-- que, na verdade, você está indo a necessidade de ver o código. Então, eu estou indo só para cópia que mais agora. Está bem. Então eu vou mostrar para vocês este código. E eu quero que você tente e figura o que é suposto fazer. Assim, dado isso-- levar um minuto ou assim. Tentar descobrir o que está acontecendo aqui. Qualquer idéias? Nós sabemos que temos pelo menos dois argumentos na linha de comando, certo? Eu assumo um dos quais vai ser que [inaudível] do nosso programa é e então algo mais. Porque se [inaudível] é menos de dois, nós gritar com eles. Certo? E a partir do uso, parece que que vai haver algum tipo de arquivo. Estamos todos de acordo com isso? Então, agora, o que é o laço está fazendo? O que vai passar? AUDIÊNCIA: Todos os arquivos. COLUNA 1: Exatamente. Ele está passando por toda a arquivos que temos de entrada lá. Assim, para cada arquivo, é abrindo alguma corda lá. É abrir esse arquivo. Certo? E é a leitura do mesmo. É claro que, se verificar se é nulo. E então ele está imprimindo. Se é nula, é só nos dizer que isso não é um arquivo que existe. Porque lembre-se, com leia nosso arquivo tem que existir. Certo? Com gravação e de acréscimo, você pode ir longe com ele. Mas, com leitura, o nosso arquivo tem que existir. E então, se ela existe, o que estamos fazendo aqui? Vamos começar aqui. O que é isso fazer-- este primeiro caractere. O que ele faz? Ele recebe um personagem, certo? Então o que é esta fazendo? Está ficando o primeiro caractere. Alguém sabe EOF? AUDIÊNCIA: Fim do arquivo? COLUNA 1: Fim da file-- exatamente. Então, ele vai passar por o arquivo inteiro, certo? E então ele vai atualizar por ficando cada personagem subseqüente. Certo? E o que ele está fazendo? AUDIÊNCIA: Colocar que em-- COLUNA 1: impressões putchar para seu protetor de tela. [Inaudível] o personagem. E então, quando ele [inaudível] Isto irá fechar o arquivo. AUDIÊNCIA: Você não precisa de um [? mais? ?] COLUNA 1: Não necessariamente. Quer dizer, é uma espécie de implícita neste. Porque este retorna, porém, contanto como isso não pegar esse, você está bem. Quero dizer, é provavelmente bom prática para fazer uma outra coisa. Mas uma pessoa nem sempre é especialmente necessário se você tem algo como um retorno, que significa que, neste caso, se ele pega ele, seu programa vai acabar e nunca vamos chegar a isso. É mais para o caso em que você está não necessariamente algo retornando. Porque se isso não fosse retornando nada, isso significaria que, se isso fosse verdade, o resto deste ainda seria executado. E, nesse caso, você gostaria de ter um falso. Se ele está retornando, e final do seu programa, uma pessoa não é necessário tudo o tempo, dependendo do contexto. Jacob, você tem uma pergunta? AUDIÊNCIA: Yeah. O mesmo acontece com fgetc obter o próximo personagem? Como o personagem aumentar? COLUNA 1: Sim. Então fgetc obtém o próximo personagem. Você pode pensar nisso como C ++ em um sentido. AUDIÊNCIA: Então, qual foi EOF? COLUNA 1: EOF é o fim do arquivo. É apenas um marcador que permite que você saiba que está no final do seu arquivo. Então, isso vai imprimir com seu padrão para fora. E então ele vai fechar o arquivo quando ele é feito. E então vamos para o próximo arquivo, certo? Portanto, em geral, o que este programa faz? [Inaudível] COLUNA 1: Sim. Ele só imprime tudo o que há. Então CAT se vocês já usei e, em seguida, o nome de alguns file-- Eu não sei se algum de vocês tem já fez isso no seu terminal. Mas se você nunca usar o comando CAT-- C-A-T-- e, em seguida, qualquer arquivo você tem que há-- imprime-o para o seu terminal, que pode ser super útil para algumas coisas. Eu usá-lo muito. Isso faz sentido para todos? Legal? OK assim que sua tarefa agora- quer por sozinho ou com as pessoas ao redor você- é apenas para escrever um programa simples que só vai escrever "Olá, mundo!" para um arquivo. [Inaudível] [Inaudível] COLUNA 1: Eu estava tipo, fez Eu faço isso mal na semana passada? Eu não acho que foi tão ruim assim. Estou feliz por você estar todos aqui. Ele realmente me faz feliz. Eu sou uma garota de prazeres simples. Eu só gosto quando minha seção atende. Então eu estou apenas começando isso começou por vocês para que possamos codificar juntos. Eu não gosto de colocar qualquer um em o local, a menos que você quer ser. AUDIÊNCIA: Para o questionário, fazer temos que escrever um programa? COLUNA 1: Você pode ser solicitado a escrever programas simples com a mão. Sim. AUDIÊNCIA: O teste é na próxima semana, certo? COLUNA 1: O teste está próxima quarta-feira. Isso significa que há um lindo [? CSE?] classificação depois partido, que significa que você terá a sua pontuação volta que noite-- em que momento? Quem sabe? Mas será que a noite. Tudo certo. Como queremos começar este? Vou te dar um hint-- começa com isso. AUDIÊNCIA: Você tem que abrir um arquivo. COLUNA 1: Sim. Então o que você quiser chamar isso? Você só quer chamá-lo de "arquivo"? Vamos torná-lo fácil. Então, qual é o nosso fopen-- teste de saída vai ser? Chamá-lo de "Olá". E o que é o nosso modo? O que estamos fazendo para este arquivo? AUDIÊNCIA: Leia. Escrevendo. COLUNA 1: Estamos escrevendo para ele. Adorável. OK, então nós temos esse arquivo agora. O que precisamos fazer? AUDIÊNCIA: Verifique se ele é nulo. COLUNA 1: Verifique se é null-- exatamente. Isso é o que eu gosto de ouvir. Isso deveria ser automático, especialmente praticamente a partir deste ponto. Se você começar a segfaulting, você provavelmente não verificar null em algum lugar. Nove em cada dez vezes, isso é vai ser o seu erro. Então, se você poderia apenas entrar no hábito, sempre verifique se ele é nulo, sua vida vai ser agradável e easy-- ou mais fácil. Então, verifique se ele é nulo. Então, se não é nulo, o que é o que o estrondo igual means-- não null-- é válido. O que queremos fazer? Nós apenas queremos imprimir para esse arquivo, certo? Então o que é que vamos usar? AUDIÊNCIA: fprintf COLUNA 1: Fprintf-- adorável. E fprintf leva dois arguments-- onde ele vai eo que queremos impresso. Então, qual é o primeiro? Onde é que vai? AUDIÊNCIA: Arquivo. COLUNA 1: Vai para o arquivo. E o que nós queremos impresso? "Olá, mundo!" Tudo certo. Temos uma última coisa-- outro grande paradigma aqui. AUDIÊNCIA: Close. COLUNA 1: Fechar. Lá você vai. AUDIÊNCIA: Isso está acontecendo se o arquivo é nulo? COLUNA 1: Não, isso é, se não é nulo. AUDIÊNCIA: Ah, se é não-- OK. Para o fopen e, em seguida, o dois argumentos que vão dentro, o que é que o primeiro argumento dizer de novo? COLUNA 1: O argumento é assim como o nome do arquivo que você deseja ir. Assim, após este é executado, você faria tem algum arquivo chamado "Olá" que tinha "Olá, mundo" dentro dele. Isso é tudo. Apenas o nome. AUDIÊNCIA: E já que é a escrita, o arquivo não tem que existir. É isso que você disse? COLUNA 1: Certo. Exatamente. Se "Olá" como um arquivo ainda não existe, é vai criar um arquivo chamado Olá "e escrever para ele para você. AUDIÊNCIA: Quando você está dizendo o programa a escreveu para o arquivo, Por que você escreve "arquivo" em vez de o nome do arquivo e fprintf-- COLUNA 1: Porque neste caso, temos que grande FILE-- tudo em estrela caps--, arquivar. Portanto, é um ponteiro para o arquivo que você está falando. Esta é a maneira que nós apenas se referem a ele. Portanto, neste caso, você pode pensar em aha file--, podemos usar isto-- arquivo aqui refere-se à abertura do "Olá" e deixá-lo escrever. AUDIÊNCIA: Poderíamos colocar um "Olá" em vez disso [? de apenas?] arquivo f? COLUNA 1: Não, porque "Olá" precisa ser aberto e gravável. Arquivo aqui é como um designador que diz OK, nós ter este hello-- file-- que nós estamos olhando. Tem sido aberto. E nós estamos indo para escrever para ele. Se você usar apenas "Olá", que é encapsulado na mesma. Então, ele vai surtar. Quero dizer, você poderia ter chamado ele. Você poderia ter feito de arquivo, estrela, "Olá", é igual a isso. Mas a questão toda é que você precisa de um ponteiro de arquivo estrela em ordem para ser capaz de usar essas funções. AUDIÊNCIA: Você poderia fazer arquivo, estrela, arquivo, "Olá" ou você tem que colocar arquivar estrela, arquivo por ele? COLUNA 1: Você poderia fazer arquivo, estrela, "Olá". Você pode mudar isso para qualquer nome que você quiser. É completamente arbitrário o que esse nome é. Você pode nomeá-lo de nada. Nomeie-espaguetes do vôo, se você quisesse. AUDIÊNCIA: O que é o "w" entre aspas para? COLUNA 1: O "w" é apenas o modo. Então, nós estamos escrevendo a este arquivo. Todo mundo bom? Clear? Sim. AUDIÊNCIA: Então, quando ele escreve esta arquivo, onde é que vamos então encontrar esse arquivo? COLUNA 1: Ele vai ficar na mesma diretório que você está atualmente em. Se você estiver em pset três e você executar este, dentro de sua pset três pasta vai ser este arquivo chamado "Olá". Legal? Todo mundo bom? Eu sinto que você é tudo consegui-lo, o que é ótimo. Está bem. Então, de volta ao meu slides show-- Eu amo quando as coisas funcionam. OK, pointers-- Vocês estão animado? Ponteiros são grandes. Eles levam um pouco de quebrar a cabeça por aí. Este é o meu segundo ano ponteiros de ensino. E eu acho que finalmente consegui-lo. Então, se você lutar, é OK. Como eu disse antes, desenhar ajuda muito com as coisas no CS, tanto quanto eu acho que as pessoas tendem pensar oh, nós estamos em um computador. Nós devemos apenas código. Não-- imagens de desenho realmente vai ajudá-lo. E eu realmente incentivá-lo a tocar em seu lado kindergartner e trazer para fora giz de cera ou marcadores e sorteio. Porque ele vai ajudá-lo. E se você me ver no horário de expediente, eu será que transportam cerca de pilhas de papel com penas de desenho as coisas. Assim, particularmente com pointers-- tirar fotos. E tenho certeza de que estamos realmente indo para estar desenhando algumas fotos aqui também. Então vocês todos tem que ver Binky, esta coisa legal claymation. E nós pensamos que é realmente engraçado quando ele explode em um monte de peças. É um pouco de alívio cômico para a classe. C [inaudível] este grande capacidade para ser capaz de controlar de memória. E é uma das coisas que realmente torna uma linguagem tão poderosa. Mas com grande poder vem grande responsabilidade. E as coisas loucas pode acontecer se você não tiver cuidado. Então, quando você estiver usando ponteiros, você quer fazer Certifique-se que você realmente entender exatamente o que você está fazendo. Esperemos que o próximo pouco de tempo vai ajudá-lo a realmente entender ponteiros, como usá-los, e como manipulá-los. Então memory-- eu tenho certeza que nós temos vi esse diagrama antes. Portanto, este é apenas um simples diagrama de como as coisas poderiam ser armazenados memória. Então, você tem basicamente estes enormes matrizes de blocos de um byte é o que temos aqui- ligeira incrementado em um de cada vez. Esta é em hexadecimal [inaudível] tão quadras de oito bits. E cada bloco está associado com algum endereço hexadecimal. Então, se você já viu o 0x, que está apenas notating que é um endereço hexadecimal. Você pode assumir isso significa algum endereço na memória. Estamos falando de endereços de memória sempre que você vê hexadecimal. Temos ints são variáveis, flutuadores são variáveis ​​que armazenam. Então, armazenar ints ints. Loja de carros alegóricos flutua. Então nós também temos ponteiros que os endereços de memória loja. Isso é uma espécie de mapeamento. Os ponteiros são exclusivamente para endereços de memória. Então, isso é como o seu tipo de lá. O seu aparelho é de 32 bits, o que significa que o seu endereço de memória é de quatro bytes. Assim, qualquer ponteiro que você tem Também vai ser quatro bytes. Ou então se é quatro bytes, memória é de quatro bytes. Memória loja ponteiros. Portanto, eles são quatro bytes. Cool-- só quero reforçar isso. Você deve começar este comic agora. Eu não sei quantos de vocês são fãs xkcd, mas eu amo xkcd. É ótimo. Tudo certo. Assim, a criação de pointers-- como eu disse, é praticamente como qualquer outra coisa. Você tem um tipo. Você tem um nome. Certo? Isso é o que temos lá. [? Hex?] Estrela significa que é um ponteiro, e, em seguida, o que você quiser chamá-lo. Assim, o tipo representa o que você pode armazenar. Tudo certo? Da mesma forma que se fizermos ints, sabemos que estamos armazenando um int lá. Com um ponteiro, ele detém um endereço de memória. Mas o que isso significa é isso-- aqui é onde um desenho que vai vir a calhar. Portanto, neste caso, temos alguns value-- digamos quatro. Quatro é no endereço um. Ok? Este primeiro aqui significa que é um 2x ponteiro. Certo? É algum ponteiro x. x pode ser algo, qualquer coisa. O que quer dizer x é-- x é quatro. Vai para armazenar o endereço de memória aqui. Assim, int, estrela, x-- este é alguma outra ranhura em memory-- quem sabe o que é isso. Mas ele vai armazenar um endereço aqui. Portanto, este seria como-- neste caso, o que quer, é armazenado a 0x1-- tudo o que é armazenado no endereço que nosso ponteiro detém, tem de corresponder-se com o que temos designado. Assim, em 0x1, neste caso, esta é x. Isso só pode ser sempre uma int enquanto estamos usando isso. Da mesma forma, se tivermos 1a outro, seja qual for endereço é armazenado com um y tem para ser uma mesma coisa char-- com z. Do mesmo modo, sempre que você tentar fazer INTX igual 0,4, ele vai gritar com você e ser como não, você disse que queria um int. Isto é suposto ser um int. Pare de tentar torná-lo um float. Então deixe as coisas serem o que querem ser. Deixe que as coisas sejam eles mesmos. Tão grande coisa é apenas qualquer tipo de ponteiro é, essa é a única coisa que você pode armazenar lá. Ok? Com a prática, como com na semana passada, tudo Parece realmente uma espécie de resumo. Nós vamos fazer alguma prática. Deve fazer mais sentido. Então, referenciando e dereferencing-- é realmente importante para obter estes reta. Eu ainda tenho que atualizar de vez em quando. E eu sou como espera, que um que eu quero? Assim, o comercial vai realmente dar você a referência ou o endereço de. Assim, ele retorna o endereço em memória de qual variável é armazenada. Então, ele vai realmente voltar para você um hexadecimal, enquanto que dereferencing está realmente indo para dar-lhe os dados que são armazenados lá. Ok? Então, vamos olhar um exemplo muito rápido, ou realmente o próximo. Está bem. Então, nós temos que pensar realmente cuidadosamente sobre isso. Portanto, temos aqui algum inteiro x. Vou tentar tirar esta para o melhor das minhas habilidades. Então, nós vamos ter esse slot x. E é armazenar cinco. Seu endereço é 0x4. Legal? Tudo de bom. Portanto, agora temos este ponteiro. Foi por aqui. E o comercial nos dá o endereço de alguma coisa. Assim, neste caso, é o endereço de x. Qual é o endereço de x? 04-- e este ponteiro está no 0x08. Legal? Assim, você pode pensar sobre isso ponteiro, 04, apenas aponta para cá. E eles são chamados de ponteiros porque, como temos mais para isso, você vai ver apontando para as coisas. E um bloco apontando para outra bloco fará muito mais sentido. Então, aqui estão dois. E então nós temos alguns cópia, que é 0x0c what--. E ele vai desreferenciava nosso ponteiro. Então o que ele está dizendo é OK, aqui está o nosso ponteiro. O valor que ele armazena é 0x04, eo que ele está dizendo é ir a este endereço e me diga o que está nele. Então, isso é efetivamente o que esta seta está fazendo. Você pode pensar nisso como a sua estrela. Então, OK, quando fazemos estrela, que significa seguir. Ir para este endereço. E isso é basicamente seguinte nesta seta para este pedaço de memória. E dá-nos o que está nele, que é 5. É por isso que a nossa cópia é igual a 5. Será que isso faz sentido? Alguém precisa me passar por isso de novo, ou mais devagar? Você quer que eu vá por isso mais uma vez? Está bem. Nós estamos indo para redesenhá-lo novamente. Quando começamos, todos nós concordamos que temos algum pedaço de memória que é uma variável x que estabelecemos igual a 5. Nós não controlamos onde ele está na memória. Portanto, este ponto é apenas atribuído arbitrariamente. Boa lá? Está bem. Em seguida, inicializar um ponteiro para um int. É por isso que é permitido para apontar para x, porque temos um int aqui. Nós temos um outro pedaço de memória, porque este ponteiro é uma variável como qualquer outra coisa. É atribuído arbitrariamente algum espaço na memória. E o que ele armazena é o endereço de x. Ampersand significa endereço de x. Então, qual é o endereço de x? AUDIÊNCIA: É zero-- COLUNA 1: 0x04. Então entăo-- último. Temos algumas copy-- novamente apenas uma outra variável. Então, vamos atribuir um lugar arbitrário. E nós desreferenciava nosso ponteiro. A estrela significa ir para a endereço armazenado no meu ponteiro. Diga-me o que está lá. Assim, o endereço armazenado em nosso ponteiro é 0x04. Então vamos para esse endereço. Ele está apontando para esse endereço. O que está dentro deste bloco de memória? É um cinco. Então é isso que nós atribuímos a nossa cópia. Todo mundo bom? Legal. Fotos novamente--. Então, seguindo os valores de aqui- Eu sou vai deixar vocês pensam sobre isso. Podemos tirar outra foto. Mas eu quero que você tente e razão por isso em seu próprio país por um minuto. Uma vez que eles não dão nós um exemplo de endereço, Eu só vou fazer x-- comercial que deve ajudar a conduzi-lo para casa. Ampersand significa endereço. Assim, no primeiro, todos ir com a primeira linha. Alguns x de five-- algum conjunto ranhura na memória aleatória. Ponteiro estrela Int é igual para o endereço de x, certo? Int ponteiro estrela cria Neste bloco, o chama de ponteiro, e atribui-lo para o endereço de x. Eu sou terrível e comercial. Agora, o que nós estamos fazendo é que dizemos OK, desreferenciava nosso ponteiro. Então vamos OK, o que está em nosso ponteiro? É comercial x. Ir para Ampersand x e reajusta-lo. Então, agora, comercial x vai ser 35. Então, basicamente, quando você está dereferencing, você vai OK. Você vai ser desenho fotos como esta. Você vai ser desenho suas setas sobre onde ela está. Então, vá para esse slot na memória e quer dá-me esse valor de volta, ou alterá-lo. Neste caso, porque estamos neste valor, estamos atribuindo-o a ser de 35. Considerando que, no passado um, se você observar, nós Foram atribuindo o que estava aqui para outra coisa. Então eles têm esta tabela incrível. Não é tão ruim assim. Vocês trabalhar nele. Vou tirá-la no tabuleiro. Nós estamos indo para preenchê-lo juntos, OK? Então pegue um pouco de papel, grab um parceiro, começar a trabalhar. Eu estou indo para obter um maior pedaço de giz. Porque ele vai ser muito. Está bem. PROFESSOR: OK. Vamos começar com a primeira linha. Vamos começar por aí, então vocês talvez possa trabalhar com um pouco mais. Está bem. um é igual a B vezes c então o que é um? Não é uma pergunta capciosa, eu prometo. ALUNO: 4 vezes 5. PROFESSOR: 4 vezes 5. 20. Então, qual é b? ESTUDANTE: 4. PROFESSOR: E c? ESTUDANTE: 5. PROFESSOR: 5. E então este é só ir a ser comercial Uma, ampersand b, c comercial, certo? Não é ruim. É simples o suficiente. Está bem. Então a próxima. A é igual a vezes c, no caso ninguém estava familiarizado com isso. Está todo mundo conhece com os tempos iguais? OK, tudo isso means-- este é atalho para um é igual a um vezes c. Você também pode fazê-lo com a divisão, com adição, com subtracção. Você pode fazer um igual, ou um plus é igual a c significa um é igual a um mais c, um sinal de menos igual c seria um é igual a um menos c. É apenas açúcar sintático. Assim, neste caso, a é igual a uma vezes c ia-nos o que dar? Novamente, não é uma pergunta capciosa. ESTUDANTE: 100. PROFESSOR: 100. Será que alguma coisa mudou? Não. Talvez eu finalmente chegar melhor para os meus e comercial. ALUNO: OK, desculpe, como você conseguiu 100? PROFESSOR: OK. Assim, a é igual a um vezes c, assim que uma vezes c. ALUNO: Oh, você está usando um para o previous-- PROFESSOR: Sim. Então, esses são os nossos valores mais recentes. Estes são o que você deve ser usando como nós nos movemos para baixo, OK. Assim, b é a única coisa que muda, né? Então, vamos preencher todo o resto. B. O que é b vai ser? Para ser ou não ser. Então o que é esta fazendo? O que é a estrela pa fazendo? ALUNO: Código para o local do pa. Estudante: Não, não é bem assim. Portanto, esta é uma referência d. Estudante: Então b é o valor de mão pa. PROFESSOR: Sim, por isso é pa o endereço de um, certo? Então ele está dizendo para ir onde a é armazenados e dar-lhe esse valor. Então, o que é b? ESTUDANTE: 100. PROFESSOR: 100. Perfeito. OK, então pc é o que está mudando. Tudo o resto permanece o mesmo. O que é o PC vai ser? Atribuição simples. Pc é igual ao ano, eo que é pa? ALUNO: Ampersand a. PROFESSOR: Perfeito. Agora estamos começando a ficar interessante. OK, vamos quebrar este para baixo. Em primeiro lugar, o que é b vezes c, porque isso é a parte mais fácil de um presente, certo? B vezes c é-- ALUNO: 500. PROFESSOR: Sim, por isso o que é este fazer, Se é estrela pb, o que está mudando? Estudante: O que está em as-- PROFESSOR: O que está em b? Estudante: O que é no espaço pb que está apontando. PROFESSOR: E pb está apontando a-- ALUNO: B. PROFESSOR: B. Assim, a única uma coisa que muda é b, certo. Então b vezes c, 500. Então, isso é o que muda agora. Legal. Adorável. Vocês estão indo muito bem. Tudo bem, quebrando um presente para baixo. C está mudando, certo? Assim, podemos preencher todo o resto. Vamos ver. Está bem. Sabemos que c vai ser o produto de dois números, certo? Quais os dois números, embora? ALUNO: A e C? PROFESSOR: Então é um direita para a primeira. Então, estamos fazendo referência d p de um, certo? P de um aponta para um, por isso sabemos que isso vai ser de 100 vezes o que? Vezes o que faz ponto para pc? Aponta para um. Assim, é 100 100 vezes 10.000. Será que isso faz sentido? Legal. Trecho inicial, caras, última linha. Está bem. O que está mudando aqui? ALUNO: A. PROFESSOR: A. Perfeito, assim tudo pode ficar na mesma. Está bem. E o que é um? Portanto, é uma vezes o que? Este é estrela pb. Assim estrela pb significa aqui pb, pontos de pb para b. ALUNO: 500. PROFESSOR: 500. Portanto, temos 500 vezes 100. Isso é 50.000. Ufa! Olhe para isso. ALUNO: Por que temos o & c para a last-- PROFESSOR: Desculpe. ALUNO: Oh, OK. PROFESSOR: My bad. Lotes de escrita. Todo mundo bom? Não é tão ruim, certo? Só tem um pouco tempo para trabalhar. Se você dividi-la, entender o que cada parte está se referindo a-- como com tudo o que é, sim-- decompô-lo para o pequeno problemas e, em seguida, se recombinam, e você pode fazer algumas coisas incríveis. Não são as respostas, mas nós fizemos isso. A aritmética de ponteiro. Ah. Minhas mãos estão todos farináceo. Assim, adicionando ou subtraindo int ajusta o ponteiro pelo tamanho do tipo de ponteiro. Lembre-se de como cada tipo tem um tamanho diferente? Assim como um casal ou um longo tempo é oito e int é quatro, mas de char é um deles. Então, o que você quer fazer é-- uma coisa a lembrar é apenas isso o quanto o seu valor do ponteiro realmente muda dependerá da tipo de ponteiro que é. Todo mundo bem com isso? Posso apagá-la? Nós somos bons? Impressionante. Então, se nós temos algum ponteiro isso-- isso vai ser-- eu sou vai torná-lo um ponteiro int. Ele armazena esta. Se você tivesse que dizer ponteiro mais um, o que vai fazer é que vai atualizar por isso o tamanho de um int porque essa é a tipo de ponteiro que é. Com C, tudo é muito rigoroso e regulamentado. O ponteiro int vai atualizar por a quantidade de espaço um int tomaria. Um int é de quatro bytes. Então, o que este se transformar em? Você está apenas a adição de quatro para isso. Agora o ponteiro seria ser-- OK. Então, se ele era um char e fizemos ponteiro mais um, o que seria agora? Se started-- fingindo que started-- agora é 0x08. Vamos agora dizer que este foi um carbonizar ponteiro, e nós adicionamos um. O que seria mudar para? Quantos bytes é um char? AUDIÊNCIA: One. COLUNA 1: One. AUDIÊNCIA: Então 0x09. COLUNA 1: Então seria nove. Portanto, apenas algo para se lembrar. Apenas quando você adiciona um, não é adicionando um a menos que seja um char. É a adição de quantos bytes do tipo que é, que é por isso que temos essa equação aqui. Por isso, é int vezes o tamanho do tipo de ponteiro. Portanto, temos o exemplo aqui. y foi atribuído a esse valor, 0x4, quando fizemos y mais é igual a um. O que está nele, o que é em x, não muda. O que muda é o que está em y. O endereço armazenado em y atualizado por quatro porque existem quatro bytes num int e é um ponteiro int. Tudo certo. Portanto, agora temos um outro exercício. Portanto, a questão é o que será impresso. Qualquer idéias? AUDIÊNCIA: O número de personagens de gato feliz? COLUNA 1: Exatamente. Assim como com a sua corda. Será que todo mundo conseguiu isso? Não queremos passar por ela? Sim, OK. Então o que temos aqui- I assim muito mais. Eu não tenho a [Inaudível] ridiculamente. Portanto, temos nossa string aqui, gato feliz. Adorável. Temos que alguns contador nós estamos mantendo o controle de. Portanto, temos alguns de char * ponteiro que apenas é igualada a STR. O que isto está fazendo é que é atribuir algum ponteiro para o início da seqüência. Porque eu tenho certeza que, como foi mencionado na palestra, demos a vocês esta tipo de dados chamado string. Mas realmente cordas são apenas uma variedade de-- como char *. É um ponteiro para um bando de personagens que são contíguas na memória. Portanto, esta apenas define que igual a qualquer seqüência é identificado por onde seu primeiro personagem. Portanto, esta é apenas a criação algum ponto igual ao início da cadeia. Todos bom lá? Legal. Portanto, esta é dereferencing nosso ponteiro. Por isso realmente vai nos dar algum valor aqui, em nossa cadeia que estamos falando. E nós estamos dizendo desde que não é terminador nulo. Então continue indo até você chegar ao fim da cadeia. Atualize seu ponteiro por um. Assim, r, ele vai realmente actualizar por um cada vez, porque este é um char, o char *. Então, ele vai passar. Ele vai atualizar. Assim, a primeira vez que este é executado, ele vai estar aqui na hora. Ele vai atualizar. Vai ser um a. Vai ser um p, y, e assim por diante e assim por diante. Vamos atualizar balcão. Quando se chega ao final, ele apenas imprime o quão longe ele está ficando. Sim. AUDIÊNCIA: Então Conta o espaço como um, certo? Está bem. COLUNA 1: Acho que sim. É que uma question-- AUDIÊNCIA: [inaudível]. COLUNA 1: Não se preocupe. Isso eu faço isso. Tudo bem, então uma coisa que eu entender é que, com uma matriz, você também pode tratá-lo como um ponteiro porque as matrizes são apenas manchas contínuas de memória. Assim, você pode tratá-lo da mesma maneira. Você pode manipulá-los com ponteiros também. Então, ao invés de fazer, neste caso, a coisa análoga 0 seria matriz é igual a 1. Mas, da mesma forma que uma string é determinada pelo início da onde sua primeira personagem é, uma matriz é determinada pela onde o primeiro elemento é. Porque nós sabemos, estamos garantido, que estes vão ser contínua blocos de memória. Isso é o que nos permite fazer isso. Sabemos que eles estão contínua blocos de memória. Portanto, neste caso, por dereferencing só matriz, que nos diz: OK, vá para o início da sua matriz, que é aqui. Assim, você pode configurá-lo igual a um. E, neste caso, qualquer que seja sua matriz tipo é, quando você atualizá-lo por um, isso é apenas como atualizar -lo para o próximo índice. Você pode fazer isso, porque você saber o que está na sua matriz. Por isso, sabe o quanto a atualizar o ponteiro por, o endereço para atualizá-lo para assim que você é no próximo slot. Portanto, esta é apenas uma forma diferente de escrever gama 0 é igual a 1, série 1 é igual a 2, array suporte 2 é igual a 3. É apenas uma outra maneira de pensar sobre isso. Porque eles são contínuas blocos na memória, você pode se referir a eles ou pela matriz notation-- que eu, pessoalmente, encontrar easier-- mas talvez você precisa manipulá-lo estritamente por endereços de memória. E esta é a maneira que você faria isso. Tipo de mais ou menos como um coisa legal que você poderia fazer contra talvez não algo que você está realmente vai implementar. Eu usá-lo em 61. Vocês provavelmente não precisa que se preocupar muito com isso. Mas se você estiver interessado, ter 61 no próximo ano. Estamos nas caras estiramento casa. Eu sei, é muito tempo. Memória Dinâmica Allocation-- por isso sabemos que um das coisas quando falamos durante a primeira secção em conjunto, nós olhamos para uma troca função onde foi fora do âmbito da nossa função principal. E nós estávamos passando esses valores que foram eficazmente cópias. E uma vez terminado de swap execução, ele apenas deixou uma pilha. Lembre-se, temos um empilhar quadro para swap. Ele deixa e aqueles valores ficar com ele. E eles foram embora. Nós não podia fazer nada com eles e ficamos tristes porque não podemos trocar os nossos valores. Mas com C, como eu mencionei, você tem um monte de poder sobre a memória. Então, o que você pode fazer é que você pode alocar as coisas na pilha aqui que vai ficar lá até de lhes dizer o contrário. Eles são como bons filhos. Eles ficam lá. Eles não deixam. Eles vão ficar lá até que você esteja como, OK, você pode ir embora. Considerando as coisas na pilha, who-- eles são como crianças desobedientes. Eles só vai fugir quando quiser estar lá e, em seguida, eles se foram. Você não pode levá-los de volta. Assim, a pilha é-- vamos falar sobre malloc e free, que Eu tenho certeza que vocês ouviu falar sobre a palestra. E isso é basicamente uma forma ter dados muito persistentes. Assim, você pode manter os dados ao redor contanto que você quiser. Hum. AUDIÊNCIA: Você pode definir heap e pilha? Eles são como lugares para colocar as coisas? COLUNA 1: Então, eles estão basicamente só-- eles são a maneira como nos referimos apenas à memória. Então pilha é apenas lugares onde memória é alocada dinamicamente, Considerando pilha refere-se mais a pilha de quadros que são mais central para o funções que são realmente em execução. Você realmente não tem controle. A grande diferença, você tem controle sobre o monte, se você quiser. Você tem menos controle sobre a pilha. A pilha depende do funções que estão em execução, e a ordem na qual eles são correr, e como as coisas são devolvidos. Considerando que, com a pilha, como vamos ver, você pode dizer, OK, eu quero que esse valor seja ao redor até que eu diga o contrário. Você não tem permissão para se livrar dele. Você não tem permissão para substituí-lo. Você está indo para mantê-lo em torno de durante o tempo que eu lhe digo. Você começa a ser o chefe no heap, enquanto o stack-- talvez se você como finagle seu caminho você pode ser o chefe. Mas não é bem assim. E ele é realmente apenas memória. É apenas maneiras diferentes de se referir a memória. Legal. Então, com isso, a forma de controlar a sua memória. É com malloc, que você vai começar a usar. Então é só curto para alocação de memória. Isso é tudo o que é. Há um monte de outras legal funções que têm alloc no final, e eles representam coisas diferentes. Então, quando você precisar de armazenamento que precisa para durar mais que sua função atual para que quando o seu atual função foge, você ainda tem os dados que você tenho a partir dele, você quer usar malloc. Isso vai inicializar-lo na pilha. E como eu disse e manter dizendo, você vai mantê-lo lá até que você diga o contrário, que é a coisa importante aqui. Então, uma coisa a notar, e isso é normalmente muito importante, é que este sizeof é super útil para usar porque, dependendo do tipo da máquina que você está executando, ele pode ter quantidades variáveis de memória que é preciso. Assim, você sempre quer usar o tamanho de modo que você não é dependente da máquina, de modo que seu código será rodar em qualquer máquina. E isso é apenas parte de escrever código bom. Se ele funciona em uma máquina, mas não qualquer uma das outras, quão útil foi o seu programa? Assim, você sempre quer certifique-se e usar sizeof. AUDIÊNCIA: Assim é que, como o tamanho de 10 polegadas [inaudível]? COLUNA 1: Este é o tamanho de 10 ints. sim. Assim, o tamanho de ints voltará quanto é que um int tomar. Ou o tamanho do char, como tanto faz um caractere take. E então quantos blocos de que você quer? Portanto, neste caso, queremos algo que pode armazenar 10 ints para. E ele vai trabalhar independentemente da máquina, o que é legal. Então, quantos bytes vontade que realmente dar-lhe? Matemática rápida. AUDIÊNCIA: 40. COLUNA 1: 40. Exatamente. Assim, uma outra grande coisa. Ponteiro ou malloc pode retornar nulo. Então, novamente, sempre verifique a ver se ele retornou nulo antes de tentar fazer qualquer coisa com ele. Se você tentar e desreferenciava este ponteiro agora, ele só vai segfault porque você foi e tentou tocar nulo quando você não deve ter. Portanto, verifique sempre para nulo. Mais uma vez, tudo o que você pode fazer. Ele pode retornar nulo. Ele vai retornar nulo se você é ou fora do espaço, ou por qualquer motivo ele correu para algum bug de memória. Às vezes, apenas retorna nulo. Então, você apenas tem que verificar para ele. Isso é tudo que este slide está dizendo. E então o que temos aqui é uma chamada para libertar. Assim, da mesma maneira que se abrir um arquivo você deve fechar um arquivo, se você memória malloc, você Deve você liberar essa memória. E vocês vão começar para fazer coisas bem legais. E há um programa que você pode executar a veja se você está sempre com vazamento de memória. Mas você não quer vazar memória. É muito ruim. Apenas a bagunçar tudo. É ruim para fazer exatamente como a programação sábio para a eficiência do projeto. Mas também é só tipo de ruim para o seu computador. Então, só coisas livres quando você malloc-los. Vocês ver as simetrias aqui. Super simples. Apenas livre e, em seguida, qualquer que seja o ponteiro, qualquer que seja o nome o ponteiro é, e vai cuidar de libertá-la para você. Legal. Então nós temos isso. Então, nós apenas estamos indo para caminhar por este programa. E então vocês são feitos. Então, [inaudível] apenas principal. Portanto, temos alguns ponteiro int *. Portanto, temos um ponteiro que vai segurar ints. E quantas ints é que vai segurar? Apenas um. Tamanho de um int. Vamos verificar para ver se ponteiro é nulo porque é, queremos dizer não faça nada. É ruim. Então, nós imprimir algum erro fora do memória, na maioria das vezes retornar 1, como vocês estão acostumados. E então nós temos aqui, nós desreferenciava nosso ponteiro. Então isso significa que nós estamos indo para armazenar algo no local que nos foi dado. Int * ponteiro, ou malloc, retorna o endereço de onde ele reservou esta memória para você. Então é basicamente dando-lhe como-- se pensar em um monte de casas em um bairro que você quer colocar seu mobiliário em, malloc é como OK, você recebe para ir para a casa de três. E dá-lhe o endereço da casa de três. Então isso agora, este lojas ponteiro um endereço, armazena o endereço de sua casa. * meio PTR, OK, eu estou na minha casa. Legal. Preciso ter algum inteiro. Então, você está pedindo para alguém para dar-lhe móveis agora. Para que você obtenha algum int. E isso coloca-lo em seu ponteiro onde ele está apontando. E, então, apenas impressões fora, você entrou onde quer. E, novamente, a referência. Então, isso é como você foi para isso abordar e você viu o que estava lá. Legal? E então é claro que libertar o nosso ponteiro. Não se esqueça de liberar o ponteiro. Não se esqueça de verificar para null. Não se esqueça de liberar o ponteiro. Você tem duas coisas que você recorda de isso, ou que você deve se lembrar. Sim. AUDIÊNCIA: coisas [inaudível] assim, o char * s. Como é que nós nunca libertar aqueles? COLUNA 1: Hm? AUDIÊNCIA: São aqueles que, como cordas? Você disse que as cordas são como char * s, certo? Então, por que não liberar cordas? COLUNA 1: Você só para livre se você está mallocing. AUDIÊNCIA: Ah, se você está mallocing. COLUNA 1: Então malloc e livre são duas coisas que você deve ter sempre em conjunto. f aberto, f perto, duas coisas você deve ter juntos. Em ambos os casos, para verificar nulo. Sim. AUDIÊNCIA: Então livre é apenas permitindo que qualquer outra coisa para ser armazenado lá depois este programa tem usado? COLUNA 1: É só dizer, OK, eu estou feito com isso. Você não precisa mantê-lo por perto. Caso contrário, seu computador vai apenas gosto de tentar mantê-lo lá. E então você corre can't-- em problemas de memória mais tarde. Você sempre quer libertá-lo porque ele diz a seu computador, OK, eu sou feito com este local de memória. Você pode tê-lo de volta para mim para usar mais tarde. Legal? Sim. AUDIÊNCIA: Então nós usamos o% d apenas porque um casal que está voltando, ou porque é-- [inaudível]. AUDIÊNCIA: Você pode usar% i? COLUNA 1: Você pode usar% i. Quaisquer dúvidas de última hora? Continue. AUDIÊNCIA: Eu só tenho uma pergunta rápida. Assim, a variável ptr, that's-- como, com o int * ptr = malloc, que está apenas dizendo que é apontando para um lugar em memory-- COLUNA 1: Você quer [inaudível]? AUDIÊNCIA: --que é o tamanho de-- não, é OK. Mas é apenas apontando para um lugar em memória que é como quatro bytes. COLUNA 1: Certo. Então malloc o tamanho do int diz: OK, eu estou indo para ir correr, encontrar quatro bytes de memória para você. Quando se descobre que quatro bytes de memória, lhe dá de volta o endereço de onde ele começa, e é isso que armazenado no ponteiro, ou PTR. Boa. Vocês parecem menos confuso do que a maioria pessoas quando falo de ponteiro, assim que eu estou me sentindo muito bem agora. Tudo certo. Como sempre, vocês devem ter todos começado suas notas pset2 até agora. Eu sei que tem havido alguns instável coisas onde se diz, fórmula não é válido ou algo assim. Se você está recebendo esse, todos suas notas são válidos do meu lado. Então eu posso enviar-lhe screenshots de suas notas. Apenas deixe-me saber bem se você estiver faltando quaisquer notas ou algo não parece fazer sentido. Venha até mim. Tenho sido super orgulhosa de você caras já, de modo a manter-se. E ter um bom resto de sua semana. Eu tenho certeza que vou ver alguns de você no horário de expediente.