Olá e bem-vindo. Estamos em uma nova seção.
Estaremos falando sobre estruturas.
Este é um novo conceito em c que
permite agrupar itens, semelhante ao array, mas mais poderoso.
Quero falar sobre o que é uma estrutura, como você pode criar
e usar uma estrutura.
Portanto, as estruturas em c fornecem outra ferramenta para agrupar elementos.
Novamente, mencionei que eles são semelhantes a um array, mas na verdade são um pouco mais poderosos.
Se você está familiarizado com
a programação orientada a objetos, se você programa
em java ou c-plus plus ou qualquer linguagem orientada a objetos,
é como um objeto, mas apenas com membros de dados, sem comportamento real, sem métodos.
Portanto, é um conceito
poderoso que você usará em muitos programas em C
que desenvolver, porque você pode agrupar diferentes itens em
um único nome e esses podem representar essencialmente atributos de dados.
Por exemplo, digamos que você queira armazenar uma data dentro de um programa.
Uma data geralmente consiste em três variáveis: mês, dia e ano.
Você criaria essas três variáveis para armazenar esses dados.
Por exemplo, você diria que o mês inteiro é igual a 9 dia é igual a 25
ano é igual a 2015.
Suponha que seu programa também precise armazenar a data de compra de um determinado item.
Bem, provavelmente você teria que criar mais três variáveis para cada
data que usar em seu programa. Então você pode ver como isso
pode ficar muito repetitivo e você acaba criando muitas variáveis.
Mas o que você deve notar é que essas variáveis estão logicamente relacionadas. São todos encontros.
Eles realmente deveriam ser agrupados.
Eles devem ser quase seus próprios tipos de dados e, então, você deve ser capaz de
criá-los e acessar os diferentes elementos.
Você não deve ter que criar três variáveis separadas para cada data.
Então, novamente, é aqui que se trata de objetos e de
uma classe que possui três atributos de dados.
Portanto, seria muito melhor se você pudesse agrupar de alguma forma esses conjuntos de três variáveis.
E é exatamente isso que o elemento de estrutura faz e c.
Ele permite que você agrupe esses diferentes elementos com um nome específico.
Você pode então criar diferentes variáveis com aquele nome
e acessar os elementos naquele nome,
os diferentes atributos de dados, eles são realmente chamados de membros.
Então, como você cria uma estrutura em c.
É muito simples. A declaração de estrutura descreve como uma estrutura é montada.
Quais elementos estão dentro da estrutura.
E geralmente nos referimos a esses elementos como membros.
Porque primeiro você tem que definir a estrutura ou declarar a
estrutura, descreva o que está dentro da estrutura.
E então você pode fazer isso com a palavra-chave struct.
A palavra-chave struct permite que você defina uma coleção
de variáveis de vários tipos, chamada de estrutura, que pode ser tratada como uma unidade única.
Muito, muito poderoso.
Portanto, ao usar essa palavra-chave de struct, tudo que você precisa fazer é fornecer um nome,
e isso geralmente é conhecido como o nome da tag. Neste exemplo, temos um nome de tag de data.
Mas você vê a palavra-chave struct, que é a palavra-chave que diz
ao compilador c que essa será uma função específica.
Isso pode ter uma funcionalidade específica que permite agrupar elementos.
Portanto, struct é a palavra-chave seguida pelo nome da
tag e você tem a chave esquerda
e a chave direita seguidas de um ponto-e-vírgula para terminar.
E aí dentro, você pode definir qualquer tipo de variável que quiser, você pode até colocar ponteiros lá.
E esses são chamados de membros da estrutura.
Portanto, esta é a declaração novamente, ela define uma estrutura de
datas que o compilador c compreenderá.
Diz ao compilador c o que a estrutura de estado
irá conter, três elementos: mês,
dia e ano. Não há alocação de memória para esta declaração.
Novamente, o que você está dizendo é que esta é uma estrutura que existe.
Ainda não comecei a usar. Eu acabei de dizer que é assim que vai ser definido.
Essa será a estrutura de datas e é nisso que consiste.
Os nomes das variáveis dentro da estrutura de data, o mês, o dia e
o ano, são chamados de membros ou campos.
Os membros da estrutura aparecem entre as chaves que
seguem a data do nome da tag struct, portanto, data do nome da tag.
Sintaxe muito, muito simples para agrupar esses elementos dentro de um único nome que é data.
E você percebe que é diferente de uma matriz porque
não há índices, você não está realmente especificando um tamanho.
Não é exatamente o mesmo tipo de dados.
Você pode ter diferentes tipos de dados e muitos tipos diferentes.
Então, como você utilizaria essa estrutura.
Bem, a definição de data define um novo tipo na linguagem.
Você pode realmente pensar nisso como outro tipo, como um int, um duplo ou um float.
Exceto esse tipo que você definiu, você quase pode pensar nele como um enum.
Exceto que um enum contém apenas um valor.
Essa estrutura de data pode conter três valores, mas é outro tipo de dados.
As variáveis agora podem ser declaradas como sendo do tipo struct até o momento.
Então é exatamente isso que você faria.
Você pode criar uma nova variável chamada today
e será do tipo struct date.
E hoje será essencialmente capaz de sustentar três valores.
E então, se você precisar declarar
mais datas, poderá criar mais variáveis do mesmo tipo.
E assim você não precisa mais ter três variáveis separadas para uma data de
compra, três variáveis separadas para a
data atual, três variáveis separadas para uma data de faturamento.
Você pode ter uma
variável ou duas variáveis de instâncias diferentes dessa estrutura real.
Mais uma vez, espero que você perceba como isso pode ser poderoso.
Portanto, esta declaração acima é do tipo data de estrutura, data
de compra
A memória agora está alocada porque você declarou a variável
Memory está alocada para esta estrutura.
A memória é alocada para os três valores inteiros ou os três
membros de cada variável, de
forma que a memória será alocada.
E também o motivo pelo qual ele será alocado é porque não há ponteiros nele.
Se houvesse ponteiros nessa estrutura, você teria que alocar memória para esse ponteiro.
Mas como essa estrutura de data de hoje é uma estrutura muito
simples. Estou começando devagar, ela contém três ints, esses membros são alocados automaticamente para você.
Mas certifique-se de entender essa distinção do slide anterior e deste slide atual.
Há uma diferença entre definir uma estrutura e declarar as variáveis desse
tipo de estrutura específico.
A estrutura financeira, novamente, está apenas dizendo ao compilador c aqui está uma
estrutura e isso - esses são os dados que estão dentro dela.
Mas, na verdade, declarar uma variável desse tipo de estrutura em
particular significa que vou começar a usar essa estrutura.
Agora tenho memória alocada para os três elementos em nosso exemplo
e posso acessar esses elementos e defini-los.
Então, como você acessa os membros em uma estrutura?
Portanto, agora que você sabe como definir uma estrutura
e como declarar variáveis de estrutura, agora
você precisa ser capaz de entender como se referir a esses membros de struct.
Você tem que acessá-los. Se você não pudesse acessá-los para ver os valores ou definir valores, seria inútil.
Portanto, o nome de uma variável de estrutura não é um ponteiro.
Portanto, você precisa de uma sintaxe especial para acessar os membros.
Porque os ponteiros geralmente contêm apenas o valor de
um endereço.
E se não for um ponteiro, você precisará de alguma sintaxe especial.
Você pode se referir a um membro de uma estrutura escrevendo o nome da variável seguido por um ponto.
Geralmente é chamado de operador ponto.
E então, após o período do
operador ponto, você segue o nome da variável de membro dentro dessa estrutura.
O período entre o nome da variável
de estrutura e o nome do membro é chamado de operador de
seleção de membro, também conhecido como operador de ponto.
Não há espaços permitidos entre o nome da variável, o período e o nome do membro.
Para definir o valor do dia na variável hoje em
25, eu faria algo assim. O nome da variável que
é hoje, e então eu diria ponto, sem espaços entre os lados.
E então eu especificaria o nome do elemento dentro da definição da estrutura,
que é dia.
E então eu iria atribuí-lo da mesma forma que atribuo qualquer outro inteiro.
Eu usaria o operador de
atribuição igual, uma constante literal aqui e o ponto-e-vírgula.
Muito, muito simples. Se eu quiser
atribuir o ano, diria hoje. ano e eu diria igual a 2015, por exemplo.
E quando eu quiser acessar os valores dos membros.
Por exemplo, se eu quisesse acessar o valor do membro do mês para ver se ele é igual a
12, ainda usaria aquela sintaxe de ponto, aquele operador de seleção de membro.
Portanto, você pode usar o operador de seleção de membro para acessar os valores dos membros.
E quando você acessa essas
variáveis de membro, você pode usá-las da mesma forma que usa outras variáveis.
Você pode usá-los em operações aritméticas se eles forem inteiros.
Você seguiria as regras desse tipo de dados.
Portanto, neste caso, podemos comparar isso em 12 apenas usando
igual a igual dentro de uma instrução if.
E então, por exemplo, se fosse igual a 12, poderíamos dizer que o próximo mês é igual a 1.
Essa pode ser uma variável local que atribuiríamos.
Então, vamos ver um exemplo. Aqui estamos definindo uma estrutura chamada data.
Temos três elementos, inteiros: mês, dia e ano.
Sabemos que o estamos definindo porque temos a palavra-chave struct e essas chaves.
E então observe também que a chave direita tem um ponto e vírgula para encerrar a definição.
Neste ponto, nenhuma memória é alocada para esta estrutura.
Na próxima linha, na verdade declaramos uma variável desse tipo,
então agora estamos alocando memória para um nome de variável hoje que
contém três elementos essencialmente: mês, dia e ano do tipo int.
Podemos atribuir dados a esses três elementos dentro dessa estrutura hoje,
apenas usando esse acesso de membro de ponto.
Então hoje. mês é igual a nove, hoje. dia é igual a 25 e hoje. ano de 2015.
Se quiséssemos imprimi-lo ou acessar esses dados, o acessaríamos da mesma forma
após atribuí-lo. Gostaríamos apenas de usar essa seleção de membros: hoje. mês, hoje. dia
a dia. ano. E, novamente, podemos realizar operações aritméticas porque é um int.
Usaríamos porcentagem d ou, se quisermos formatá-lo para 2,
poderíamos dizer porcentagem 2I ou porcentagem 2D.
Portanto, esta é uma sintaxe bastante direta,
muito fácil de criar e definir estruturas e, em seguida, usá-las e
acessá-las usando o operador de seleção de membro de ponto.
Que tal estruturas e expressões?
Bem, você acabou de ver que consegui acessar os dados e usando uma expressão aritmética
e não é diferente.
Quando se trata da avaliação da expressão,
os membros da estrutura seguem as mesmas regras que as variáveis comuns.
Se você tiver membros dentro dessa estrutura que são inteiros, você pode
fazer as mesmas regras de qualquer outro inteiro.
Você pode aplicar adição, subtração e assim por diante. Se for um buffer de personagem, você só pode
seguir as regras dos buffers de personagem. Você pode adicionar e menos buffers
de caracteres, coisas assim, geralmente não.
Então, floats, doubles, todos os tipos de dados
diferentes, você apenas seguiria essas mesmas regras ao usar esses membros dentro de expressões.
Então aqui está um exemplo.
Eu digo hoje. anos divididos por cem mais um.
Perfeitamente válido porque year é um int,
não diferente de usar uma variável regular do tipo int.
Você apenas acessa de forma diferente usando aquele operador de seleção de membro.
Agora existem variantes. Existem diferentes maneiras de definir as estruturas.
A única coisa excelente sobre c é sua flexibilidade ec
permite definir uma estrutura de muitas maneiras diferentes. Portanto, você pode ver
uma sintaxe diferente ao definir uma estrutura.
O primeiro exemplo que mostrei é realmente aquele que você deve seguir. Você deve sempre ter um nome
de tag e definir a estrutura em um lugar do código e, em seguida, declarar
as variáveis dele em outro. Mas c sendo
como é, é muito flexível. Você pode definir estruturas e declarar variáveis na mesma linha.
E você também pode definir estruturas anônimas ou nenhuma estrutura nomeada.
Portanto, há muita flexibilidade. É válido declarar uma variável como
parte de uma estrutura particular ao mesmo tempo em que você está realmente definindo a estrutura.
Você pode colocar o nome da variável na parte inferior. Vou te mostrar como fazer isso.
Inclua o nome ou nomes da variável antes do ponto-e-vírgula final da definição da estrutura.
E você também pode atribuir e inicializar valores a essas variáveis da maneira
normal que atribui a quaisquer variáveis. Então, vamos dar uma olhada nisso.
Uma variação de definir uma estrutura fazendo isso ao mesmo tempo em que você está definindo,
você pode declarar uma variável. Portanto, neste caso, definimos
nossa data de estrutura, mas também criamos uma variável chamada hoje.
Porque na chave direita final é o nome antes do ponto-e-vírgula, que está fazendo
a criação da variável do tipo estrutura de data e a definição da data da estrutura.
Portanto, neste exemplo acima, você está criando
uma variável da estrutura.
Referimo-nos a isso também como uma instância da estrutura. É chamado hoje.
É declarado ao mesmo tempo que a estrutura é definida.
Portanto, hoje é uma variável do tipo data, fizemos tudo em um.
E você poderia, na verdade, logo após
fazer o hoje, você poderia realmente inicializar essas variáveis usando
os colchetes e, em seguida,
dizendo que mês é igual a cinco, dia é igual e assim por
diante, assim como você inicializa qualquer outro número inteiro.
Agora, novamente, outra maneira de criar uma estrutura é
criar uma estrutura sem nome. Isso é um pouco mais limitado porque
você não pode fazer muito com ele.
Mas você não precisa realmente fornecer um nome de tag.
Lembre-se de que o nome da tag está no topo, logo após a palavra-chave struct.
Nos exemplos anteriores, o nome da tag era data.
Mas você não precisa fornecer essa data.
Se todas as variáveis de um determinado tipo de estrutura forem definidas quando a estrutura for
definida, o nome poderá ser omitido.
E o que isso realmente significa é que você só usará a
estrutura uma vez e apenas uma vez.
Portanto, poderíamos apenas dizer struct
int day, int year, int month e então
declarar a variável na mesma coisa.
Mas você notará que não há nenhum nome de tag depois da palavra-chave struct.
Esta é apenas uma estrutura. Vamos usar uma vez,
então criamos a variável hoje e nunca mais a usaremos.
E essa é realmente a desvantagem e a limitação.
Você realmente nunca quer fazer isso, a menos que tenha algum tipo de estrutura local que use uma vez.
Mas você não pode definir outras instâncias disso se definir
a estrutura dessa forma como
uma estrutura sem nome, uma estrutura sem nome.
Todas as variáveis desse tipo de estrutura que você deseja para o seu programa devem ser definidas em uma instrução.
Você pode criar mais de uma variável, você pode fazer a vírgula
today e depois outra variável, para criar várias variáveis.
Você pode inicializar várias variáveis.
Mas esta forma é um pouco limitada porque após a
declaração da variável na parte inferior, você não pode criar mais variáveis.
Portanto, há três maneiras de definir estruturas diferentes.
Uma maneira é definir a estrutura com um nome de
tag e não criar a variável. Você cria a variável em uma instância separada quando a memória é alocada.
Outra forma é criar a variável e a estrutura
e ao mesmo tempo onde você teria um
nome de tag e isso permitiria
a você criar outras instâncias ou outras variáveis desse tipo de estrutura posteriormente em
seu programa ou esta terceira opção onde você poderia criar uma estrutura
sem nome, sem nome
e apenas a variável na parte inferior. E, novamente, você pode inicializar todos eles
sempre que criar as variáveis usando apenas as chaves e assim por diante.
Então, agora inicializando estruturas.
A inicialização de estruturas é muito semelhante à inicialização de matrizes.
Os elementos são listados dentro de um par de chaves
com cada elemento separado por uma vírgula.
Na verdade, não há coisas novas para aprender aqui.
Os valores iniciais listados entre as chaves devem ser expressões constantes. Você não
pode usar variáveis, é semelhante a uma matriz.
Aqui estamos criando uma variável de hoje do tipo
struct date e estamos dizendo que o primeiro membro é igual
a sete, o segundo é dois e o terceiro é 2015, que corresponde ao dia
do mês no ano porque essa é a ordem
de como eles foram definidos na estrutura.
Portanto, assim como uma inicialização de array,
menos valores podem ser listados do que os contidos na estrutura.
Você não precisa fornecer todos os três, você pode
apenas fornecer dois e isso inicializaria o mês e o dia
e não inicializaria o ano.
Portanto, isso definiria a data. 1. mês
até 12 data1. dia a 10, mas não fornece nenhum valor inicial até a data. ano.
Você também pode especificar os nomes dos membros na lista de inicialização, desta forma,
você não precisa realmente ter nenhum pedido.
Você pode colocá-los na ordem que quiser e não depende disso.
Então você pode fazer algo parecido. membro é igual a
valor e data de estrutura, data um. Você poderia dizer que ponto mês é igual a 12.
Portanto, a sintaxe inicial disso é definir o membro entre colchetes
com o ponto e, em seguida, apenas atribuir o valor, ponto mês é igual
a 12 vírgula ponto data é igual a 10.
Você precisa desse ponto. Esse ponto é importante, então não se esqueça dele.
Você não precisa da instância antes do ponto.
Portanto, isso apenas definirá o membro do ano da variável
da estrutura de datas de hoje para 2015
no próximo exemplo.
Portanto, aqui apenas dizemos porque lembre-se de que você pode omitir
algumas das outras variáveis de membro. E, neste caso, estamos admitindo o
mês do dia, então vamos definir o ano apenas para 2015.
No caso anterior, omitimos o ano e apenas
definimos o mês e a data como 12 e 10, respectivamente.
Também podemos fazer atribuições com literais compostos.
Bem, o que é isso exatamente é um literal composto.
Você pode atribuir um ou mais valores a uma estrutura em uma única
instrução usando o que é conhecido como literal composto.
Eu acredito que isso pode ser apenas no C11.
Mas aqui temos hoje,
vamos supor que criamos uma variável de data de estrutura hoje
e, na verdade, estamos colocando entre parênteses a data da estrutura.
E dentro das chaves, estamos dizendo 9 vírgula 25 vírgula 2015.
E este é um literal composto.
Esta declaração pode aparecer em qualquer lugar do programa.
Portanto, ao contrário de realmente inicializar ou atribuir valores usando o membro ponto,
você pode colocá-lo em qualquer lugar do programa depois de realmente inicializar
a estrutura de hoje. Não é uma declaração de declaração.
Esta é uma atribuição literal composta.
O operador typecast é usado para informar ao compilador o tipo da expressão.
Então você precisa daquelas coisas entre parênteses que são um elenco, uma data de estrutura.
A lista de valores segue o
elenco e deve ser atribuída aos membros da estrutura nessa ordem, é dependente da ordem.
Portanto, está listado da mesma maneira como se você estivesse inicializando uma variável de estrutura.
Novamente, a vantagem disso é
que você não precisa atribuir cada variável de membro individualmente em linhas separadas.
Você pode fazer tudo em uma linha e dizer ok, este é o novo
valor para esta variável hoje.
Você também pode especificar valores usando a notação de membro de ponto como mencionei.
Você só teria que fazer isso em uma linha como
esta ou em linhas separadas. E dessa forma, parece com a inicialização, mas
você ainda está fazendo os literais compostos.
A vantagem de usar essa abordagem é que os argumentos podem aparecer em
qualquer ordem, assim como anteriormente.
Novamente, a chave e a diferença dessas atribuições é que não
está acontecendo na inicialização, você está fazendo
isso em algum outro lugar do programa para atribuir novos valores a esse tipo.
Portanto, muitas informações boas nesta palestra.
Falamos sobre structs e como eles são poderosos e como podemos agrupar
diferentes elementos ou diferentes variáveis em um único nome.
Nós definimos essa estrutura. Existem várias maneiras de definir uma estrutura.
E então também precisamos declarar uma variável.
Assim que tivermos essa variável, podemos acessar
e atribuir dados a essa estrutura usando o operador de seleção de membro de ponto.
E então também discutimos algumas das diferentes notações e
diferentes maneiras de fazer as coisas, bem como a inicialização.
Vamos usar bastante estruturas.
Terei alguns desafios que o ajudarão a se familiarizar com essa sintaxe.
Mas este é apenas o começo da estrutura. Também temos que
falar sobre estruturas aninhadas, como você pode usar ponteiros
e estruturas e coisas assim.
Então, boa sorte, esta será uma seção divertida e empolgante. Obrigada.