1 00:00:00,000 --> 00:00:02,395 >> [Música tocando] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: OK. 4 00:00:06,506 --> 00:00:08,880 Nós trabalhamos com números inteiros, nós trabalhamos com os personagens, 5 00:00:08,880 --> 00:00:11,930 temos trabalhado carros alegóricos, duplos, strings e bools. 6 00:00:11,930 --> 00:00:14,870 Nós já esgotou praticamente todos dos [inaudível] tipos que 7 00:00:14,870 --> 00:00:17,100 estiveram disponíveis para todos nós junto. 8 00:00:17,100 --> 00:00:19,430 Mas agora queremos fazer algo mais. 9 00:00:19,430 --> 00:00:20,210 Como fazemos isso? 10 00:00:20,210 --> 00:00:22,560 Como podemos criar diferentes tipos de dados? 11 00:00:22,560 --> 00:00:26,130 Podemos fazer isso usando estruturas. 12 00:00:26,130 --> 00:00:30,180 Então estruturas permitirá a unificação variáveis ​​de diferentes tipos 13 00:00:30,180 --> 00:00:34,810 em um único, novo tipo de variável, qual podemos atribuir o seu próprio nome de tipo. 14 00:00:34,810 --> 00:00:37,570 Este é realmente um forte coisa a ser capaz de fazer, 15 00:00:37,570 --> 00:00:40,900 porque nós podemos agora grupo elementos de diferentes tipos de dados 16 00:00:40,900 --> 00:00:43,910 juntos, que têm uma ligação lógica. 17 00:00:43,910 --> 00:00:46,440 Temos sido capazes de fazer isso com matrizes tipo de, certo? 18 00:00:46,440 --> 00:00:49,540 Nós podemos variáveis ​​do grupo do mesmo tipo de dados 19 00:00:49,540 --> 00:00:53,410 juntos numa unidade grande de memória, uma matriz. 20 00:00:53,410 --> 00:00:56,660 >> Mas não temos sido capazes de misturar até diferentes tipos de dados em conjunto. 21 00:00:56,660 --> 00:01:02,610 Não podemos, por exemplo, associar um número inteiro, e um personagem, e um duplo tudo 22 00:01:02,610 --> 00:01:05,330 na mesma coisa e chamar que uma única unidade. 23 00:01:05,330 --> 00:01:08,830 Mas com as estruturas, ou frequentemente referido como estruturas, 24 00:01:08,830 --> 00:01:09,585 nós realmente pode. 25 00:01:09,585 --> 00:01:12,370 Assim, uma estrutura é uma espécie de como uma variável super. 26 00:01:12,370 --> 00:01:16,530 É uma variável que contenha outras variáveis ​​dentro do mesmo. 27 00:01:16,530 --> 00:01:19,650 Então aqui está um exemplo de uma estrutura muito simples. 28 00:01:19,650 --> 00:01:23,380 Isto é o que a sintaxe ficaria como para criar uma estrutura de um carro. 29 00:01:23,380 --> 00:01:25,250 Agora, vamos passar a sintaxe aqui. 30 00:01:25,250 --> 00:01:27,400 Struct, que é a palavra-chave que indica 31 00:01:27,400 --> 00:01:30,270 que eu estou criando um novo tipo de dados aqui. 32 00:01:30,270 --> 00:01:33,860 Em particular, o nome do tipo de dados é vai ser carro struct, como veremos. 33 00:01:33,860 --> 00:01:36,640 Mas este é o tipo de ponta off para o compilador que este 34 00:01:36,640 --> 00:01:42,440 como um grupo de variáveis ​​que está acontecendo para ser considerado parte do mesmo tipo 35 00:01:42,440 --> 00:01:44,010 em um minuto. 36 00:01:44,010 --> 00:01:46,340 >> Carros, apenas o nome da estrutura. 37 00:01:46,340 --> 00:01:50,590 Mais uma vez, o tipo de dados aqui vai ser o carro struct, não apenas carro. 38 00:01:50,590 --> 00:01:53,060 Mas se você tem diferente-- se você criar várias estruturas 39 00:01:53,060 --> 00:01:56,950 no mesmo programa, você precisa distinguir entre e struct. 40 00:01:56,950 --> 00:02:00,140 Carro para struct, eu também pode ter estudante struct, por exemplo, 41 00:02:00,140 --> 00:02:01,790 no mesmo programa. 42 00:02:01,790 --> 00:02:05,980 Dentro das chaves são todos os campos chamados, 43 00:02:05,980 --> 00:02:07,954 ou os membros da estrutura. 44 00:02:07,954 --> 00:02:10,370 Então, quais são algumas das coisas que são inerentes em um carro? 45 00:02:10,370 --> 00:02:15,270 Bem, ele tem geralmente um ano, tem um nome de modelo, e uma placa de licença, 46 00:02:15,270 --> 00:02:18,000 um conta-quilómetros que tem geralmente um certo número de milhas sobre ele, 47 00:02:18,000 --> 00:02:19,225 e talvez um tamanho do motor. 48 00:02:19,225 --> 00:02:23,570 E como você pode ver, eu estou misturando-se inteiros e caracteres e duplas. 49 00:02:23,570 --> 00:02:26,420 Eles estão todos indo para ser parte deste novo tipo de dados. 50 00:02:26,420 --> 00:02:29,750 >> Por fim, a última coisa que eu preciso fazer, não se esqueça este pequeno ponto e vírgula 51 00:02:29,750 --> 00:02:30,290 no fim. 52 00:02:30,290 --> 00:02:34,380 Depois que terminar de definir a estrutura, é preciso colocar um ponto e vírgula no final. 53 00:02:34,380 --> 00:02:37,325 É uma sintática muito comum erro, porque com uma função, 54 00:02:37,325 --> 00:02:40,200 por exemplo, você teria apenas chaveta aberta, perto chaveta. 55 00:02:40,200 --> 00:02:42,950 Você não colocou um ponto e vírgula no final de uma definição de função. 56 00:02:42,950 --> 00:02:46,430 Isto parece uma função definição, mas não é, 57 00:02:46,430 --> 00:02:49,653 e assim o ponto e vírgula não é apenas um lembrete de que você 58 00:02:49,653 --> 00:02:52,440 precisa colocá-lo lá, porque o compilador de outra forma não vai 59 00:02:52,440 --> 00:02:53,510 sabe o que fazer com ele. 60 00:02:53,510 --> 00:02:56,160 É um erro muito comum para fazer acidentalmente 61 00:02:56,160 --> 00:02:58,570 quando você está definindo primeiro estruturas. 62 00:02:58,570 --> 00:02:59,500 >> ESTÁ BEM. 63 00:02:59,500 --> 00:03:02,824 Então, nós geralmente definir as nossas estruturas no topo dos nossos programas 64 00:03:02,824 --> 00:03:05,490 porque provavelmente está indo para ser utilizado por várias funções. 65 00:03:05,490 --> 00:03:08,850 Nós não queremos definir uma struct dentro de uma função, 66 00:03:08,850 --> 00:03:12,110 porque então nós podemos only-- o âmbito da estrutura realmente 67 00:03:12,110 --> 00:03:13,790 só existe dentro dessa função. 68 00:03:13,790 --> 00:03:17,450 Nós provavelmente gostaria de definir uma estrutura para que possamos usá-lo em múltiplas funções, 69 00:03:17,450 --> 00:03:20,670 ou talvez em múltiplos arquivos que são amarrados 70 00:03:20,670 --> 00:03:22,920 para criar o nosso programa único. 71 00:03:22,920 --> 00:03:24,920 Às vezes, também, em vez de definir a estrutura 72 00:03:24,920 --> 00:03:27,961 no topo, onde você colocar o seu libra e inclui a sua libra define, 73 00:03:27,961 --> 00:03:32,080 por exemplo, você pode colocá-los em arquivos dot h separados, que você, em seguida, 74 00:03:32,080 --> 00:03:35,020 libra incluir a si mesmo. 75 00:03:35,020 --> 00:03:37,620 >> Portanto, temos estruturas, mas agora precisamos começar dentro deles. 76 00:03:37,620 --> 00:03:39,800 Como é que vamos ficar por dentro de uma estrutura para acesso 77 00:03:39,800 --> 00:03:43,530 esses sub-variáveis, essas variáveis que existe no interior da estrutura? 78 00:03:43,530 --> 00:03:46,810 Bem, nós temos uma coisa chamada o operador ponto, o que nos permite 79 00:03:46,810 --> 00:03:50,990 para acessar os campos da estrutura. 80 00:03:50,990 --> 00:03:55,490 Assim, por exemplo, digamos que eu tenho declarado meus dados estrutura do tipo em algum lugar 81 00:03:55,490 --> 00:03:59,020 no topo do meu programa, ou talvez em um arquivo dot h que eu tenho libra incluído. 82 00:03:59,020 --> 00:04:03,360 Ora, se eu quiser criar um novo variável desse tipo de dados, o que posso dizer, 83 00:04:03,360 --> 00:04:06,260 struct carro, meu carro, ponto e vírgula. 84 00:04:06,260 --> 00:04:11,580 Assim como eu poderia dizer int x, ou nome da seqüência ponto e vírgula. 85 00:04:11,580 --> 00:04:18,100 >> O tipo de dados aqui é carro struct, o nome da variável é o meu carro, 86 00:04:18,100 --> 00:04:23,770 e então eu posso usar o operador ponto para acessar os vários campos de meu carro. 87 00:04:23,770 --> 00:04:27,494 Então eu posso dizer o meu carro ano ponto é igual a 2,011. 88 00:04:27,494 --> 00:04:28,410 Isso é perfeitamente bem. 89 00:04:28,410 --> 00:04:34,210 Ano, se você se lembra, foi definida como um campo inteiro dentro deste carro struct 90 00:04:34,210 --> 00:04:35,200 tipo de dado. 91 00:04:35,200 --> 00:04:39,966 Assim, qualquer variável dos dados carro struct tipo, como meu carro, posso dizer que o meu carro 92 00:04:39,966 --> 00:04:44,030 ano ponto é igual a e depois atribuir -lhe algum valor inteiro de 2011. 93 00:04:44,030 --> 00:04:47,290 Meu ponto é igual a placa do carro CS50. 94 00:04:47,290 --> 00:04:51,180 Meu hodômetro cartão de ponto é igual a 50505 ponto e vírgula. 95 00:04:51,180 --> 00:04:53,270 Todos esses são perfeitamente bem e isso é 96 00:04:53,270 --> 00:04:57,802 como podemos acessar o campos da estrutura. 97 00:04:57,802 --> 00:05:00,260 Estruturas, no entanto, não é necessário a ser criado na pilha. 98 00:05:00,260 --> 00:05:02,950 Assim como qualquer outra variável, pode alocá-los dinamicamente. 99 00:05:02,950 --> 00:05:06,309 Se temos um programa que pode estar gerando muitas estruturas, 100 00:05:06,309 --> 00:05:08,100 nós não sabemos quantas nós vamos precisar, 101 00:05:08,100 --> 00:05:10,800 então precisamos dinamicamente alocar essas estruturas 102 00:05:10,800 --> 00:05:12,960 como o nosso programa está sendo executado. 103 00:05:12,960 --> 00:05:16,600 E por isso, se nós estamos indo para acessar o campos de uma estrutura nesse contexto, 104 00:05:16,600 --> 00:05:20,660 Lembre-se que primeiro precisamos dereference o apontador para a estrutura, 105 00:05:20,660 --> 00:05:24,810 e, em seguida, uma vez que a remoção de referência ponteiro, então podemos acessar os campos. 106 00:05:24,810 --> 00:05:26,830 Se temos apenas um Ponteiro para a estrutura, 107 00:05:26,830 --> 00:05:32,120 não podemos apenas dizer campo ponteiro dot nome e obter o que estamos procurando. 108 00:05:32,120 --> 00:05:34,259 Há a etapa extra de dereferencing. 109 00:05:34,259 --> 00:05:36,050 Então, vamos dizer que em vez do previous-- 110 00:05:36,050 --> 00:05:38,770 tal como no exemplo anterior, em vez de declará-lo 111 00:05:38,770 --> 00:05:43,680 na pilha, carro struct, meu carro, ponto e vírgula, eu digo carro struct, 112 00:05:43,680 --> 00:05:48,020 estrela, um ponteiro para uma carro struct chamado meu carro, 113 00:05:48,020 --> 00:05:51,250 equivale ao tamanho de malloc de carro struct. 114 00:05:51,250 --> 00:05:54,950 Tamanho vamos descobrir quantas bytes seu novo tipo de dados ocupa. 115 00:05:54,950 --> 00:05:58,570 Você não necessariamente só precisa usar tamanho, largura, int ou char, ou qualquer 116 00:05:58,570 --> 00:05:59,715 dos tipos de dados embutidos. 117 00:05:59,715 --> 00:06:02,090 O compilador é inteligente o suficiente para descobrir quantos bytes 118 00:06:02,090 --> 00:06:04,170 são obrigados por sua nova estrutura. 119 00:06:04,170 --> 00:06:09,610 Então eu me malloc unidade de memória grande o suficiente para segurar um carro struct, 120 00:06:09,610 --> 00:06:12,410 e eu recebo um ponteiro de volta para esse bloco de memória, 121 00:06:12,410 --> 00:06:16,090 e esse ponteiro é atribuído para o meu carro. 122 00:06:16,090 --> 00:06:18,050 >> Agora, se eu quiser o acesso os campos do meu carro, 123 00:06:18,050 --> 00:06:22,615 I primeiro dereference meu carro usando o operador de remoção de referência, estrela 124 00:06:22,615 --> 00:06:26,620 que temos visto desde os ponteiros vídeos, e, em seguida, depois que eu dereference, 125 00:06:26,620 --> 00:06:32,200 então eu posso usar o operador ponto para acessar os vários campos de meu carro. 126 00:06:32,200 --> 00:06:35,490 Estrelar meu carro dot ano é igual a 2011. 127 00:06:35,490 --> 00:06:38,480 Isso teria o efeito queremos neste caso, 128 00:06:38,480 --> 00:06:41,960 porque nós temos dinamicamente alocados meu carro. 129 00:06:41,960 --> 00:06:43,610 >> Isso é meio chato, certo? 130 00:06:43,610 --> 00:06:44,818 Há um processo de 2 passos agora. 131 00:06:44,818 --> 00:06:47,460 Agora temos que dereference-- temos um operador de estrela, 132 00:06:47,460 --> 00:06:48,910 e temos um operador ponto. 133 00:06:48,910 --> 00:06:51,660 E como você poderia esperar, porque Programadores C amo caminhos mais curtos 134 00:06:51,660 --> 00:06:53,740 para fazer as coisas, há uma caminho mais curto para fazer isso. 135 00:06:53,740 --> 00:06:57,790 Há um outro operador chamado de flecha, o que torna este processo muito mais fácil. 136 00:06:57,790 --> 00:07:00,750 A forma como funciona é seta ele primeiro dereferences 137 00:07:00,750 --> 00:07:03,560 o ponteiro do lado esquerdo lado do operador, 138 00:07:03,560 --> 00:07:06,620 e, em seguida, depois de ter desreferenciado o ponteiro à esquerda, 139 00:07:06,620 --> 00:07:09,620 ele acessa o campo à direita. 140 00:07:09,620 --> 00:07:14,170 E assim já tivemos esse tipo de Star meu carro dot todo este material, 141 00:07:14,170 --> 00:07:15,880 como não havia muita coisa acontecendo lá. 142 00:07:15,880 --> 00:07:22,040 Mas o que podemos fazer é, em vez isto-- meu ano seta carro é igual a 2011. 143 00:07:22,040 --> 00:07:23,580 >> Novamente, o que está acontecendo aqui? 144 00:07:23,580 --> 00:07:25,720 Em primeiro lugar, eu estou dereferencing meu carro. 145 00:07:25,720 --> 00:07:27,810 Que por sua vez, é um ponteiro aqui. 146 00:07:27,810 --> 00:07:31,270 Em seguida, depois de ter desreferenciado meu carro, eu 147 00:07:31,270 --> 00:07:35,130 pode, então, acessar os campos ano, prato, e conta-quilómetros 148 00:07:35,130 --> 00:07:40,020 assim como eu poderia antes de ter primeiro estrela usado para eliminar referência o meu carro, 149 00:07:40,020 --> 00:07:42,020 e ponto para acessar o campo. 150 00:07:42,020 --> 00:07:45,290 Então você pode ter estruturas, você pode ter ponteiros para estruturas, 151 00:07:45,290 --> 00:07:48,360 e você tem maneiras de acesso os domínios dessas estruturas, 152 00:07:48,360 --> 00:07:52,600 se você tem ponteiros para -los ou as próprias variáveis. 153 00:07:52,600 --> 00:07:57,640 Dot ou seta, dependendo como a variável foi declarada. 154 00:07:57,640 --> 00:08:00,510 Eu sou Doug Lloyd, este é CS50. 155 00:08:00,510 --> 00:08:01,975