1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Olá, e boas-vindas de volta ao CS50. 3 00:00:13,260 --> 00:00:14,860 Portanto, este é o fim de semana quatro. 4 00:00:14,860 --> 00:00:16,680 Apenas um anúncio em primeiro lugar. 5 00:00:16,680 --> 00:00:19,600 Assim, o chamado quinto segunda for chegando esta próxima segunda-feira. 6 00:00:19,600 --> 00:00:22,800 Esta é a oportunidade para alterar de SAT / unsat a uma carta grau, ou de 7 00:00:22,800 --> 00:00:24,130 carta grau SAT / unsat. 8 00:00:24,130 --> 00:00:27,130 Importunamente, este processo exige uma assinatura, porque você tem que preencher 9 00:00:27,130 --> 00:00:28,770 fora um desses add / drop formas-de-rosa. 10 00:00:28,770 --> 00:00:31,680 >> Porque tecnicamente, o SAT / unsat ea versão classe da letra 11 00:00:31,680 --> 00:00:33,320 têm números de catálogo distintas. 12 00:00:33,320 --> 00:00:34,240 Mas não é grande coisa. 13 00:00:34,240 --> 00:00:36,620 Basta vir até mim ou para o Rob ou Lauren a qualquer momento. 14 00:00:36,620 --> 00:00:39,550 Ou e-mail, se você não tem o tipo de papelada que você precisa hoje, e nós 15 00:00:39,550 --> 00:00:43,410 não se esqueça de ajudá-lo a tomar cuidado de que antes de segunda-feira. 16 00:00:43,410 --> 00:00:45,780 >> Tudo bem, então hoje em dia - 17 00:00:45,780 --> 00:00:47,630 Na verdade, há um pouco de eco. 18 00:00:47,630 --> 00:00:51,070 Podemos tom me um pouco para baixo? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Então, hoje, nós introduzimos um tópico conhecido como ponteiros. 21 00:00:54,850 --> 00:00:57,770 E eu admito que este é um dos temas mais complexos que tendem a 22 00:00:57,770 --> 00:01:00,960 cobrir nesta classe, ou realmente qualquer curso introdutório que utiliza C. 23 00:01:00,960 --> 00:01:05,510 >> Mas tome minha palavra para ela, especialmente Se sua mente se sente um pouco mais curvada 24 00:01:05,510 --> 00:01:07,100 hoje e nas próximas semanas. 25 00:01:07,100 --> 00:01:10,340 Não é representativo de você ficar pior neste isso significa apenas que 26 00:01:10,340 --> 00:01:13,360 é um tema particularmente sofisticado que eu prometo, algumas semanas 27 00:01:13,360 --> 00:01:17,610 Por isso, vai parecer muito impressionante simples em retrospecto. 28 00:01:17,610 --> 00:01:18,720 >> Ainda me lembro até hoje. 29 00:01:18,720 --> 00:01:22,190 Eu estava sentado no Elliott Dining Hall, sentado ao lado do meu TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 que era um residente de Elliott casa. 31 00:01:24,070 --> 00:01:26,340 E por alguma razão, este tema apenas cliques. 32 00:01:26,340 --> 00:01:29,430 O que quer dizer que eu também lutava com ele por algum tempo, mas eu 33 00:01:29,430 --> 00:01:33,610 farei o meu melhor para ajudar a evitar qualquer luta com um tema que, finalmente, 34 00:01:33,610 --> 00:01:34,580 é bastante poderoso. 35 00:01:34,580 --> 00:01:37,350 >> De fato, um dos temas que discutiremos nas próximas semanas é que 36 00:01:37,350 --> 00:01:41,130 de segurança, e como você pode realmente explorar máquinas de maneiras 37 00:01:41,130 --> 00:01:42,320 que não se destinam. 38 00:01:42,320 --> 00:01:45,850 E essas explorações são tipicamente o resultado de erros, erros que 39 00:01:45,850 --> 00:01:49,740 as pessoas fazem por não compreender algumas da implementação subjacente 40 00:01:49,740 --> 00:01:52,250 detalhes através do qual os programas são feitos. 41 00:01:52,250 --> 00:01:55,410 >> Agora, para fazer isso parecer mais user amigável, eu pensei em jogar a 10 42 00:01:55,410 --> 00:01:59,680 segunda prévia de uma pequena claymation figura chamado Binky que foi trazido para 43 00:01:59,680 --> 00:02:03,020 vida por um amigo nosso em Stanford, Professor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Então, permita-me dar-lhe este teaser do Binky aqui. 45 00:02:06,753 --> 00:02:09,520 >> [REPRODUÇÃO] 46 00:02:09,520 --> 00:02:10,380 >> -Ei, Binky. 47 00:02:10,380 --> 00:02:11,050 Acordar. 48 00:02:11,050 --> 00:02:13,610 É tempo para se divertir ponteiro. 49 00:02:13,610 --> 00:02:14,741 >> -O que é isso? 50 00:02:14,741 --> 00:02:16,440 Saiba mais sobre ponteiros? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [FIM REPRODUÇÃO DE VÍDEO] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: Isso é Stanford ciência da computação. 54 00:02:20,670 --> 00:02:23,194 Então, mais sobre isso mais para vir. 55 00:02:23,194 --> 00:02:24,930 >> [Aplausos] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Desculpe, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Então, lembro a última vez que terminou em este suspense realmente emocionante 58 00:02:30,680 --> 00:02:32,960 pelo qual esta função simplesmente não funciona. 59 00:02:32,960 --> 00:02:34,960 Pelo menos intuitivamente, senti como ele deve funcionar. 60 00:02:34,960 --> 00:02:37,600 Basta trocar os valores de dois inteiros. 61 00:02:37,600 --> 00:02:40,915 Mas lembre-se que quando impresso a valores originais em principal, um e 62 00:02:40,915 --> 00:02:44,210 dois, eles ainda eram uma ea dois e dois e não uma. 63 00:02:44,210 --> 00:02:46,070 >> Então deixe-me realmente mudar para o aparelho. 64 00:02:46,070 --> 00:02:50,180 E eu escrevi um pouco de código esquelético em avançar aqui, onde eu afirmo que x 65 00:02:50,180 --> 00:02:52,500 será de 1, y vai ser 2. 66 00:02:52,500 --> 00:02:54,810 Eu, então, imprimir tanto de sua valores com f impressão. 67 00:02:54,810 --> 00:02:57,540 >> Eu, então, afirmar aqui que vamos trocá-los. 68 00:02:57,540 --> 00:03:00,800 Deixei um espaço vazio aqui para nós preencher hoje em apenas um momento. 69 00:03:00,800 --> 00:03:03,380 Então, eu vou afirmar que a duas variáveis ​​foram trocados. 70 00:03:03,380 --> 00:03:04,770 Então eu vou para imprimir los novamente. 71 00:03:04,770 --> 00:03:07,090 E assim espero, deverá ver 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Esse é o super simples objetivo agora. 74 00:03:09,830 --> 00:03:12,430 >> Então, como é que vamos trocar duas variáveis? 75 00:03:12,430 --> 00:03:17,220 Bem, se eu proponho aqui que estes copos pode representar em memória de um computador. 76 00:03:17,220 --> 00:03:19,070 Esta é algumas mordidas, este é mais algumas mordidas. 77 00:03:19,070 --> 00:03:23,260 Poderíamos ter um voluntário venha para cima e misturar-nos algumas bebidas, se familiar? 78 00:03:23,260 --> 00:03:23,920 Vamos para cima. 79 00:03:23,920 --> 00:03:24,815 Qual é o seu nome? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID MALAN: Jess? 82 00:03:25,690 --> 00:03:26,540 Venha, Jess. 83 00:03:26,540 --> 00:03:29,180 Se você não se importa, temos que colocar o Google Vidro em você para que possamos 84 00:03:29,180 --> 00:03:30,430 imortalizar este. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, vidro. 87 00:03:34,670 --> 00:03:37,250 Gravar um vídeo. 88 00:03:37,250 --> 00:03:43,103 E OK, nós somos bons para ir com Jess aqui. 89 00:03:43,103 --> 00:03:43,810 Tudo bem. 90 00:03:43,810 --> 00:03:45,120 Prazer em conhecê lo. 91 00:03:45,120 --> 00:03:47,720 >> Então o que eu gostaria de fazer aqui - se você pudesse, muito rapidamente - 92 00:03:47,720 --> 00:03:51,040 só nós derrama metade de um copo de laranja suco e meio copo de leite, 93 00:03:51,040 --> 00:03:55,710 representar efetivamente os números 1 em um copo e dois no outro copo. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Isso vai ser bom filmagens. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Desculpe. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Não, não. 99 00:04:06,330 --> 00:04:08,703 É OK. 100 00:04:08,703 --> 00:04:10,120 Nice. 101 00:04:10,120 --> 00:04:12,950 Tudo bem, então temos quatro bytes pena de suco de laranja. 102 00:04:12,950 --> 00:04:14,460 Vamos chamou o valor 1. 103 00:04:14,460 --> 00:04:16,579 Agora, mais quatro bytes no valor de leite. 104 00:04:16,579 --> 00:04:18,519 Vai chamá-lo de valor 2. 105 00:04:18,519 --> 00:04:20,440 Assim, X e Y, respectivamente. 106 00:04:20,440 --> 00:04:23,450 >> Tudo bem, agora se a tarefa à mão - para você, Jess, na frente de todos 107 00:04:23,450 --> 00:04:24,270 de seus colegas - 108 00:04:24,270 --> 00:04:28,510 é trocar os valores de x e y tais que queremos que o suco de laranja no 109 00:04:28,510 --> 00:04:32,070 outro copo e do leite neste copo, como talvez você - antes de você realmente faz 110 00:04:32,070 --> 00:04:34,020 ele - vai fazer sobre isso? 111 00:04:34,020 --> 00:04:35,220 >> OK, sábia decisão. 112 00:04:35,220 --> 00:04:36,340 Então você precisa de um pouco mais de memória. 113 00:04:36,340 --> 00:04:38,190 Então, vamos alocar um temporário copo, se você quiser. 114 00:04:38,190 --> 00:04:40,540 E agora proceder para trocar x e y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excelente. 117 00:04:53,530 --> 00:04:54,420 Então, muito bem feito. 118 00:04:54,420 --> 00:04:55,670 Muito obrigado, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Aqui está. 121 00:05:00,020 --> 00:05:01,950 Uma pequena lembrança. 122 00:05:01,950 --> 00:05:04,350 >> OK, então, obviamente, super simples idéia. 123 00:05:04,350 --> 00:05:07,500 Completamente intuitivo que precisamos de um pouco mais espaço de armazenamento - desta forma, 124 00:05:07,500 --> 00:05:09,750 um copo - se realmente querem trocar essas duas variáveis. 125 00:05:09,750 --> 00:05:11,110 Então, vamos fazer exatamente isso. 126 00:05:11,110 --> 00:05:14,330 Até aqui no meio onde eu afirmo que eu sou vai fazer alguma troca, eu vou 127 00:05:14,330 --> 00:05:15,720 vá em frente e declarar temporária. 128 00:05:15,720 --> 00:05:17,980 E eu vou defini-lo igual a, digamos, x. 129 00:05:17,980 --> 00:05:21,110 >> Então eu vou para alterar o valor de x apenas como Jess fez aqui com o 130 00:05:21,110 --> 00:05:23,200 leite e suco de laranja ser igual a y. 131 00:05:23,200 --> 00:05:27,460 E eu vou mudar y ser igual não x, porque agora nós estaríamos 132 00:05:27,460 --> 00:05:29,530 preso em um círculo, mas sim temporários. 133 00:05:29,530 --> 00:05:33,170 Onde temporariamente - ou onde Jess temporariamente colocar o suco de laranja 134 00:05:33,170 --> 00:05:35,460 antes de sobrepor que xícara com o leite. 135 00:05:35,460 --> 00:05:37,250 >> Então deixe-me ir em frente agora e fazer isso. 136 00:05:37,250 --> 00:05:39,210 É chamado noswap.c. 137 00:05:39,210 --> 00:05:41,190 E agora deixe-me correr sem swap. 138 00:05:41,190 --> 00:05:43,910 E, na verdade eu vejo, se eu expandir a janela um pouco, que 139 00:05:43,910 --> 00:05:45,160 x é 1, y é 2. 140 00:05:45,160 --> 00:05:47,230 E então x é 2, y é 1. 141 00:05:47,230 --> 00:05:51,910 >> Mas lembre-se que na segunda-feira nós fizemos coisas um pouco diferente em que eu 142 00:05:51,910 --> 00:05:56,760 em vez implementada uma função auxiliar, se você, que era, na verdade vazio. 143 00:05:56,760 --> 00:05:58,010 Liguei para ele trocar. 144 00:05:58,010 --> 00:06:01,600 Eu dei-lhe dois parâmetros, e eu chamei -lhes um e liguei para eles b. 145 00:06:01,600 --> 00:06:04,380 >> Francamente, eu poderia chamá-los de x e y. 146 00:06:04,380 --> 00:06:06,040 Não há nada que impeça me de fazer isso. 147 00:06:06,040 --> 00:06:08,140 Mas eu diria que é, em seguida, um pouco ambígua. 148 00:06:08,140 --> 00:06:11,910 Porque recordação para segunda-feira que nós alegou que estes parâmetros foram 149 00:06:11,910 --> 00:06:13,650 cópias dos valores passados ​​dentro 150 00:06:13,650 --> 00:06:15,640 Por isso só mexe com o seu mente, eu acho que, se você usar 151 00:06:15,640 --> 00:06:17,370 exactamente as mesmas variáveis. 152 00:06:17,370 --> 00:06:20,150 >> Então, eu vou chamá-los de uma vez e b, apenas por razões de clareza. 153 00:06:20,150 --> 00:06:21,840 Mas poderíamos chamá-los mais qualquer coisa que quisermos. 154 00:06:21,840 --> 00:06:26,280 E eu vou copiar e colar eficazmente este código lá de cima 155 00:06:26,280 --> 00:06:27,170 baixo em aqui. 156 00:06:27,170 --> 00:06:29,110 Porque eu só vi que ele funciona. 157 00:06:29,110 --> 00:06:30,790 Então, isso é em muito boa forma. 158 00:06:30,790 --> 00:06:37,390 E eu vou mudar o meu x para um, meu x a um, o meu y a b e meu y a b. 159 00:06:37,390 --> 00:06:39,130 >> Portanto, em outras palavras, exatamente a mesma lógica. 160 00:06:39,130 --> 00:06:40,850 A mesma coisa que Jess fez. 161 00:06:40,850 --> 00:06:44,350 E então a única coisa que tenho a fazer-se aqui, é claro, está agora invocar esta 162 00:06:44,350 --> 00:06:45,990 função, ou ligue para essa função. 163 00:06:45,990 --> 00:06:50,430 Então eu vou chamar essa função com dois insumos, x e y, e bateu em Salvar. 164 00:06:50,430 --> 00:06:52,300 >> Tudo bem, então fundamentalmente a mesma coisa. 165 00:06:52,300 --> 00:06:55,570 Na verdade, eu provavelmente já fez o programa desnecessariamente complexa por 166 00:06:55,570 --> 00:07:00,820 escrever uma função que está apenas tomando cerca de seis linhas de código, enquanto eu 167 00:07:00,820 --> 00:07:02,970 anteriormente havia implementado isso em apenas três. 168 00:07:02,970 --> 00:07:06,230 >> Então deixe-me ir em frente agora e refazer isso, não fazem swap. 169 00:07:06,230 --> 00:07:07,920 Tudo bem, eu estraguei tudo aqui. 170 00:07:07,920 --> 00:07:11,290 Este deve ser um erro que você pode ver cada vez mais comumente como o seu 171 00:07:11,290 --> 00:07:12,380 programas se tornam mais complexas. 172 00:07:12,380 --> 00:07:13,470 Mas há um reparo fácil. 173 00:07:13,470 --> 00:07:15,650 Deixe-me rolar para trás até aqui. 174 00:07:15,650 --> 00:07:18,190 >> E o que é o primeiro erro que eu estou vendo? 175 00:07:18,190 --> 00:07:19,520 Declaração implícita. 176 00:07:19,520 --> 00:07:21,466 O que significa que normalmente indicam? 177 00:07:21,466 --> 00:07:22,830 Ah, eu esqueci o protótipo. 178 00:07:22,830 --> 00:07:26,900 Eu esqueci de ensinar o compilador que troca vai existir, embora ele 179 00:07:26,900 --> 00:07:28,920 não existe no início do programa. 180 00:07:28,920 --> 00:07:35,780 Então, eu só vou dizer nula, swap, int, um int b, ponto e vírgula. 181 00:07:35,780 --> 00:07:37,280 >> Então, eu não estou indo para reimplementar-lo. 182 00:07:37,280 --> 00:07:39,140 Mas agora coincide com o que está aqui embaixo. 183 00:07:39,140 --> 00:07:42,530 E notem, a ausência de um ponto e vírgula aqui, o que não é necessário quando 184 00:07:42,530 --> 00:07:43,200 de execução. 185 00:07:43,200 --> 00:07:46,010 >> Então deixe-me refazer este, não fazem swap. 186 00:07:46,010 --> 00:07:46,910 Muito melhor forma. 187 00:07:46,910 --> 00:07:48,130 Executar sem swap. 188 00:07:48,130 --> 00:07:48,740 E dane-se. 189 00:07:48,740 --> 00:07:51,650 Agora estamos de volta onde estávamos na segunda-feira, onde a coisa não trocar. 190 00:07:51,650 --> 00:07:55,410 >> E qual é a explicação intuitiva por que esse é o caso? 191 00:07:55,410 --> 00:07:56,380 Sim? 192 00:07:56,380 --> 00:07:57,630 >> Estudante: [inaudível]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Exatamente. 195 00:08:05,230 --> 00:08:07,330 Assim, a e b são cópias de x e y. 196 00:08:07,330 --> 00:08:10,680 E, de fato, a qualquer momento que você esteve chamar uma função, até agora, que 197 00:08:10,680 --> 00:08:12,540 passa variáveis ​​como ints - 198 00:08:12,540 --> 00:08:14,470 apenas como swap está esperando aqui - 199 00:08:14,470 --> 00:08:16,270 Vocês foram passando cópias. 200 00:08:16,270 --> 00:08:19,150 >> Agora, isso significa que ele tem um pouco de tempo, uma fração de segundo, para o 201 00:08:19,150 --> 00:08:23,270 computador para copiar os bits de um variável para os bits de outro. 202 00:08:23,270 --> 00:08:24,610 Mas isso não é um negócio tão grande. 203 00:08:24,610 --> 00:08:25,920 Mas eles são, no entanto uma cópia. 204 00:08:25,920 --> 00:08:30,020 >> E agora, no contexto de swap, Eu sou de fato com sucesso 205 00:08:30,020 --> 00:08:31,180 alterando a e b. 206 00:08:31,180 --> 00:08:33,000 Na verdade, vamos fazer um rápido teste de sanidade. 207 00:08:33,000 --> 00:08:36,830 Imprimir um f é% i, a nova linha. 208 00:08:36,830 --> 00:08:38,770 E ficha vamos em um. 209 00:08:38,770 --> 00:08:41,830 Agora vamos fazer a mesma coisa com b. 210 00:08:41,830 --> 00:08:43,640 E vamos fazer a mesma coisa aqui. 211 00:08:43,640 --> 00:08:47,260 >> E agora, deixe-me copiar as mesmas linhas novamente na parte inferior da função 212 00:08:47,260 --> 00:08:51,250 depois dos meus três linhas de interessante poderia ter executado, e 213 00:08:51,250 --> 00:08:53,270 imprimir a e b novamente. 214 00:08:53,270 --> 00:08:56,030 Então agora vamos fazer isso, não fazem swap. 215 00:08:56,030 --> 00:08:58,430 Deixe-me fazer a janela do terminal um pouco mais alto, para que possamos ver 216 00:08:58,430 --> 00:08:59,520 mais do que uma vez. 217 00:08:59,520 --> 00:09:00,860 >> E executar nenhum swap. 218 00:09:00,860 --> 00:09:04,000 x é 1, y é 2. a é 1, b é 2. 219 00:09:04,000 --> 00:09:06,070 E, em seguida, a é 2, b é 1. 220 00:09:06,070 --> 00:09:09,390 Então, ele está trabalhando, assim como Jess fiz aqui dentro de swap. 221 00:09:09,390 --> 00:09:13,090 Mas, claro, ele está tendo nenhum efeito sobre as variáveis ​​principal. 222 00:09:13,090 --> 00:09:15,360 >> Então vimos um truque pelo qual poderia corrigir isso, certo? 223 00:09:15,360 --> 00:09:19,560 Quando você se depara com este escopo problema, você poderia apenas punt e fazer x 224 00:09:19,560 --> 00:09:22,400 e y que tipo de variáveis ​​em vez disso? 225 00:09:22,400 --> 00:09:23,390 >> Você poderia torná-los global. 226 00:09:23,390 --> 00:09:27,560 Coloque-os no topo do arquivo como fizemos, mesmo no jogo da 15. 227 00:09:27,560 --> 00:09:28,890 Nós usamos uma variável global. 228 00:09:28,890 --> 00:09:32,420 Mas, no contexto de um jogo 15, é razoável ter um mundial 229 00:09:32,420 --> 00:09:37,170 variável que representa o conselho, porque a totalidade de todos é 15.c 230 00:09:37,170 --> 00:09:38,650 sobre a implementação desse jogo. 231 00:09:38,650 --> 00:09:41,470 Isso é o que existe no arquivo para fazer. 232 00:09:41,470 --> 00:09:44,170 >> Mas, neste caso aqui, eu sou chamando uma troca de função. 233 00:09:44,170 --> 00:09:45,380 Quero trocar duas variáveis. 234 00:09:45,380 --> 00:09:48,950 E isso deve começar a se sentir apenas desleixado se a solução para todas as nossas 235 00:09:48,950 --> 00:09:51,300 problemas quando são executados no escopo questões é torná-lo global. 236 00:09:51,300 --> 00:09:54,730 Devido muito rapidamente nosso programa é vai se tornar uma grande bagunça. 237 00:09:54,730 --> 00:09:57,760 E nós fizemos isso com muita moderação como resultado, em 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Mas acontece que há uma melhor maneira completamente. 239 00:10:00,470 --> 00:10:05,600 Permitam-me, na verdade, voltar atrás e apagar a imprimir de f, apenas para simplificar o código. 240 00:10:05,600 --> 00:10:09,160 E deixe-me propor que este, de fato, é ruim. 241 00:10:09,160 --> 00:10:15,990 Mas se eu, em vez de adicionar alguns asteriscos e as estrelas, posso transformar isso em vez 242 00:10:15,990 --> 00:10:18,670 função em que é realmente operacional. 243 00:10:18,670 --> 00:10:25,020 >> Então deixe-me voltar aqui e admitir dizendo asteriscos é sempre difícil, 244 00:10:25,020 --> 00:10:26,170 então eu vou dizer estrelas. 245 00:10:26,170 --> 00:10:27,660 Vou confessar para isso. 246 00:10:27,660 --> 00:10:28,190 Tudo bem. 247 00:10:28,190 --> 00:10:30,190 E agora, o que eu vou fazer em vez disso? 248 00:10:30,190 --> 00:10:34,130 >> Então, primeiro de tudo, eu vou especificar que em vez de passar um int em 249 00:10:34,130 --> 00:10:37,980 a função swap, estou vez de vai dizer int estrela. 250 00:10:37,980 --> 00:10:39,170 Agora, o que a estrela indica? 251 00:10:39,170 --> 00:10:41,970 Esta é a ideia de que um ponteiro que Binky, o personagem claymation, foi 252 00:10:41,970 --> 00:10:43,465 referindo-se a um momento atrás. 253 00:10:43,465 --> 00:10:47,610 >> Então, se nós dizemos int estrela, o significado de isto agora é que uma não vai ser 254 00:10:47,610 --> 00:10:49,110 passado pelo seu valor. 255 00:10:49,110 --> 00:10:50,350 Ele não vai ser copiado dentro 256 00:10:50,350 --> 00:10:54,700 Em vez disso, o endereço é um vai ser passado dentro 257 00:10:54,700 --> 00:10:57,840 >> Então, lembro que dentro do seu computador é um monte de memória, caso contrário, 258 00:10:57,840 --> 00:10:58,760 conhecido como RAM. 259 00:10:58,760 --> 00:11:00,520 E que a RAM é apenas uma grupo inteiro de bytes. 260 00:11:00,520 --> 00:11:03,320 Portanto, se o seu Mac ou PC tem dois gigabytes, você tem 2 261 00:11:03,320 --> 00:11:05,760 bilhão de bytes de memória. 262 00:11:05,760 --> 00:11:08,440 >> Agora vamos supor que apenas a manter as coisas agradáveis ​​e ordenada, que 263 00:11:08,440 --> 00:11:09,450 atribuir um endereço - 264 00:11:09,450 --> 00:11:10,170 um número - 265 00:11:10,170 --> 00:11:12,270 para cada byte de memória RAM em seu computador. 266 00:11:12,270 --> 00:11:15,410 O primeiro byte dos dois bilhões é pelo número zero. 267 00:11:15,410 --> 00:11:18,572 O seguinte é um número de um byte, o número dois, todo o caminho para cima, dot dot 268 00:11:18,572 --> 00:11:20,530 ponto, para cerca de 2 bilhões de dólares. 269 00:11:20,530 --> 00:11:23,640 >> Assim, você pode número de bytes de memória em seu computador. 270 00:11:23,640 --> 00:11:26,460 Então vamos supor que isso é o que queremos dizer com um endereço. 271 00:11:26,460 --> 00:11:31,360 Então, quando eu vejo uma estrela int, o que está acontecendo para ser passado em troca agora é o 272 00:11:31,360 --> 00:11:32,830 endereço de um. 273 00:11:32,830 --> 00:11:37,150 Não o seu valor, mas seja qual for o seu postal endereço é, por assim dizer - 274 00:11:37,150 --> 00:11:38,810 a sua localização na RAM. 275 00:11:38,810 --> 00:11:41,250 >> E da mesma forma para b, eu vou para dizer a mesma coisa. 276 00:11:41,250 --> 00:11:42,720 Int, estrela, b. 277 00:11:42,720 --> 00:11:46,350 Como um aparte, tecnicamente a estrela poderia ir em outros locais. 278 00:11:46,350 --> 00:11:50,140 Mas vamos padronizar a estrela estar ao lado do tipo de dados. 279 00:11:50,140 --> 00:11:54,080 >> Então trocar assinatura significa que agora, dá-me o endereço de um int, e chamada 280 00:11:54,080 --> 00:11:55,400 que um endereço. 281 00:11:55,400 --> 00:11:58,690 E me dar outro endereço de um int e chamar esse endereço b. 282 00:11:58,690 --> 00:12:01,120 >> Mas agora o meu código aqui tem que mudar. 283 00:12:01,120 --> 00:12:03,470 Porque se eu declarar int temperatura - 284 00:12:03,470 --> 00:12:05,580 que ainda é do tipo int - 285 00:12:05,580 --> 00:12:08,700 mas armazenar nele um, que tipo de valor? 286 00:12:08,700 --> 00:12:12,870 Para ser claro, eu estou pondo um com o código como está escrito agora? 287 00:12:12,870 --> 00:12:14,360 >> Eu estou colocando o local em um. 288 00:12:14,360 --> 00:12:16,500 Mas eu não me importo com o localização agora, certo? 289 00:12:16,500 --> 00:12:21,940 Temp existe apenas terceira xícara de Jess existido, para que finalidade? 290 00:12:21,940 --> 00:12:23,090 Para armazenar um valor. 291 00:12:23,090 --> 00:12:24,830 Leite ou suco de laranja. 292 00:12:24,830 --> 00:12:28,520 Não, na verdade, armazenar o endereço de nenhuma dessas coisas, que se sente um 293 00:12:28,520 --> 00:12:31,200 pouco sem sentido neste verdadeiro contexto do mundo de qualquer maneira. 294 00:12:31,200 --> 00:12:34,990 >> Então, realmente, o que eu quero colocar em temperatura não é o endereço de um, mas a 295 00:12:34,990 --> 00:12:36,180 conteúdo de um. 296 00:12:36,180 --> 00:12:41,930 Então, se a é um número como 123, este é o byte 123 de memória que um só 297 00:12:41,930 --> 00:12:45,090 passa a ser ocupante, que o valor de em que ocorra ser ocupante. 298 00:12:45,090 --> 00:12:49,040 >> Se eu quero ir para esse endereço, Eu preciso dizer uma estrela. 299 00:12:49,040 --> 00:12:52,610 Da mesma forma, se eu fosse para mudar o que é no endereço um, eu mudo 300 00:12:52,610 --> 00:12:53,570 isto para iniciar uma. 301 00:12:53,570 --> 00:12:58,185 Se eu quiser armazenar em que está no localização de um com o que está no local 302 00:12:58,185 --> 00:13:02,180 em b, estrela b estrela. 303 00:13:02,180 --> 00:13:05,340 >> Assim, em breve, mesmo que isso não é muito afundando ainda - e eu não esperaria 304 00:13:05,340 --> 00:13:06,560 que seria tão rápido - 305 00:13:06,560 --> 00:13:11,100 perceber que tudo o que eu estou fazendo é prefixar estas estrelas para os meus variáveis, 306 00:13:11,100 --> 00:13:13,350 dizendo que não pegar os valores. 307 00:13:13,350 --> 00:13:14,520 Não altere os valores. 308 00:13:14,520 --> 00:13:17,600 Mas, sim, ir a esses endereços e obter o valor. 309 00:13:17,600 --> 00:13:21,430 Vá para esse endereço e mudança o valor aí. 310 00:13:21,430 --> 00:13:25,500 >> Então, agora deixe-me rolar para trás até o topo, apenas para corrigir essa linha aqui, a 311 00:13:25,500 --> 00:13:27,690 mudar o protótipo para corresponder. 312 00:13:27,690 --> 00:13:30,280 Mas agora eu preciso fazer uma coisa. 313 00:13:30,280 --> 00:13:35,500 Intuitivamente, se eu mudei os tipos troca de argumentos que está esperando, 314 00:13:35,500 --> 00:13:37,245 o que mais eu preciso alterar no meu código? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Quando eu chamo de swap. 317 00:13:40,840 --> 00:13:43,340 Porque agora, o que eu Eu passando a trocar ainda? 318 00:13:43,340 --> 00:13:47,450 O valor de x e o valor de y, ou o leite eo suco de laranja. 319 00:13:47,450 --> 00:13:48,510 Mas eu não quero fazer isso. 320 00:13:48,510 --> 00:13:51,060 Eu em vez quer passar em quê? 321 00:13:51,060 --> 00:13:53,050 A localização de xe o local de y. 322 00:13:53,050 --> 00:13:55,300 Quais são os seus endereços postais, por assim dizer. 323 00:13:55,300 --> 00:13:57,600 >> Então, para fazer isso, há um e comercial. 324 00:13:57,600 --> 00:13:59,260 Ampersand tipo de sons como o endereço. 325 00:13:59,260 --> 00:14:03,240 assim n, comercial, o endereço de x, e o endereço de Y. 326 00:14:03,240 --> 00:14:06,790 Por isso é deliberado que usamos ampersands ao chamar a função, 327 00:14:06,790 --> 00:14:10,230 e as estrelas quando declarar e quando execução da função. 328 00:14:10,230 --> 00:14:14,220 >> E só de pensar e comercial como o endereço do operador, e uma estrela como o 329 00:14:14,220 --> 00:14:15,490 ir lá operador - 330 00:14:15,490 --> 00:14:18,640 ou, mais corretamente, o Operador de referência. 331 00:14:18,640 --> 00:14:23,480 Então, isso é um monte de palavras apenas para dizer que agora, felizmente, troca vai 332 00:14:23,480 --> 00:14:24,440 a ser corretas. 333 00:14:24,440 --> 00:14:26,550 >> Deixe-me ir em frente e fazer - 334 00:14:26,550 --> 00:14:30,940 vamos realmente mudar o nome do arquivo, para que não este programa ainda ser chamado sem swap. 335 00:14:30,940 --> 00:14:33,240 Eu afirmo que vamos chamá-lo swap.c agora. 336 00:14:33,240 --> 00:14:35,670 Então faça, troque. 337 00:14:35,670 --> 00:14:37,520 Dot, Slash, troque. 338 00:14:37,520 --> 00:14:40,210 >> E agora verdade, x é 1, y é 2. 339 00:14:40,210 --> 00:14:44,040 E então, x é 2, y é um. 340 00:14:44,040 --> 00:14:46,500 Bem, vamos ver se não podemos fazer isso um pouco diferente, como o que é 341 00:14:46,500 --> 00:14:47,180 acontecendo aqui. 342 00:14:47,180 --> 00:14:51,250 Primeiro, deixe-me aproximar em nosso tela de desenho aqui. 343 00:14:51,250 --> 00:14:54,160 E deixe-me propor por um momento - e sempre que eu chamar aqui será espelhado 344 00:14:54,160 --> 00:14:58,660 lá em cima agora - deixe-me propor que aqui está um monte de memória, ou 345 00:14:58,660 --> 00:15:00,540 RAM, dentro do meu computador. 346 00:15:00,540 --> 00:15:04,140 >> E este vai ser o número mordida, digamos, um. 347 00:15:04,140 --> 00:15:05,720 Este será o número 2 bytes. 348 00:15:05,720 --> 00:15:08,220 E eu vou fazer um monte de outras, e em seguida, um grupo de Dot Dot pontos para 349 00:15:08,220 --> 00:15:10,880 indicam que há 2 bilhões destas coisas. 350 00:15:10,880 --> 00:15:13,520 4, 5 e assim por diante. 351 00:15:13,520 --> 00:15:17,055 >> Portanto, há os cinco primeiros bytes de memória do meu computador. 352 00:15:17,055 --> 00:15:17,560 Tudo bem? 353 00:15:17,560 --> 00:15:19,060 Muito poucos de 2 bilhões de dólares. 354 00:15:19,060 --> 00:15:21,120 Mas agora eu vou propor a seguir. 355 00:15:21,120 --> 00:15:27,490 Vou propor que x vai armazenar o número 1, e y vai 356 00:15:27,490 --> 00:15:29,690 para armazenar o número 2. 357 00:15:29,690 --> 00:15:35,000 E deixe-me ir em frente agora e representa estes valores como segue. 358 00:15:35,000 --> 00:15:41,510 >> Vamos fazer isso da seguinte forma. 359 00:15:41,510 --> 00:15:42,870 Dê-me apenas um segundo. 360 00:15:42,870 --> 00:15:44,150 Um segundo. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Eu quero fazer isso um pouco - 363 00:15:47,560 --> 00:15:50,440 vamos fazer isso de novo. 364 00:15:50,440 --> 00:15:53,250 Caso contrário, eu vou e usando o mesmos números, sem querer, 365 00:15:53,250 --> 00:15:54,230 várias vezes. 366 00:15:54,230 --> 00:15:57,320 >> Então, só por isso temos números diferentes para falar, vamos chamar isso de byte 367 00:15:57,320 --> 00:16:03,391 número 123, 124, 125, 126, e dot dot dot. 368 00:16:03,391 --> 00:16:08,400 E deixe-me afirmar agora que eu vou colocar o valor 1 aqui, e o valor de 2 369 00:16:08,400 --> 00:16:11,990 aqui, também conhecido como x e y. 370 00:16:11,990 --> 00:16:15,300 Então, acontece que este é x, isto é y. 371 00:16:15,300 --> 00:16:18,180 >> E só por algum acaso, o computador, o sistema operativo, 372 00:16:18,180 --> 00:16:21,890 passou a colocar x no local número 123. 373 00:16:21,890 --> 00:16:25,590 E y acabou no local 124 - 374 00:16:25,590 --> 00:16:26,330 caramba. 375 00:16:26,330 --> 00:16:28,700 Eu deveria ter corrigido isso. 376 00:16:28,700 --> 00:16:34,040 Oh homem, que eu realmente quero fazer isso? 377 00:16:34,040 --> 00:16:37,340 Sim, eu quero corrigir isso e b adequada sobre isso hoje. 378 00:16:37,340 --> 00:16:39,950 Desculpe, novo nisso. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, e eu não quero ser essa complexo, mas por que eu mudar o 380 00:16:45,020 --> 00:16:46,340 números lá? 381 00:16:46,340 --> 00:16:48,360 Porque eu quero que os ints para na verdade, ser de quatro bytes. 382 00:16:48,360 --> 00:16:49,810 Então, vamos ser super anal sobre isso. 383 00:16:49,810 --> 00:16:53,800 Assim, se um passa a ser endereçado 123, o 2 vai ser no endereço 384 00:16:53,800 --> 00:16:55,730 127, porque isso é apenas 4 despedidas distância. 385 00:16:55,730 --> 00:16:56,210 Isto é tudo. 386 00:16:56,210 --> 00:16:58,640 E vamos esquecer tudo o outros endereços do mundo. 387 00:16:58,640 --> 00:17:03,320 >> Assim x está na posição 123, Y está na posição 127. 388 00:17:03,320 --> 00:17:05,770 E agora, o que eu realmente quer fazer? 389 00:17:05,770 --> 00:17:10,099 Quando eu chamo de swap agora, o que é realmente está acontecendo? 390 00:17:10,099 --> 00:17:14,920 Bem, quando eu chamo de swap, eu estou passando em o endereço de X e o endereço de Y. 391 00:17:14,920 --> 00:17:18,540 Assim, por exemplo, se estas duas peças de papel representam agora os dois 392 00:17:18,540 --> 00:17:23,510 argumentos a e b para trocar, o que eu sou indo para escrever na primeira delas, 393 00:17:23,510 --> 00:17:27,720 que eu vou ligar para o referem como um? 394 00:17:27,720 --> 00:17:30,610 >> Exatamente, 123. 395 00:17:30,610 --> 00:17:31,905 Então, isso eu afirmo é um. 396 00:17:31,905 --> 00:17:32,955 Este é um parâmetro. 397 00:17:32,955 --> 00:17:35,856 Estou colocando o endereço de x ali. 398 00:17:35,856 --> 00:17:38,152 >> O que é isso? 399 00:17:38,152 --> 00:17:40,890 >> O que é isso? 400 00:17:40,890 --> 00:17:41,190 >> Não, não. 401 00:17:41,190 --> 00:17:41,720 Isso é OK. 402 00:17:41,720 --> 00:17:42,570 Ainda bem, ainda bem. 403 00:17:42,570 --> 00:17:43,530 Portanto, este é um. 404 00:17:43,530 --> 00:17:46,240 E agora no segundo pedaço de papel, este vai ser b, e que sou eu 405 00:17:46,240 --> 00:17:49,010 vai ser escrita em este pedaço de papel? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Então a única coisa que mudou desde nosso entendimento anterior desta história é, 408 00:17:53,720 --> 00:17:58,590 ao invés de, literalmente, um e dois, eu sou vai passar em 123 e 127. 409 00:17:58,590 --> 00:18:02,130 E eu estou indo agora para colocá-los dentro desta caixa, certo? 410 00:18:02,130 --> 00:18:04,640 Assim que a caixa preta representa agora a função swap. 411 00:18:04,640 --> 00:18:07,230 >> Enquanto isso, vamos agora ter alguém implementar a função swap. 412 00:18:07,230 --> 00:18:09,090 Será que alguém aqui gostaria de ser voluntário? 413 00:18:09,090 --> 00:18:09,560 Vamos para cima. 414 00:18:09,560 --> 00:18:11,080 Qual é o seu nome? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Tudo bem, Charlie. 417 00:18:12,080 --> 00:18:14,810 Vamos para cima. 418 00:18:14,810 --> 00:18:17,310 >> Então, Charlie vai jogar o papel do nosso caixa preta. 419 00:18:17,310 --> 00:18:21,460 E Charlie, o que eu gostaria que você faça agora é implementar permuta de tal maneira 420 00:18:21,460 --> 00:18:25,320 que, dado os dois endereços, você estava indo realmente 421 00:18:25,320 --> 00:18:26,330 para alterar os valores. 422 00:18:26,330 --> 00:18:28,290 E eu vou sussurrar em seu ouvido como executar a TV aqui. 423 00:18:28,290 --> 00:18:29,930 >> Então vá em frente, e você é a caixa preta. 424 00:18:29,930 --> 00:18:30,920 Chegar lá. 425 00:18:30,920 --> 00:18:34,054 Que valores você vê um, e os valores que você vê para b? 426 00:18:34,054 --> 00:18:36,740 >> Nash: a é 123 e b é 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, exatamente. 428 00:18:37,530 --> 00:18:38,940 Agora, há uma pausa por um momento. 429 00:18:38,940 --> 00:18:41,680 A primeira coisa que você vai fazer agora, de acordo com o código - que 430 00:18:41,680 --> 00:18:43,220 Agora eu vou puxar para cima na tela - 431 00:18:43,220 --> 00:18:46,750 vai ser para alocar um pouco bit de memória chamado Temp. 432 00:18:46,750 --> 00:18:48,850 Então, eu estou indo para ir em frente e dar-lhe a memória. 433 00:18:48,850 --> 00:18:52,210 >> Então, isso vai ser uma terceira variável que você tem acesso a 434 00:18:52,210 --> 00:18:54,080 você chamado Temp. 435 00:18:54,080 --> 00:18:57,120 E o que você vai escrever no pedaço de papel temporária? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Ponteiros, certo? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, bem, não necessariamente ponteiros. 439 00:19:04,790 --> 00:19:07,230 Assim, a linha de código que eu tenho destaque no lado direito, 440 00:19:07,230 --> 00:19:07,900 vamos começar por aí. 441 00:19:07,900 --> 00:19:08,890 Ele diz que uma estrela. 442 00:19:08,890 --> 00:19:11,670 Assim, uma está armazenando o número 123. 443 00:19:11,670 --> 00:19:16,660 E, assim, intuitivamente, o que que estrela 123 significa? 444 00:19:16,660 --> 00:19:21,630 >> Mas especificamente, se é um 123, uma estrela significa o quê? 445 00:19:21,630 --> 00:19:22,560 O valor de um. 446 00:19:22,560 --> 00:19:24,580 Ou, mais casual, vá lá. 447 00:19:24,580 --> 00:19:28,620 Então deixe-me propor que, segurando a uma em sua mão, vá em frente e tratar esse 448 00:19:28,620 --> 00:19:29,430 como se fosse um mapa. 449 00:19:29,430 --> 00:19:32,940 E caminhar-se para o computador do memória, e encontrar-nos o que é 450 00:19:32,940 --> 00:19:36,520 na posição 123. 451 00:19:36,520 --> 00:19:37,720 Exatamente. 452 00:19:37,720 --> 00:19:41,100 >> Assim, vemos na posição 123 é o que, obviamente,? 453 00:19:41,100 --> 00:19:44,240 OK, então o valor agora é você vai colocar em temperatura? 454 00:19:44,240 --> 00:19:44,750 Exatamente. 455 00:19:44,750 --> 00:19:45,600 Então vá em frente e fazer isso. 456 00:19:45,600 --> 00:19:51,280 E escreva o número 1 no pedaço de papel que está atualmente intitulado temporária. 457 00:19:51,280 --> 00:19:53,540 >> E agora o próximo passo que você está indo para implementar 458 00:19:53,540 --> 00:19:54,310 vai ser o quê. 459 00:19:54,310 --> 00:19:57,820 Bem, no lado direito da próxima linha de código é a estrela b. b, de 460 00:19:57,820 --> 00:19:59,260 Claro, armazena um endereço. 461 00:19:59,260 --> 00:20:02,270 Que aborda 127. 462 00:20:02,270 --> 00:20:06,620 Estrela b significa que, casualmente falando? 463 00:20:06,620 --> 00:20:08,700 >> Vá para esse local. 464 00:20:08,700 --> 00:20:14,988 Então vá em frente e encontrar-nos o que é na posição 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Claro que, na posição 127, ainda é o valor 2. 467 00:20:19,170 --> 00:20:24,060 Então, o que você está indo agora em loja o que está no local em um? 468 00:20:24,060 --> 00:20:26,860 Então, estrela um meio ir para o local a. 469 00:20:26,860 --> 00:20:29,770 Qual é a localização de um? 470 00:20:29,770 --> 00:20:30,430 >> Exatamente. 471 00:20:30,430 --> 00:20:34,190 Então, agora, se você quiser mudar o que está naquele local - 472 00:20:34,190 --> 00:20:36,470 Eu vou em frente e correr a borracha está aqui. 473 00:20:36,470 --> 00:20:37,760 E agora colocá-lo novamente na escova. 474 00:20:37,760 --> 00:20:42,190 Qual é o número que você vai escrever na caixa em branco agora? 475 00:20:42,190 --> 00:20:42,850 >> Exatamente. 476 00:20:42,850 --> 00:20:46,470 Portanto, esta linha de código, para ser claro - vamos me pausar o que Charlie está fazendo e 477 00:20:46,470 --> 00:20:51,730 salientar aqui, que ele acabou de fazer é escrever para a caixa no local 123 478 00:20:51,730 --> 00:20:55,150 O valor que foi anteriormente em b. 479 00:20:55,150 --> 00:20:59,140 E assim temos agora implementada de fato Nesta segunda linha de código. 480 00:20:59,140 --> 00:21:01,920 >> Agora, infelizmente, não há ainda uma linha restante. 481 00:21:01,920 --> 00:21:04,900 Agora o que está em temp, literalmente? 482 00:21:04,900 --> 00:21:06,200 É óbvio que é o número um. 483 00:21:06,200 --> 00:21:07,020 Isso não é um endereço. 484 00:21:07,020 --> 00:21:09,380 É apenas um número, uma espécie de uma variável a partir de uma semana. 485 00:21:09,380 --> 00:21:13,520 >> E agora, quando você diz estrela b, o que significa ir para o endereço de b, que é de 486 00:21:13,520 --> 00:21:15,090 curso aqui. 487 00:21:15,090 --> 00:21:16,020 Então, quando você chegar lá - 488 00:21:16,020 --> 00:21:18,320 Eu vou em frente e apagar o que é realmente lá - e que é você 489 00:21:18,320 --> 00:21:20,820 vai escrever agora em 127 localização? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, que é um. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, que é um. 492 00:21:23,430 --> 00:21:25,670 E o que acontece a temperatura no final? 493 00:21:25,670 --> 00:21:26,600 Bem, nós realmente não sabemos. 494 00:21:26,600 --> 00:21:27,420 Nós realmente não me importo. 495 00:21:27,420 --> 00:21:31,090 Toda vez que nós implementamos uma função até o momento, todas as variáveis ​​locais você tem 496 00:21:31,090 --> 00:21:31,890 são, de fato local. 497 00:21:31,890 --> 00:21:33,060 E eles simplesmente desaparecem. 498 00:21:33,060 --> 00:21:35,040 Eles estão recuperados pela operação sistema eventualmente. 499 00:21:35,040 --> 00:21:39,800 >> Assim, o facto de que ainda tem a temperatura valor 1 é uma espécie de fundamentalmente 500 00:21:39,800 --> 00:21:41,150 desinteressante para nós. 501 00:21:41,150 --> 00:21:43,100 Tudo bem, então uma salva de palmas se pudéssemos para Charlie. 502 00:21:43,100 --> 00:21:46,400 Muito bem feito. 503 00:21:46,400 --> 00:21:51,520 >> Tudo bem, então o que mais faz Isso significa que nós podemos fazer? 504 00:21:51,520 --> 00:21:54,400 Assim, verifica-se que temos sido contando algumas mentirinhas 505 00:21:54,400 --> 00:21:55,540 por algum tempo. 506 00:21:55,540 --> 00:21:59,990 De fato, verifica-se que a corda, todo este tempo, não é realmente um 507 00:21:59,990 --> 00:22:02,190 seqüência de caracteres por si só. 508 00:22:02,190 --> 00:22:03,980 É o tipo de é que intuitivamente. 509 00:22:03,980 --> 00:22:08,270 >> Mas, tecnicamente falando, a string é uma tipo de dados que declarada dentro de 510 00:22:08,270 --> 00:22:12,170 a biblioteca CS50 para simplificar o mundo para as primeiras semanas de aula. 511 00:22:12,170 --> 00:22:20,130 O que uma string é realmente é o endereço de um personagem em algum lugar na RAM. 512 00:22:20,130 --> 00:22:25,530 A corda é realmente um número, como 123 ou 127, que passa a demarcar 513 00:22:25,530 --> 00:22:28,420 onde uma string começa em a memória do seu computador. 514 00:22:28,420 --> 00:22:31,870 >> Mas isso não representa a cadeia, por si só, em si. 515 00:22:31,870 --> 00:22:33,460 E podemos ver isso da seguinte forma. 516 00:22:33,460 --> 00:22:35,980 Deixe-me ir em frente e abrir algum código que está entre 517 00:22:35,980 --> 00:22:38,340 exemplos de código fonte de hoje. 518 00:22:38,340 --> 00:22:42,225 E eu estou indo para ir em frente e abrir até, digamos, compare-0.C. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Este é um programa buggy que vai para ser implementada como se segue. 521 00:22:48,790 --> 00:22:49,040 >> First. 522 00:22:49,040 --> 00:22:50,420 Eu vou dizer uma coisa. 523 00:22:50,420 --> 00:22:52,660 Então, eu estou indo para ir em frente e obter uma string do usuário 524 00:22:52,660 --> 00:22:53,750 nessa linha seguinte. 525 00:22:53,750 --> 00:22:55,370 Então eu vou dizê-lo novamente. 526 00:22:55,370 --> 00:22:57,540 Então eu vou ter outra corda do usuário. 527 00:22:57,540 --> 00:23:00,390 >> E notem, eu estou mostrando um dos cordas em uma variável chamada s, e 528 00:23:00,390 --> 00:23:03,040 outra dessas cordas em uma variável chamada t. 529 00:23:03,040 --> 00:23:07,480 E agora eu vou reclamar, muito razoavelmente, que se s é igual é igual a t, 530 00:23:07,480 --> 00:23:08,940 as cordas são as mesmas. 531 00:23:08,940 --> 00:23:09,970 Você digita a mesma coisa. 532 00:23:09,970 --> 00:23:11,830 Caso contrário, as cordas são não é a mesma coisa. 533 00:23:11,830 --> 00:23:15,440 >> Afinal de contas, se a entrada de dois inteiros, dois caracteres, dois carros alegóricos, dois duplos, todos de 534 00:23:15,440 --> 00:23:18,400 os tipos de dados que nós falamos até agora para compará-los - 535 00:23:18,400 --> 00:23:22,070 lembro que fizemos muito claro há um tempo atrás que você não fazer isso, porque a 536 00:23:22,070 --> 00:23:25,840 único sinal de igualdade é, naturalmente, o operador de atribuição. 537 00:23:25,840 --> 00:23:26,820 Então, isso seria um erro. 538 00:23:26,820 --> 00:23:29,260 >> Nós usamos o sinal de igual igual, que de fato se compara 539 00:23:29,260 --> 00:23:31,050 coisas para uma verdadeira igualdade. 540 00:23:31,050 --> 00:23:32,275 Mas eu afirmo isso é buggy. 541 00:23:32,275 --> 00:23:37,400 Se eu ir em frente e fazer comparar zero, e então não dot barra comparar zero. 542 00:23:37,400 --> 00:23:39,700 E eu digitar, vamos dizer, Olá. 543 00:23:39,700 --> 00:23:41,590 E então, vamos dizer Olá novamente. 544 00:23:41,590 --> 00:23:46,040 Literalmente a mesma coisa, o computador reclamações que eu digitei coisas diferentes. 545 00:23:46,040 --> 00:23:47,640 >> Agora, talvez eu apenas digitado errado alguma coisa. 546 00:23:47,640 --> 00:23:49,910 Eu vou escrever meu nome neste momento. 547 00:23:49,910 --> 00:23:52,580 Quero dizer, Olá. 548 00:23:52,580 --> 00:23:54,770 Olá. 549 00:23:54,770 --> 00:23:57,360 É diferente a cada momento. 550 00:23:57,360 --> 00:23:58,430 >> Bem, por que isso? 551 00:23:58,430 --> 00:24:00,140 O que realmente está acontecendo debaixo do capô? 552 00:24:00,140 --> 00:24:03,270 Bem, o que realmente está acontecendo por baixo a capa é a cadeia, em seguida, 553 00:24:03,270 --> 00:24:07,410 Eu digitei em que pela primeira vez, por exemplo, é a palavra Olá, é claro. 554 00:24:07,410 --> 00:24:11,660 Mas se representar esta embaixo o capô, lembre-se que uma 555 00:24:11,660 --> 00:24:13,470 string é em uma matriz. 556 00:24:13,470 --> 00:24:15,040 E nós dissemos, tanto no passado. 557 00:24:15,040 --> 00:24:20,200 >> Então, se eu tirar essa matriz como este, eu sou vai representar algo muito 558 00:24:20,200 --> 00:24:23,030 semelhante ao que fizemos há pouco. 559 00:24:23,030 --> 00:24:25,390 E há realmente algo especial também. 560 00:24:25,390 --> 00:24:28,090 O que nós fizemos foi determinar a Ao final de cada corda? 561 00:24:28,090 --> 00:24:30,760 Sim, esta barra invertida zero, o que é apenas a forma de representação, 562 00:24:30,760 --> 00:24:33,610 literalmente, 00000000. 563 00:24:33,610 --> 00:24:35,680 Oito bits 0 em uma fileira. 564 00:24:35,680 --> 00:24:37,610 >> Eu não sei, francamente, o que é depois disso. 565 00:24:37,610 --> 00:24:40,090 Isso é apenas um bando de mais memória RAM dentro do meu computador. 566 00:24:40,090 --> 00:24:40,970 Mas esta é uma matriz. 567 00:24:40,970 --> 00:24:42,260 Nós conversamos sobre matrizes antes. 568 00:24:42,260 --> 00:24:45,010 E nós tipicamente falar sobre matrizes como sendo localização zero, 569 00:24:45,010 --> 00:24:46,580 em seguida, um, depois dois. 570 00:24:46,580 --> 00:24:47,950 Mas isso é apenas por conveniência. 571 00:24:47,950 --> 00:24:49,380 E isso é totalmente relativo. 572 00:24:49,380 --> 00:24:53,010 >> Quando você está realmente ficando memória o computador, é, claro, qualquer 573 00:24:53,010 --> 00:24:55,450 2 bilhões de alguns bytes ímpares, potencialmente. 574 00:24:55,450 --> 00:24:59,100 Então, realmente debaixo do capô, todo esse tempo, sim. 575 00:24:59,100 --> 00:25:01,670 Isso pode muito bem ser o suporte zero. 576 00:25:01,670 --> 00:25:04,780 Mas se você cavar ainda mais fundo por baixo o capô, que é realmente 577 00:25:04,780 --> 00:25:07,000 abordar número 123. 578 00:25:07,000 --> 00:25:09,150 Este é o endereço 124. 579 00:25:09,150 --> 00:25:11,040 Este é o endereço 125. 580 00:25:11,040 --> 00:25:12,540 >> E eu não queria estragar esse momento. 581 00:25:12,540 --> 00:25:15,840 Estes são agora uma bytes separados por qual razão? 582 00:25:15,840 --> 00:25:17,930 Quão grande é um char? 583 00:25:17,930 --> 00:25:19,170 Um char é apenas um byte. 584 00:25:19,170 --> 00:25:20,570 Um int é tipicamente quatro bytes. 585 00:25:20,570 --> 00:25:24,850 É por isso que eu fiz 123, 127, 131 e assim por diante. 586 00:25:24,850 --> 00:25:27,560 Agora eu posso manter a matemática simples e apenas fazer mais 1. 587 00:25:27,560 --> 00:25:30,510 E isso agora é o que está realmente acontecendo por baixo do capô. 588 00:25:30,510 --> 00:25:37,760 >> Então, quando você declarar algo como isso, string s, este é, na verdade - 589 00:25:37,760 --> 00:25:39,170 acontece - 590 00:25:39,170 --> 00:25:41,190 estrela Char. 591 00:25:41,190 --> 00:25:44,640 Star, é claro, significa endereço, ponteiro aka. 592 00:25:44,640 --> 00:25:46,200 Portanto, é o endereço de alguma coisa. 593 00:25:46,200 --> 00:25:47,510 O que é o endereço do? 594 00:25:47,510 --> 00:25:47,760 >> Bem - 595 00:25:47,760 --> 00:25:51,680 Eu sou o único que pode ver o muito ponto importante que eu estou fazendo, ou pensam 596 00:25:51,680 --> 00:25:52,560 Eu estou fazendo. 597 00:25:52,560 --> 00:25:55,270 Então string - 598 00:25:55,270 --> 00:25:57,180 o triste é que eu tenho um monitor lá onde eu 599 00:25:57,180 --> 00:25:58,100 poderia ter visto isso. 600 00:25:58,100 --> 00:26:00,990 >> Tudo bem, então string s é o que Eu declarei anteriormente. 601 00:26:00,990 --> 00:26:04,600 Mas acontece que, graças a um pouco magia na biblioteca CS50, tudo isso 602 00:26:04,600 --> 00:26:08,780 string de hora tem literalmente foi estrela de char. 603 00:26:08,780 --> 00:26:11,310 A estrela significa novamente ponteiro ou endereço. 604 00:26:11,310 --> 00:26:14,180 O fato de que ele é o acompanhamento caracter de palavra significa que é a 605 00:26:14,180 --> 00:26:15,970 endereço de um personagem. 606 00:26:15,970 --> 00:26:23,100 >> Então, se conseguir string é chamado, e eu digito em H-E-L-L-O, propor agora o que se 607 00:26:23,100 --> 00:26:27,330 corda sido literalmente voltando todos Neste momento, mesmo que nós, em vez 608 00:26:27,330 --> 00:26:29,980 simplista do mundo? 609 00:26:29,980 --> 00:26:33,310 O que significa obter corda realmente retornar como seu valor de retorno? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123, neste caso, por exemplo. 612 00:26:38,720 --> 00:26:42,630 Nós já disse anteriormente que se cadeia simplesmente retorna uma string, uma seqüência de 613 00:26:42,630 --> 00:26:43,300 caracteres. 614 00:26:43,300 --> 00:26:44,790 Mas isso é um pouco de uma mentira branca. 615 00:26:44,790 --> 00:26:48,010 A forma como se cordas realmente funciona debaixo do capô é que fica a 616 00:26:48,010 --> 00:26:48,930 corda do usuário. 617 00:26:48,930 --> 00:26:51,530 Ele se estatela os personagens que ele ou ela tipos de memória. 618 00:26:51,530 --> 00:26:54,680 Ela coloca um zero barra invertida no final daqueles sequência de caracteres. 619 00:26:54,680 --> 00:26:57,310 >> Mas então o que se cadeia literalmente voltar? 620 00:26:57,310 --> 00:27:02,710 É, literalmente, retorna o endereço do primeiros bytes na RAM que 621 00:27:02,710 --> 00:27:04,130 é usado para essa força. 622 00:27:04,130 --> 00:27:07,500 E verifica-se que apenas devolvendo um único endereço da 623 00:27:07,500 --> 00:27:12,120 primeiro caractere na string, que é suficiente para encontrar a totalidade 624 00:27:12,120 --> 00:27:12,630 a string. 625 00:27:12,630 --> 00:27:16,930 >> Em outras palavras, obter a cadeia não tem para retornar 123 e 124 e 125. 626 00:27:16,930 --> 00:27:19,950 Ele não tem que me dar um longo lista de todos os bytes 627 00:27:19,950 --> 00:27:20,740 minha corda está usando. 628 00:27:20,740 --> 00:27:22,670 Porque um, todos eles estão de volta para trás. 629 00:27:22,670 --> 00:27:28,160 E segundo, com base no primeiro endereço, I pode descobrir onde a string termina. 630 00:27:28,160 --> 00:27:29,910 Como? 631 00:27:29,910 --> 00:27:33,490 >> O caractere nulo especial, a barra invertida zero no final. 632 00:27:33,490 --> 00:27:35,430 Assim, em outras palavras, se você passa ao redor - 633 00:27:35,430 --> 00:27:36,530 dentro das variáveis ​​- 634 00:27:36,530 --> 00:27:41,300 o endereço de um char, e assume que, no final de qualquer cadeia, qualquer 635 00:27:41,300 --> 00:27:45,040 seqüência de caracteres como nós, seres humanos pensar em cordas, se você assumir que 636 00:27:45,040 --> 00:27:48,600 no final de tal cadeia há um zero barra invertida, você é ouro. 637 00:27:48,600 --> 00:27:52,430 Porque você sempre pode encontrar no final de uma string. 638 00:27:52,430 --> 00:27:54,870 >> Agora o que realmente está acontecendo, em seguida, em neste programa? 639 00:27:54,870 --> 00:27:59,990 Porque é que este programa, comparar-0.C, com bugs? 640 00:27:59,990 --> 00:28:01,690 O que realmente está sendo comparado? 641 00:28:01,690 --> 00:28:02,420 Sim? 642 00:28:02,420 --> 00:28:05,000 >> Estudante: [inaudível]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Exatamente. 644 00:28:05,730 --> 00:28:08,350 É comparando as posições das cordas. 645 00:28:08,350 --> 00:28:12,420 Portanto, se o usuário digitou em Olá uma vez, como eu fiz, a memória pode acabar 646 00:28:12,420 --> 00:28:13,430 desse jeito. 647 00:28:13,430 --> 00:28:18,210 Se, em seguida, o usuário digita em Olá novamente, mas chamando obter corda de novo, c é 648 00:28:18,210 --> 00:28:21,800 não é particularmente inteligente, a menos que você ensina que ele seja inteligente, escrevendo código. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 e computadores em geral - 651 00:28:23,860 --> 00:28:27,370 se você digitar a palavra Olá novamente, você sabe o que você vai conseguir. 652 00:28:27,370 --> 00:28:31,480 Você está indo só para ter uma segunda matriz de memória que, sim, acontece ser 653 00:28:31,480 --> 00:28:35,510 armazenar H-E-L-L-S e assim por diante. 654 00:28:35,510 --> 00:28:38,240 >> Vai ter a mesma aparência de nós seres humanos, mas este endereço 655 00:28:38,240 --> 00:28:39,460 pode não ser 123. 656 00:28:39,460 --> 00:28:42,470 Ele só poderia acontecer que o sistema operativo tem alguns disponíveis 657 00:28:42,470 --> 00:28:45,430 espaço, por exemplo, a localização - 658 00:28:45,430 --> 00:28:49,820 digamos que algo arbitrário, como este é local 200. 659 00:28:49,820 --> 00:28:51,620 E este é o local 201. 660 00:28:51,620 --> 00:28:53,060 E este é o local 202. 661 00:28:53,060 --> 00:28:55,730 Nós não temos nenhuma idéia de onde isso é vai ser na memória. 662 00:28:55,730 --> 00:28:59,110 >> Mas o que isso significa é que o que é vai ser armazenado, finalmente, em s? 663 00:28:59,110 --> 00:29:00,750 O número 123. 664 00:29:00,750 --> 00:29:04,860 O que vai ser armazenada em t, neste exemplo arbitrária? 665 00:29:04,860 --> 00:29:06,300 O número 200. 666 00:29:06,300 --> 00:29:11,410 E tudo isso significa, então, é claro, 123 não é igual a 200. 667 00:29:11,410 --> 00:29:14,940 E assim esta condição nunca se avaliada como verdadeira. 668 00:29:14,940 --> 00:29:18,430 Porque corda get está usando diferentes pedaços de memória de cada vez. 669 00:29:18,430 --> 00:29:20,360 >> Agora podemos ver isso de novo noutro exemplo. 670 00:29:20,360 --> 00:29:23,764 Deixe-me ir em frente e abrir cópia 0.C. 671 00:29:23,764 --> 00:29:28,770 Eu afirmo que este exemplo vai tentar - mas não - copiar duas cordas 672 00:29:28,770 --> 00:29:29,910 como se segue. 673 00:29:29,910 --> 00:29:31,730 >> Eu vou dizer uma coisa para o utilizador. 674 00:29:31,730 --> 00:29:34,490 Estou passando então a ter uma corda e chamá-lo s. 675 00:29:34,490 --> 00:29:36,400 E agora, eu estou fazendo essa verificação aqui. 676 00:29:36,400 --> 00:29:37,990 Mencionamos isso um tempo atrás. 677 00:29:37,990 --> 00:29:42,490 Mas quando pode ter seqüência de retorno null, outro caractere especial ou especial 678 00:29:42,490 --> 00:29:45,050 símbolo digamos. 679 00:29:45,050 --> 00:29:45,900 Se é falta de memória. 680 00:29:45,900 --> 00:29:48,970 >> Por exemplo, se o usuário é realmente ser difícil e os tipos de atroz 681 00:29:48,970 --> 00:29:51,220 número de caracteres no teclado e batidas Enter. 682 00:29:51,220 --> 00:29:54,580 Se esse número de caracteres simplesmente não pode caber na memória RAM para qualquer louco 683 00:29:54,580 --> 00:29:57,820 razão, bem se poderia corda muito bem retornar nulo. 684 00:29:57,820 --> 00:30:01,080 >> Ou se o seu próprio programa está fazendo muito de outras coisas e não apenas 685 00:30:01,080 --> 00:30:03,790 não há memória suficiente para a corda get para ter sucesso, ele pode acabar 686 00:30:03,790 --> 00:30:05,240 voltando nulo. 687 00:30:05,240 --> 00:30:07,160 Mas vamos ser mais preciso como o que é isso. 688 00:30:07,160 --> 00:30:10,280 Qual é o tipo de dados de s realmente? 689 00:30:10,280 --> 00:30:11,610 Estrela Char. 690 00:30:11,610 --> 00:30:14,560 >> Então não é que agora podemos casca apoiar a camada de nulo. 691 00:30:14,560 --> 00:30:17,500 Acontece que, nula é - sim, obviamente um símbolo especial. 692 00:30:17,500 --> 00:30:19,190 Mas o que é realmente? 693 00:30:19,190 --> 00:30:25,220 Realmente, nulo é apenas um símbolo que os seres humanos usam para representar zero também. 694 00:30:25,220 --> 00:30:29,010 >> Assim, os autores C e computadores mais geralmente, decidiu anos atrás 695 00:30:29,010 --> 00:30:30,010 que, você sabe o quê. 696 00:30:30,010 --> 00:30:34,850 Por que não podemos garantir que nenhum usuário dados é que nunca, nunca, nunca 697 00:30:34,850 --> 00:30:36,730 armazenado a bye Zero? 698 00:30:36,730 --> 00:30:39,610 De fato, mesmo no meu exemplo arbitrário antes, eu não iniciar a numeração da 699 00:30:39,610 --> 00:30:40,390 bytes em zero. 700 00:30:40,390 --> 00:30:41,540 Eu comecei em um. 701 00:30:41,540 --> 00:30:44,950 Porque eu sabia que as pessoas no mundo decidiram reservar o zero 702 00:30:44,950 --> 00:30:47,970 byte em ninguém RAM como algo especial. 703 00:30:47,970 --> 00:30:52,020 >> A razão de ser, a qualquer hora que você quiser sinal de que algo está errado 704 00:30:52,020 --> 00:30:55,960 no que diz respeito aos endereços, é devolvido null - também conhecido como zero - 705 00:30:55,960 --> 00:30:59,410 e porque você sabe que não há nenhuma legítimo de dados no endereço zero, claramente 706 00:30:59,410 --> 00:31:00,400 que significa um erro. 707 00:31:00,400 --> 00:31:04,080 E é por isso que, por convenção, verifique para nula e retorno algo 708 00:31:04,080 --> 00:31:06,260 como um desses casos. 709 00:31:06,260 --> 00:31:09,300 >> Então, se rolar agora, este é apenas em seguida, verificação de erros, apenas no caso 710 00:31:09,300 --> 00:31:10,610 algo deu errado com [? fiança?] 711 00:31:10,610 --> 00:31:13,470 completamente e sair do programa voltando mais cedo. 712 00:31:13,470 --> 00:31:19,030 Esta linha agora poderia ser reescrito como este, o que significa o quê? 713 00:31:19,030 --> 00:31:23,155 No lado esquerdo, dá-me outra ponteiro para um personagem, e chamá-lo de t. 714 00:31:23,155 --> 00:31:26,935 O que eu estou armazenando dentro de t, com base sobre esta linha de código? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Estou armazenando um local. 717 00:31:32,170 --> 00:31:34,742 Especificamente, a localização que foi em s. 718 00:31:34,742 --> 00:31:39,000 Portanto, se o usuário digitou em Olá, e que primeiro acontece Olá acabar 719 00:31:39,000 --> 00:31:42,567 aqui, em seguida, o número 123 é vai voltar de obter 720 00:31:42,567 --> 00:31:43,810 corda e ser armazenado - 721 00:31:43,810 --> 00:31:44,780 como dissemos anteriormente - 722 00:31:44,780 --> 00:31:45,440 em s. 723 00:31:45,440 --> 00:31:50,560 >> Quando eu declaro agora outro ponteiro para um char e chamá-lo de t, o número é 724 00:31:50,560 --> 00:31:53,940 literalmente vai acabar em t de acordo com a história? 725 00:31:53,940 --> 00:31:55,420 Então, 123. 726 00:31:55,420 --> 00:32:00,310 >> Então, tecnicamente agora ambos s e t estão apontando para o exato 727 00:32:00,310 --> 00:32:02,410 mesmos pedaços de memória. 728 00:32:02,410 --> 00:32:06,140 Então, observe o que eu vou fazer agora para provar que este programa é buggy. 729 00:32:06,140 --> 00:32:08,820 >> Primeiro eu vou afirmar, com um f impressão, capitalizando 730 00:32:08,820 --> 00:32:10,080 a cópia da string. 731 00:32:10,080 --> 00:32:11,660 Então eu vou fazer um pouco verificação de erros. 732 00:32:11,660 --> 00:32:12,160 Eu vou ter certeza. 733 00:32:12,160 --> 00:32:16,710 Vamos certificar-se de que a cadeia t está em menos maior que zero no comprimento, 734 00:32:16,710 --> 00:32:19,190 por isso há algum personagem lá para realmente capitalizar. 735 00:32:19,190 --> 00:32:22,840 >> E então você pode recordar esta dos exemplos anteriores. 736 00:32:22,840 --> 00:32:25,630 2 superior - o que é na o arquivo ctype.h. 737 00:32:25,630 --> 00:32:30,800 T faixa de zero me dá o zero caracter da string t. 738 00:32:30,800 --> 00:32:34,360 E 2 superior do mesmo valor, de Claro, converte para maiúsculas. 739 00:32:34,360 --> 00:32:38,230 >> Assim, intuitivamente, esta linha destacada do código está capitalizando o primeiro 740 00:32:38,230 --> 00:32:40,250 letra t. 741 00:32:40,250 --> 00:32:44,485 Mas não é capitalizar, de forma intuitiva, a primeira letra s. 742 00:32:44,485 --> 00:32:48,130 Mas se você está pensando no futuro, o que eu sou prestes a ver, quando eu executar este programa 743 00:32:48,130 --> 00:32:54,220 e imprimir o original, s, ea cópia chamada, t? 744 00:32:54,220 --> 00:32:55,350 >> Eles estão, na verdade, vai ser o mesmo. 745 00:32:55,350 --> 00:32:56,600 E por que é que eles vão ser os mesmos? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Ambos estão apontando para exatamente a mesma coisa. 748 00:33:01,020 --> 00:33:01,610 Então, vamos fazer isso. 749 00:33:01,610 --> 00:33:03,160 >> Fazer cópia zero. 750 00:33:03,160 --> 00:33:04,070 Ele compila OK. 751 00:33:04,070 --> 00:33:06,500 Deixe-me correr cópia zero. 752 00:33:06,500 --> 00:33:10,110 Deixe-me escrever algo como Olá em todas as letras minúsculas, em seguida, pressione Enter. 753 00:33:10,110 --> 00:33:16,520 E ela afirma que tanto o s originais ea cópia são realmente idênticas. 754 00:33:16,520 --> 00:33:17,920 >> Então, o que realmente aconteceu aqui? 755 00:33:17,920 --> 00:33:20,100 Deixe-me redesenhar esta imagem só para contar a história de uma 756 00:33:20,100 --> 00:33:21,340 maneira um pouco diferente. 757 00:33:21,340 --> 00:33:26,060 O que realmente está acontecendo debaixo do capuz quando eu declarar algo como 758 00:33:26,060 --> 00:33:30,410 s de char começo, ou string s, Estou recebendo um ponteiro - 759 00:33:30,410 --> 00:33:33,090 que passa a ser de quatro bytes no aparelho CS50 760 00:33:33,090 --> 00:33:34,410 e em um monte de computadores. 761 00:33:34,410 --> 00:33:36,008 E eu vou chamar isso de s. 762 00:33:36,008 --> 00:33:39,810 E isso tem atualmente algum valor desconhecido. 763 00:33:39,810 --> 00:33:43,900 >> Quando você declara uma variável, a menos que você se colocar um valor lá, que 764 00:33:43,900 --> 00:33:44,570 sabe o que está lá. 765 00:33:44,570 --> 00:33:48,110 Pode ser uma sequência aleatória de bits da execução anterior. 766 00:33:48,110 --> 00:33:52,490 Então, quando eu, na minha linha de código fizer string, e depois armazenar o retorno 767 00:33:52,490 --> 00:33:54,800 valor em s obter seqüência de alguma forma - 768 00:33:54,800 --> 00:33:58,520 e vamos eventualmente descascar como obter obras de cordas, de alguma forma atribui uma 769 00:33:58,520 --> 00:34:00,480 matriz que provavelmente parece um pouco como isso. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-S, invertida zero. 771 00:34:05,390 --> 00:34:09,510 >> Vamos supor que este é o endereço 123 apenas primeiro consistência. 772 00:34:09,510 --> 00:34:13,000 Portanto, obter corda retorna, no linha destacada lá, ele retorna o 773 00:34:13,000 --> 00:34:15,000 número dissemos, 123. 774 00:34:15,000 --> 00:34:17,420 Então, o que realmente se passa dentro de s aqui? 775 00:34:17,420 --> 00:34:26,590 >> Bem, o que realmente se passa dentro de s é 123. 776 00:34:26,590 --> 00:34:29,250 Mas, francamente, eu estou ficando um pouco confuso por todos estes endereços, 777 00:34:29,250 --> 00:34:30,320 todos estes números arbitrários. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Então, vamos realmente simplificar o mundo um pouco. 780 00:34:34,570 --> 00:34:38,800 >> Quando falamos de ponteiros, francamente, para nós seres humanos, quem diabos se importa onde 781 00:34:38,800 --> 00:34:39,870 as coisas estão na memória? 782 00:34:39,870 --> 00:34:41,080 Isso é completamente arbitrária. 783 00:34:41,080 --> 00:34:43,370 Vai depender de como quantidade de RAM que o usuário tem. 784 00:34:43,370 --> 00:34:46,590 Vai depender de quando, no dia você executar o programa, talvez, e 785 00:34:46,590 --> 00:34:48,250 que a entrada do usuário lhe dá. 786 00:34:48,250 --> 00:34:50,060 Estamos habitação em detalhes sem importância. 787 00:34:50,060 --> 00:34:54,230 >> Então vamos abstrair e dizer que, quando você executa uma linha de código como este, 788 00:34:54,230 --> 00:34:57,320 carbonizar estrela s recebe o retorno valor da cadeia get. 789 00:34:57,320 --> 00:35:02,720 Por que não ao invés de apenas desenhar o que continuar chamando um ponteiro como se fosse 790 00:35:02,720 --> 00:35:04,140 apontando para alguma coisa? 791 00:35:04,140 --> 00:35:07,000 Então eu afirmo agora que s up existe um ponteiro - 792 00:35:07,000 --> 00:35:08,480 debaixo do capô é um endereço. 793 00:35:08,480 --> 00:35:11,330 Mas é apenas apontando para o primeiro byte na 794 00:35:11,330 --> 00:35:12,780 string que foi retornado. 795 00:35:12,780 --> 00:35:16,710 >> Se eu voltar agora para o código aqui, o que está acontecendo nessa linha? 796 00:35:16,710 --> 00:35:20,020 Bem, nessa linha destaque agora, Estou declarando aparentemente outro 797 00:35:20,020 --> 00:35:21,070 variável chamada t. 798 00:35:21,070 --> 00:35:25,700 Mas também é um ponteiro, então eu vou desenhá-lo como, em teoria, a exacta 799 00:35:25,700 --> 00:35:26,710 mesma caixa de tamanho. 800 00:35:26,710 --> 00:35:28,160 E eu vou chamá-lo de t. 801 00:35:28,160 --> 00:35:33,500 >> E agora se voltar para o código novamente, quando eu armazenar está dentro de t, 802 00:35:33,500 --> 00:35:36,920 o que eu sou tecnicamente colocando dentro de t? 803 00:35:36,920 --> 00:35:39,350 Bem, tecnicamente, este foi o número 123. 804 00:35:39,350 --> 00:35:42,270 Então, realmente eu deveria estar escrevendo o número 123 existe. 805 00:35:42,270 --> 00:35:43,900 Mas vamos levá-lo de nível superior. 806 00:35:43,900 --> 00:35:48,090 t, se é apenas um ponteiro, intuitivamente, é só isso. 807 00:35:48,090 --> 00:35:49,800 Isso é tudo o que está sendo aí armazenados. 808 00:35:49,800 --> 00:35:54,970 >> Então, agora nas últimas linhas interessantes de código, quando eu realmente ir sobre 809 00:35:54,970 --> 00:36:00,680 capitalizando o zero em t, o que está acontecendo? 810 00:36:00,680 --> 00:36:06,310 Bem, t faixa de zero agora está apontando para o personagem, presumivelmente? 811 00:36:06,310 --> 00:36:07,460 >> Ele está apontando para h. 812 00:36:07,460 --> 00:36:08,870 Porque t faixa de zero - 813 00:36:08,870 --> 00:36:12,490 lembro, esta é velha sintaxe. t suporte de zero significa apenas que se t é uma string, t 814 00:36:12,490 --> 00:36:15,590 faixa de zero significa obter o zero personagem em que a força. 815 00:36:15,590 --> 00:36:18,650 Então, o que realmente significa é ir a essa matriz - 816 00:36:18,650 --> 00:36:21,520 e sim, isso pode ser 123, isto pode ser 124. 817 00:36:21,520 --> 00:36:22,790 Mas é tudo relativo, lembre-se. 818 00:36:22,790 --> 00:36:25,640 Sempre falando de uma matriz, temos a vantagem de falar 819 00:36:25,640 --> 00:36:27,000 índices relativos. 820 00:36:27,000 --> 00:36:31,120 >> E agora, podemos apenas supor que t suporte zero é h. 821 00:36:31,120 --> 00:36:35,090 Então, se eu chamar 2 superior sobre ele, o que é fazendo realmente está capitalizando 822 00:36:35,090 --> 00:36:38,290 o h minúsculas para maiúsculas H. Mas, claro, o que é s? 823 00:36:38,290 --> 00:36:41,010 Ele está apontando para a mesma seqüência danado. 824 00:36:41,010 --> 00:36:44,200 >> Então, isso é tudo o que está acontecendo neste código até o momento. 825 00:36:44,200 --> 00:36:45,960 Então, qual é então a implicação? 826 00:36:45,960 --> 00:36:48,300 Como é que vamos corrigir esses dois problemas? 827 00:36:48,300 --> 00:36:50,870 Como podemos comparar com cordas reais? 828 00:36:50,870 --> 00:36:53,720 >> Bem, intuitivamente, como é que você vai sobre a comparação de dois 829 00:36:53,720 --> 00:36:55,090 cordas para a verdadeira igualdade? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> O que significa se dois strings são iguais? 832 00:37:00,750 --> 00:37:04,330 É claro que não são os seus endereços igual na memória, porque isso é um baixo 833 00:37:04,330 --> 00:37:06,590 detalhe de implementação nível. 834 00:37:06,590 --> 00:37:08,360 Todos os caracteres são idênticos. 835 00:37:08,360 --> 00:37:12,810 Então deixe-me propor, e deixe-me apresentar na versão de um compare.c 836 00:37:12,810 --> 00:37:14,970 aqui, então comparar-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Deixe-me propor que nós ainda obter um ponteiro chamado s, e uma loja em que o 838 00:37:19,590 --> 00:37:20,610 retornar o valor de seqüência de get. 839 00:37:20,610 --> 00:37:21,750 Vamos fazer a mesma coisa com t. 840 00:37:21,750 --> 00:37:23,230 Assim, a parte do código é diferente. 841 00:37:23,230 --> 00:37:25,420 Eu estou indo para adicionar um pouco mais a verificação de erros agora. 842 00:37:25,420 --> 00:37:29,390 Então, agora que estamos espécie de descamação de volta este camadas CS50 do que uma string 843 00:37:29,390 --> 00:37:33,520 realmente é, precisamos ser mais anal sobre certificando-se de não abusar 844 00:37:33,520 --> 00:37:35,330 valores inválidos como nulos. 845 00:37:35,330 --> 00:37:36,440 >> Então, eu só vou verificar. 846 00:37:36,440 --> 00:37:41,490 Se s não é igual a nulo e t não igual nulo, isso significa que estamos OK. 847 00:37:41,490 --> 00:37:44,460 Seja corda não estragar ficando qualquer uma dessas cordas. 848 00:37:44,460 --> 00:37:51,270 E você pode, talvez, acho que agora, o que não STR CMP presumivelmente fazer? 849 00:37:51,270 --> 00:37:52,000 String de comparação. 850 00:37:52,000 --> 00:37:55,470 >> Portanto, se você programa em java antes, isto é como o método equals no 851 00:37:55,470 --> 00:37:56,490 classe string. 852 00:37:56,490 --> 00:37:57,890 Mas para aqueles de vocês que não têm programado antes, 853 00:37:57,890 --> 00:37:59,320 esta é apenas uma função c. 854 00:37:59,320 --> 00:38:02,180 Acontece a entrar em uma arquivo chamado string.h. 855 00:38:02,180 --> 00:38:03,830 É aí que ele é declarado. 856 00:38:03,830 --> 00:38:05,110 >> E corda comparar - 857 00:38:05,110 --> 00:38:07,530 Eu realmente esquecer seu uso, mas não importa. 858 00:38:07,530 --> 00:38:10,470 Lembre-se que nós podemos fazer homem, mexa comparar. 859 00:38:10,470 --> 00:38:12,590 E isso vai trazer o Manual de programadores Linux. 860 00:38:12,590 --> 00:38:14,060 E é, francamente, um pouco enigmática. 861 00:38:14,060 --> 00:38:15,270 Mas eu posso ver que aqui, sim. 862 00:38:15,270 --> 00:38:17,570 Eu tenho que incluir string.h. 863 00:38:17,570 --> 00:38:20,590 >> E diz aqui em descrição, "o função de comparação compara cadeia 864 00:38:20,590 --> 00:38:24,560 as duas seqüências S1 e S2. "E S1 e S2 são, aparentemente, os dois 865 00:38:24,560 --> 00:38:26,120 argumentos passados ​​dentro 866 00:38:26,120 --> 00:38:28,650 Eu realmente não lembro o que const é, mas agora percebe - 867 00:38:28,650 --> 00:38:31,480 e você pode ter visto isso já quando você usar as páginas do manual, se você 868 00:38:31,480 --> 00:38:32,390 ter tudo - 869 00:38:32,390 --> 00:38:36,220 aquela estrela char é apenas sinónimo com string. 870 00:38:36,220 --> 00:38:40,440 >> Então, ele compara as duas cordas, S1 e S2, e retorna um inteiro menor 871 00:38:40,440 --> 00:38:44,930 que ou igual a ou maior do que zero S1 se encontra, respectivamente, para ser 872 00:38:44,930 --> 00:38:47,450 inferiores ou iguais, ou ser maior que S2. 873 00:38:47,450 --> 00:38:51,220 Isso é apenas uma maneira muito complexa de dizer essa seqüência comparar retornos 874 00:38:51,220 --> 00:38:55,760 zero se duas strings são intuitivamente idênticas, personagem de 875 00:38:55,760 --> 00:38:57,120 personagem para personagem. 876 00:38:57,120 --> 00:38:59,970 >> Ele retorna um número negativo se s, por ordem alfabética, é suposto 877 00:38:59,970 --> 00:39:01,010 para vir antes de t. 878 00:39:01,010 --> 00:39:05,300 Ou retorna um número positivo se s deve vir depois de t 879 00:39:05,300 --> 00:39:06,170 em ordem alfabética. 880 00:39:06,170 --> 00:39:08,360 Assim, com esta função simples, poderia você, por exemplo, classificar uma 881 00:39:08,360 --> 00:39:09,770 todo monte de palavras? 882 00:39:09,770 --> 00:39:13,984 >> Assim, nesta nova versão, eu vou para ir em frente e fazer compare1. 883 00:39:13,984 --> 00:39:15,750 Dot barra comparar um. 884 00:39:15,750 --> 00:39:18,030 Eu vou digitar Olá em todas as letras minúsculas. 885 00:39:18,030 --> 00:39:20,300 Vou digitar Olá em todas as letras minúsculas novamente. 886 00:39:20,300 --> 00:39:23,340 E felizmente agora percebe Eu digitei a mesma coisa. 887 00:39:23,340 --> 00:39:27,520 >> Enquanto isso, se eu digitar Olá em baixa OLÁ caso e em letras maiúsculas e 888 00:39:27,520 --> 00:39:29,710 compará-los, eu digitei coisas diferentes. 889 00:39:29,710 --> 00:39:32,530 Porque não são apenas os endereços diferente, mas estamos comparando 890 00:39:32,530 --> 00:39:35,350 diferentes personagens novamente e novamente. 891 00:39:35,350 --> 00:39:37,320 >> Bem, vamos lá e corrigir um outro problema agora. 892 00:39:37,320 --> 00:39:41,590 Deixe-me abrir uma versão de cópia, que agora dirige 893 00:39:41,590 --> 00:39:42,900 esta questão da seguinte forma. 894 00:39:42,900 --> 00:39:45,650 E este vai ficar um pouco mais complexa. 895 00:39:45,650 --> 00:39:49,320 Mas se você pensar sobre o problema que precisa resolver, espero que este será 896 00:39:49,320 --> 00:39:51,870 claro em apenas um momento agora. 897 00:39:51,870 --> 00:39:57,280 >> Portanto, esta primeira linha, char início t, em termos leigos alguém poderia propor 898 00:39:57,280 --> 00:39:59,450 o que esta linha aqui significa? 899 00:39:59,450 --> 00:40:01,050 Char estrela t, o que é que está fazendo? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bom. 902 00:40:07,210 --> 00:40:09,500 Criar um ponteiro para alguns local de memória. 903 00:40:09,500 --> 00:40:10,930 E deixe-me refiná-lo um pouco. 904 00:40:10,930 --> 00:40:17,180 Declare uma variável que irá armazenar o endereço de algum caractere na memória, apenas 905 00:40:17,180 --> 00:40:18,480 a ser um pouco mais adequada. 906 00:40:18,480 --> 00:40:21,210 >> OK, agora no lado direito, eu tenho nunca vi uma dessas funções 907 00:40:21,210 --> 00:40:22,660 antes, malloc. 908 00:40:22,660 --> 00:40:26,980 Mas o que poderia dizer? 909 00:40:26,980 --> 00:40:28,050 Alocação de memória. 910 00:40:28,050 --> 00:40:29,410 Alocação de memória. 911 00:40:29,410 --> 00:40:33,050 >> Assim, ao que parece, até agora, nós realmente não tinha uma maneira poderosa de 912 00:40:33,050 --> 00:40:36,210 pedindo o sistema operacional, dê-me um pouco de memória. 913 00:40:36,210 --> 00:40:39,980 Em vez disso, agora temos uma função chamada malloc que faz exatamente isso. 914 00:40:39,980 --> 00:40:42,960 Mesmo que isso é um pouco de distração, agora, perceber que em 915 00:40:42,960 --> 00:40:46,200 entre os dois parêntesis está só vai ser um número. 916 00:40:46,200 --> 00:40:48,510 Onde eu digitei em questão as marcas podem ser um número. 917 00:40:48,510 --> 00:40:51,020 >> E esse número significa, dar-me 10 bytes. 918 00:40:51,020 --> 00:40:52,320 Dê-me 20 bytes. 919 00:40:52,320 --> 00:40:53,820 Dê-me 100 bytes. 920 00:40:53,820 --> 00:40:56,500 Malloc e fará o seu melhor para pedir ao sistema operacional - 921 00:40:56,500 --> 00:40:57,630 Linux, neste caso - 922 00:40:57,630 --> 00:40:59,630 hey, são seus 100 bytes de memória RAM disponível? 923 00:40:59,630 --> 00:41:04,320 Se assim for, devolver esses bytes para mim por retornando o endereço de qual 924 00:41:04,320 --> 00:41:06,610 os bytes, talvez? 925 00:41:06,610 --> 00:41:07,610 O próprio primeiro. 926 00:41:07,610 --> 00:41:10,460 >> Portanto, aqui também - e isto é predominante em C, a qualquer hora que você está 927 00:41:10,460 --> 00:41:11,680 lidar com endereços? 928 00:41:11,680 --> 00:41:15,830 Você está quase sempre lidando com o primeiro endereço tal, não importa quão grande 929 00:41:15,830 --> 00:41:19,490 um pedaço de memória que está a ser devolveu, por assim dizer. 930 00:41:19,490 --> 00:41:20,880 >> Então vamos mergulhar aqui. 931 00:41:20,880 --> 00:41:23,940 Estou tentando alocar como muitos bytes, exatamente? 932 00:41:23,940 --> 00:41:24,080 Well. 933 00:41:24,080 --> 00:41:26,090 Comprimento da corda de s - vamos fazer um exemplo concreto. 934 00:41:26,090 --> 00:41:30,700 Se s é Olá, H-E-L-L-O, que é o comprimento da corda de s, obviamente? 935 00:41:30,700 --> 00:41:32,010 Por isso, é de cinco anos. 936 00:41:32,010 --> 00:41:34,590 Mas eu estou fazendo um mais um em que, por quê? 937 00:41:34,590 --> 00:41:37,700 Por que eu quero seis bytes em vez de cinco? 938 00:41:37,700 --> 00:41:38,790 O caráter nulo. 939 00:41:38,790 --> 00:41:41,210 >> Eu não quero deixar de fora esta caractere nulo especial. 940 00:41:41,210 --> 00:41:45,160 Porque se eu fizer uma cópia do Olá e apenas fazer H-E-L-L-O, mas eu não ponho 941 00:41:45,160 --> 00:41:50,160 esse caráter especial, o computador não pode ter, por acaso, uma barra invertida 942 00:41:50,160 --> 00:41:51,730 zerar lá para mim. 943 00:41:51,730 --> 00:41:55,570 E assim, se eu estou tentando descobrir o comprimento da cópia, eu poderia pensar que 944 00:41:55,570 --> 00:41:59,360 é 20 caracteres, ou um milhão caracteres se eu nunca acontecer 945 00:41:59,360 --> 00:42:01,050 para bater um zero barra invertida. 946 00:42:01,050 --> 00:42:05,780 >> Por isso, precisamos de seis bytes para armazenar H-E-L-L-S, invertida zero. 947 00:42:05,780 --> 00:42:07,870 E então este é apenas ser super anal. 948 00:42:07,870 --> 00:42:10,700 Suponha que eu esqueça o que o tamanho de uma char é. 949 00:42:10,700 --> 00:42:12,020 Nós mantemo-nos dizendo que é um byte. 950 00:42:12,020 --> 00:42:12,860 E geralmente é. 951 00:42:12,860 --> 00:42:15,425 Em teoria, poderia ser algo diferentes, em um Mac diferente ou uma 952 00:42:15,425 --> 00:42:16,250 PC diferente. 953 00:42:16,250 --> 00:42:19,650 >> Então não é que há esse operador chamado sizeof que se você passá-lo a 954 00:42:19,650 --> 00:42:22,680 nome de um tipo de dados - como char, ou int ou float - 955 00:42:22,680 --> 00:42:26,930 ele vai lhe dizer, de forma dinâmica, quantos bytes um char ocupa neste 956 00:42:26,930 --> 00:42:28,090 determinado computador. 957 00:42:28,090 --> 00:42:31,360 >> Portanto, esta é efetivamente apenas como vezes um ou dizendo 958 00:42:31,360 --> 00:42:32,440 vezes nada. 959 00:42:32,440 --> 00:42:36,340 Mas eu estou fazendo isso apenas para ser super anal, que apenas no caso de um char diferente 960 00:42:36,340 --> 00:42:40,610 em seu computador contra a minha, desta forma a matemática está sempre indo para check-out. 961 00:42:40,610 --> 00:42:43,720 >> Por fim, aqui eu verifico para nulo, que é sempre uma boa prática - de novo, 962 00:42:43,720 --> 00:42:44,920 qualquer momento que estamos lidando com ponteiros. 963 00:42:44,920 --> 00:42:47,520 Se malloc não foi capaz de dar me seis despedidas - o que é 964 00:42:47,520 --> 00:42:49,210 pouco provável, mas apenas no caso - 965 00:42:49,210 --> 00:42:50,730 retornar um imediatamente. 966 00:42:50,730 --> 00:42:53,290 E agora, vá em frente e copiar a corda como se segue. 967 00:42:53,290 --> 00:42:57,240 E esta é a sintaxe familiar, embora em um papel diferente. 968 00:42:57,240 --> 00:43:01,210 >> Eu estou indo para ir em frente e começar a string comprimento de s e armazená-lo em n. 969 00:43:01,210 --> 00:43:06,620 Estou passando então a iteração de i é igual a zero até e incluindo n, 970 00:43:06,620 --> 00:43:08,410 maior ou igual a. 971 00:43:08,410 --> 00:43:13,540 De modo que em cada iteração, eu coloquei o caráter om de s no om 972 00:43:13,540 --> 00:43:15,380 caráter de t. 973 00:43:15,380 --> 00:43:18,190 >> Então, o que realmente está acontecendo por baixo a capa aqui? 974 00:43:18,190 --> 00:43:22,140 Bem, se este, por exemplo, é s - 975 00:43:22,140 --> 00:43:26,400 e eu digitei a palavra H-E-L-L-O e há um zero barra invertida. 976 00:43:26,400 --> 00:43:29,020 E mais uma vez, esta é s apontando aqui. 977 00:43:29,020 --> 00:43:30,830 E aqui agora é t. 978 00:43:30,830 --> 00:43:34,860 >> E isso está apontando agora para uma cópia de memória, certo? 979 00:43:34,860 --> 00:43:37,340 Malloc me deu um todo pedaço de memória. 980 00:43:37,340 --> 00:43:41,440 Eu não sei o que é, inicialmente, em qualquer um destes locais. 981 00:43:41,440 --> 00:43:44,340 Então, eu vou pensar nisso como um monte de pontos de interrogação. 982 00:43:44,340 --> 00:43:50,190 >> Mas assim que eu começar looping de zero em cima ao longo do comprimento s, t 983 00:43:50,190 --> 00:43:52,790 suporte zero e suporte t 1 - 984 00:43:52,790 --> 00:43:55,080 e eu vou colocar isso agora na sobrecarga - 985 00:43:55,080 --> 00:44:04,190 t suporte zero e s suporte média zero que eu vou estar copiando 986 00:44:04,190 --> 00:44:09,875 iterativamente h aqui, o E-L-L-S. Além disso, porque eu fiz o mais 987 00:44:09,875 --> 00:44:12,370 1, barra invertida zero. 988 00:44:12,370 --> 00:44:19,060 >> Então, agora, no caso de compará-1.c, no final, se eu imprimir o 989 00:44:19,060 --> 00:44:24,760 capitalização de t, devemos ver que s mantém-se inalterado. 990 00:44:24,760 --> 00:44:26,090 Deixe-me ir em frente agora e fazer isso. 991 00:44:26,090 --> 00:44:28,630 Então faça copy1. 992 00:44:28,630 --> 00:44:30,860 Dot barra copy1. 993 00:44:30,860 --> 00:44:33,670 Vou digitar Olá, Enter. 994 00:44:33,670 --> 00:44:37,430 E agora observar, apenas a cópia tem sido capitalizados. 995 00:44:37,430 --> 00:44:40,890 Porque eu realmente tenho dois pedaços de memória. 996 00:44:40,890 --> 00:44:44,390 >> Infelizmente, você pode fazer algum bem coisas ruins e muito perigoso aqui. 997 00:44:44,390 --> 00:44:49,290 Deixe-me puxar para cima um exemplo aqui agora, , que nos dá um exemplo de alguns 998 00:44:49,290 --> 00:44:51,540 linhas diferentes. 999 00:44:51,540 --> 00:44:56,040 Então, só intuitivamente aqui, a primeira linha de código, int x estrela, está declarando 1000 00:44:56,040 --> 00:44:57,340 uma variável chamada x. 1001 00:44:57,340 --> 00:44:58,810 E qual é o tipo de dados dessa variável? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Qual é o tipo de dados que a variável? 1004 00:45:04,290 --> 00:45:06,980 Aquele não era o momento de angústia. 1005 00:45:06,980 --> 00:45:08,350 >> O tipo de dados int é estrela. 1006 00:45:08,350 --> 00:45:12,600 Então, o que isso significa? x vontade armazenar o endereço de um int. 1007 00:45:12,600 --> 00:45:13,520 Simples como isso. 1008 00:45:13,520 --> 00:45:16,220 Y vai armazenar o endereço de um int. 1009 00:45:16,220 --> 00:45:18,390 O que é a terceira linha do código está fazendo lá? 1010 00:45:18,390 --> 00:45:21,850 É atribuição quantos bytes, provavelmente? 1011 00:45:21,850 --> 00:45:22,350 Four. 1012 00:45:22,350 --> 00:45:25,460 Devido ao tamanho de um int é geralmente quatro, malloc de quatro dá 1013 00:45:25,460 --> 00:45:29,950 me fazer o endereço de um pedaço de memória, o primeiro de cujos bytes é 1014 00:45:29,950 --> 00:45:32,110 armazenado agora em x. 1015 00:45:32,110 --> 00:45:34,410 >> Agora estamos nos movendo um pouco rapidamente. 1016 00:45:34,410 --> 00:45:35,760 Estrela x significa o quê? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Isso significa ir para esse endereço e colocar o número de lá? 1019 00:45:42,590 --> 00:45:43,870 Coloque o número 42 lá. 1020 00:45:43,870 --> 00:45:47,590 Estrela y significa ir para o que está em y e colocar o número 13 lá. 1021 00:45:47,590 --> 00:45:48,600 >> Mas espere um minuto. 1022 00:45:48,600 --> 00:45:51,640 O que está em y no momento? 1023 00:45:51,640 --> 00:45:54,950 O endereço é y armazenamento? 1024 00:45:54,950 --> 00:45:55,770 Nós não sabemos, certo? 1025 00:45:55,770 --> 00:45:59,230 Nós nunca uma vez usar a atribuição operador envolvendo y. 1026 00:45:59,230 --> 00:46:03,370 Então, y, conforme declarado na segunda linha de código é apenas um valor de lixo, um grande 1027 00:46:03,370 --> 00:46:04,760 ponto de interrogação, por assim dizer. 1028 00:46:04,760 --> 00:46:07,230 Pode-se apontar aleatoriamente a qualquer coisa na memória, que 1029 00:46:07,230 --> 00:46:08,340 geralmente é ruim. 1030 00:46:08,340 --> 00:46:13,540 >> Assim, logo que batemos essa linha lá, estrela y é igual a 13, algo ruim, 1031 00:46:13,540 --> 00:46:17,220 algo muito ruim está acontecer com Binky. 1032 00:46:17,220 --> 00:46:25,810 Então vamos ver o que vai acabar acontecendo com Binky aqui neste minuto 1033 00:46:25,810 --> 00:46:26,200 ou então procure. 1034 00:46:26,200 --> 00:46:26,490 >> [REPRODUÇÃO] 1035 00:46:26,490 --> 00:46:26,745 >> -Ei, Binky. 1036 00:46:26,745 --> 00:46:27,000 Acordar. 1037 00:46:27,000 --> 00:46:29,296 É tempo para se divertir ponteiro. 1038 00:46:29,296 --> 00:46:30,680 >> -O que é isso? 1039 00:46:30,680 --> 00:46:31,980 Saiba mais sobre ponteiros? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Bem, para começar, eu acho que estamos vai precisar de um par de ponteiros. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Este código aloca dois ponteiros que pode apontar para números inteiros. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, bem, eu vejo os dois ponteiros. 1045 00:46:43,760 --> 00:46:45,850 Mas eles não parecem ser apontando para nada. 1046 00:46:45,850 --> 00:46:46,490 >> -Isso mesmo. 1047 00:46:46,490 --> 00:46:48,630 Inicialmente, os ponteiros não apontar para qualquer coisa. 1048 00:46:48,630 --> 00:46:51,700 As coisas que eles apontam são chamados pointees, e configurá-los é uma 1049 00:46:51,700 --> 00:46:52,850 etapa separada. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, certo, certo. 1051 00:46:53,740 --> 00:46:54,500 Eu sabia disso. 1052 00:46:54,500 --> 00:46:56,270 Os pointees são separados. 1053 00:46:56,270 --> 00:46:58,553 Assim como você alocar um pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Bem, este código aloca um novo inteiros pointee, e esta parte define x 1056 00:47:03,707 --> 00:47:05,520 para apontar para ele. 1057 00:47:05,520 --> 00:47:06,760 >> -Ei, isso parece melhor. 1058 00:47:06,760 --> 00:47:08,520 Então ele fazer alguma coisa. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Vou cancelar o ponteiro x para armazenar o número 42 na sua pointee. 1061 00:47:14,110 --> 00:47:17,660 Para este truque, eu vou precisar da minha magia varinha de dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Sua varinha mágica de dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Uh, isso é ótimo. 1064 00:47:22,632 --> 00:47:24,620 >> -Isto é o que o código parece. 1065 00:47:24,620 --> 00:47:27,526 Eu só vou definir o número, e - 1066 00:47:27,526 --> 00:47:28,250 >> -Ei, olha. 1067 00:47:28,250 --> 00:47:29,680 Lá vai ele. 1068 00:47:29,680 --> 00:47:34,520 Então, fazendo um desreferenciava em x segue a seta para acessar sua pointee. 1069 00:47:34,520 --> 00:47:36,690 Neste caso, 42 para armazenar ali. 1070 00:47:36,690 --> 00:47:40,890 Hey, tente usá-lo para armazenar o número 13 através do outro ponteiro, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Eu vou passar por cima aqui para y e se o número 13 configurar. 1073 00:47:46,810 --> 00:47:50,890 E, em seguida, tomar a varinha de dereferencing e apenas - 1074 00:47:50,890 --> 00:47:52,430 Uau! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Isso não funcionou. 1077 00:47:54,610 --> 00:47:58,200 Digamos, Binky, eu não acho que o dereferencing y é uma boa idéia, 1078 00:47:58,200 --> 00:48:01,370 porque a configuração do pointee é um passo separado. 1079 00:48:01,370 --> 00:48:03,460 E eu não acho que nós já fizemos. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Bom ponto. 1082 00:48:05,160 --> 00:48:07,410 >> -Sim, alocamos o ponteiro y. 1083 00:48:07,410 --> 00:48:10,045 Mas nós nunca configurá-lo para apontar para um pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Muito observador. 1086 00:48:12,170 --> 00:48:13,790 >> -Ei, você está olhando bom lá, Binky. 1087 00:48:13,790 --> 00:48:16,920 Você pode corrigi-lo, para que y pontos ao mesmo pointee como x? 1088 00:48:16,920 --> 00:48:17,810 >> -Claro. 1089 00:48:17,810 --> 00:48:20,300 Eu vou usar a minha varinha mágica de atribuição de ponteiro. 1090 00:48:20,300 --> 00:48:22,240 >> -Será que vai ser um problema como antes? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Isso não tocar nos pointees. 1093 00:48:24,300 --> 00:48:27,880 Ele só muda um ponteiro para apontar a mesma coisa que o outro. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, eu vejo. 1095 00:48:28,970 --> 00:48:31,730 Agora y aponta para o mesmo lugar que x. 1096 00:48:31,730 --> 00:48:32,450 Então, espere. 1097 00:48:32,450 --> 00:48:33,490 Agora y é fixo. 1098 00:48:33,490 --> 00:48:34,630 Tem um pointee. 1099 00:48:34,630 --> 00:48:36,520 Então, você pode tentar a varinha de dereferencing novamente 1100 00:48:36,520 --> 00:48:39,200 para enviar a 13 terminado. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Aqui vai. 1103 00:48:41,570 --> 00:48:42,870 >> -Ei, olha isso. 1104 00:48:42,870 --> 00:48:44,320 Agora dereferencing obras sobre y. 1105 00:48:44,320 --> 00:48:47,020 E porque os ponteiros estão compartilhando que um pointee, eles 1106 00:48:47,020 --> 00:48:48,585 tanto ver o 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Sim. 1108 00:48:49,040 --> 00:48:49,670 Compartilhando. 1109 00:48:49,670 --> 00:48:50,380 Qualquer que seja. 1110 00:48:50,380 --> 00:48:52,290 Então vamos trocar de lugar agora? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, olhe. 1112 00:48:52,970 --> 00:48:54,150 Estamos sem tempo. 1113 00:48:54,150 --> 00:48:55,200 >> -Mas - 1114 00:48:55,200 --> 00:48:57,060 >> -Lembre-se de três regras ponteiro. 1115 00:48:57,060 --> 00:49:00,100 O número um, a estrutura básica é que você tem um ponteiro. 1116 00:49:00,100 --> 00:49:02,170 E aponta mais para um pointee. 1117 00:49:02,170 --> 00:49:04,160 Mas o ponteiro e pointee são separados. 1118 00:49:04,160 --> 00:49:06,460 E o erro comum é criar um ponteiro, mas a 1119 00:49:06,460 --> 00:49:08,540 esquecer de um dado pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Número dois, apontador dereferencing começa no ponteiro e segue o seu 1121 00:49:12,460 --> 00:49:14,570 seta sobre para acessar sua pointee. 1122 00:49:14,570 --> 00:49:18,640 Como todos sabemos, isso só funciona se houver é um pointee, que volta ao 1123 00:49:18,640 --> 00:49:19,790 regra número um. 1124 00:49:19,790 --> 00:49:23,670 >> Número três, a atribuição de ponteiro leva um ponteiro e muda-lo para apontar para 1125 00:49:23,670 --> 00:49:25,850 Nas mesmas pointee como outro ponteiro. 1126 00:49:25,850 --> 00:49:27,840 Assim, após a atribuição, os dois ponteiros 1127 00:49:27,840 --> 00:49:29,430 apontar para o mesmo pointee. 1128 00:49:29,430 --> 00:49:31,600 Às vezes isso é chamado de partilha. 1129 00:49:31,600 --> 00:49:33,430 E isso é tudo que existe para ela, realmente. 1130 00:49:33,430 --> 00:49:33,840 Bye bye agora. 1131 00:49:33,840 --> 00:49:34,300 >> [FIM REPRODUÇÃO DE VÍDEO] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: So mais sobre ponteiros, mais sobre Binky na próxima semana. 1133 00:49:36,940 --> 00:49:38,190 Vemo-nos na segunda-feira. 1134 00:49:38,190 --> 00:49:42,187