Olá, seja bem-vindo de volta. A última coisa que quero falar
sobre estruturas é como elas estão relacionadas às funções, como você
pode passar estruturas como um argumento para um parâmetro e uma função e como
isso também é mais eficiente.
Portanto, estruturas como argumentos para funções.
Depois de declarar uma
estrutura chamada Família. Neste exemplo, vamos criar uma família
nomeada, como passamos essa estrutura como um argumento para uma função.
Portanto, temos essa estrutura chamada Família.
Temos um monte de matrizes de caracteres
aqui, nome, pai e mãe, e então temos uma idade interna.
Essa é a nossa definição de estrutura.
Sabemos que é uma estrutura porque a palavra-chave struct está lá seguida do nome da tag,
temos nossas chaves e assim por diante.
Agora, como realmente passamos essa estrutura para
uma função chamada irmãos?
Bem, você faria isso exatamente como declara a estrutura, diria
o tipo como o nome do parâmetro.
É muito simples. Portanto, neste caso, temos irmãos booleanos.
Irmãos está retornando um booleano.
E está levando dois parâmetros, dois parâmetros de estrutura.
Você deve identificar o tipo de estrutura que é família de estrutura de tipo.
Agora, em c mais avançado, você poderia
realmente fazer um typedf neste struct e nomeá-lo de outra forma e poderia
encurtar o nome aqui, mas não falamos sobre typeds.
Isso provavelmente seria melhor.
Mas é realmente assim que você precisa fazer. Você teria que definir o tipo inteiro, que
é a família da estrutura e, em seguida, o nome da variável, como qualquer outro parâmetro.
Então, aqui estamos passando dois parâmetros, membro um e membro dois.
Ambos são do tipo família de estrutura.
Então, dentro de nossa função, se quisermos acessar membros,
acessamos membros normalmente.
O membro um e o membro dois não são ponteiros, então não usamos o traço maior que, só
fazemos isso nos ponteiros porque precisamos retirá-los de referência para ver para onde estão apontando.
Porque eles não são ponteiros, podemos apenas apontar. Então membro um ponto mãe, membro dois ponto mãe.
O membro um ponto-mãe e a mãe dois
pontos-mãe são matrizes de caracteres e as matrizes de caracteres são essencialmente ponteiros.
Assim, podemos passá-los para a comparação de str. Str compare vai retornar igual se eles forem iguais,
então o que estamos fazendo aqui é verificando membro
um mãe e membro dois mãe são iguais. E se forem, vamos retornar verdadeiros.
Porque se ambos têm o mesmo nome
e esse seria mesmo o sobrenome, são irmãos.
Bem direto.
Fácil de passar argumentos para
funções, desde que a declaração da função contenha esse tipo de estrutura.
Portanto, esta função, novamente, dois parâmetros, cada um dos quais é uma estrutura de
família de tipos.
E se quisermos ter ponteiros para estruturas como argumentos de função.
E eu mencionei antes, é melhor fazer isso porque estamos
passando por valor e c.
Quando você passa por valor, você copia.
Se você tiver uma estrutura que contém
muitos dados, muitas estruturas grandes como
argumentos, terá que copiar tudo nessa estrutura
para a função real.
Portanto, pode levar algum tempo
para copiar essas estruturas grandes.
Bem, se você tiver um ponteiro, tudo o que você precisa fazer é copiar o
endereço, o que é muito mais rápido. Portanto, ponteiros para estruturas
são usados como parâmetros e funções para evitar o consumo de
memória e o tempo que leva para copiar todas as estruturas.
Agora, se você tem uma estrutura pequena,
não é grande coisa, mas definitivamente deseja usar ponteiros e estruturas grandes.
Então nesse caso, o que você faz, você ainda especifica o nome dos tipos
de estrutura, basta colocar o asterisco
antes, muito simples. E se você não
quiser que nenhum dos dados dentro da estrutura mude, você pode usar constante antes do tipo de estrutura.
Se você não quiser que o endereço mude, você deve colocar a constante após o ponteiro da família de estrutura.
Mas aqui, estamos fazendo a mesma coisa. Mas agora vamos acessá-lo de
forma diferente porque agora que é um ponteiro, podemos usar o traço maior
que esse novo símbolo para acessar em vez de usar o ponto.
Não precisamos usar o ponto aqui. Porque lembre-se, os
ponteiros você tem que remover a referência primeiro, então você teria que colocá-lo entre parênteses, é mais
sintaxe para remover a referência do ponteiro do que você teria que colocar o ponto fora do parêntese porque
ele tem uma precedência mais alta, muito mais fácil de usar o traço do que maior que.
Traço e maior que a mãe, traço
e maior que a mãe são ambos ponteiros, podem ser passados na comparação de str.
Se eles forem iguais, retorne verdadeiro. Caso contrário, retorne falso, bastante direto.
Você também pode usar o modificador const como
mencionei se não quiser permitir nenhuma modificação dos membros da estrutura.
Para onde a estrutura está apontando, você coloca const antes do ponteiro.
Você também poderia colocar o const antes da família.
Neste caso, a família tem um tipo de letra.
Portanto, aqui seria
realmente construir família ou estrutura ponteiro const da família.
E então acesse novamente da mesma forma, você não está modificando nada. Então você está pronto para ir.
O compilador não vai reclamar.
Você também pode usar o modificador de constante se não quiser permitir
nenhuma modificação do próprio endereço.
Qualquer tentativa de alterar essas estruturas causará uma mensagem de erro durante a compilação.
Então aqui você diria estrela
da família e colocaria a constante após a estrela.
E o que isso quer dizer é que você
não pode alterar o valor de p-membro, o valor do ponteiro, que é um endereço.
Mas, novamente, isso não é muito útil porque
quando você passa por valor, na verdade está passando uma cópia do endereço.
Portanto, isso é redundante, você não precisa fazer isso, mas pode.
E aqui, novamente, você deseja ser capaz de alterar o endereço do que é o membro p.
E neste caso, você está apenas acessando os dados de qualquer maneira para ver se eles são iguais.
O operador de indireção em cada definição de parâmetro está agora
na frente da palavra-chave constante.
Esse asterisco não está na frente do nome do parâmetro.
Você não pode modificar o endereço armazenado nos ponteiros porque ele está após o asterisco.
Se estiver na frente do tipo de nome do
parâmetro, você poderá modificar o real para o qual está apontando.
Se tivéssemos aquele operador de indireção na frente do nome do parâmetro, o que seria na
constante antes dele, isso significaria que você
deseja ser capaz de modificar o que ele está apontando. Isso é apenas dizer o endereço.
Portanto, você não pode modificar o endereço armazenado nos ponteiros.
São os ponteiros que são protegidos aqui, não as estruturas
para as quais eles apontam, assim como constantes e outros parâmetros de ponteiro, sem diferença com structs.
Se você deseja retornar uma estrutura de uma função que é
um ponteiro, o protótipo da função deve indicar esse valor de retorno da
maneira normal na declaração.
Então aqui você teria que dizer atingido até
a data meu ponteiro
divertido ou não ponteiro, não importa. Este é um protótipo para uma função sem argumentos que retorna uma
estrutura do tipo data, muito fácil de retornar uma estrutura de uma função. E qual é o valor disso.
Bem, agora podemos retornar mais de
um elemento ou um item de dados de uma função.
Se você estiver retornando uma estrutura, poderá retornar 10 valores, 10 itens de dados diferentes.
Quão legal é isso. A estrutura permite que você retorne mais de um de uma função.
Muito, muito valioso.
Portanto, geralmente é mais conveniente retornar um ponteiro para uma estrutura do que apenas para a estrutura.
Quando você retorna um ponteiro para a estrutura, ele é criado no heap porque
todos os ponteiros são criados no heap.
Isso significa que vai durar um pouco mais.
E isso significa que você pode excluí-lo e gerenciá-lo em momentos arbitrários.
Portanto, neste exemplo, estamos criando uma estrutura chamada fundos.
Ele contém uma matriz
de caracteres chamada banco, contém um duplo, outro caractere
chamado salvo de um comprimento específico. Presumiu-se que a duração da diversão é igual a 50.
E então ele tem um duplo salvo.
Temos uma função chamada soma que toma essa estrutura como parâmetro.
E tudo o que estamos fazendo é retornar um -
o fundo do banco da primeira estrutura mais o fundo de poupança, e isso
vai retornar a quantia que eles têm em seu banco.
Neste exemplo, sum é apenas um duplo.
Não estamos retornando um ponteiro. Estamos apenas tomando um ponteiro como parâmetro.
E então, em nossa função principal, estamos criando uma variável de
estrutura chamada stan do tipo struct funds.
Estamos inicializando-o com alguns valores e depois imprimindo o total
da soma de chamadas. E apenas passamos essa estrutura como passamos qualquer variável.
Não temos que retirar a referência, não é um ponteiro. Não precisamos realmente fazer nada de especial.
Nós apenas nos certificamos de que na declaração da função temos aquele tipo de estrutura lá,
mas todo o resto parece normal.
Alguns lembretes.
Mencionei anteriormente que você deve sempre usar ponteiros ao passar estruturas para uma função.
Por quê? Porque lembre-se, as versões mais antigas
de c
não permitem que estruturas sejam passadas, mas permitem ponteiros.
Portanto, você pode evitar qualquer tipo de compatibilidade com versões anteriores.
Se você estiver usando uma versão mais antiga de c, seu programa funcionará.
Portanto, apenas passar esse único endereço também
é mais eficiente por causa do tempo de cópia.
Mas se você fizer isso, se você passar um parâmetro que é um
ponteiro para uma estrutura dentro de uma função, ele terá menos proteção para seus dados.
Portanto, algumas operações na função chamada podem afetar inadvertidamente os dados
na estrutura original.
E é aqui que você deseja usar o qualificador const.
E você usaria const antes do tipo
real, não depois do asterisco e antes do nome
do parâmetro, antes do tipo.
A vantagem de passar estruturas são os argumentos, a
função trabalha com cópias dos dados originais.
É mais seguro do que trabalhar com os dados originais.
Portanto, essa é realmente a única vez em que você deseja passar uma estrutura como um argumento que não é um ponteiro.
E o estilo de programação tende a ser um pouco mais claro.
As principais desvantagens de passar estruturas como argumentos em oposição a passar um
ponteiro estruturado como um argumento é que
implementações mais antigas podem não lidar com o código,
isso desperdiça tempo e espaço e
é especialmente um desperdício quando você tem estruturas grandes, temos que copiar
muito para cada membro. Portanto, mantenha isso em mente.
Na maior parte do tempo, você deseja passar ponteiros
para estruturas, de forma muito mais eficiente e com economia de tempo.
Os programadores usam ponteiros de estrutura como argumentos de função por razões de eficiência
e usam constantes quando necessário. E esta é a combinação que você deseja fazer.
Se você está preocupado com a proteção, apenas use o ponteiro
de função para eficiência e então use
a const const para que nada seja bagunçado dentro
da função, assim como os ponteiros realmente normais
mais ou menos, mas com ponteiros é ainda mais importante com a eficiência
porque de grandes estruturas.
A passagem de estruturas por valor geralmente é feita para estruturas pequenas e essas
são as regras que você deseja considerar.
Tudo bem para passar uma estrutura que não é um ponteiro, contanto que seja pequena.
Novamente, alguns conceitos importantes relacionados a estruturas e
ponteiros de passagem como parâmetros, argumentos e
ponteiros de retorno também. Agora, podemos realmente começar a implementar
algumas dessas coisas. Oferecemos muitos exemplos. Nós entendemos os conceitos. Nós entendemos a sintaxe.
Agora eu quero apresentar a você alguns desafios que o colocam de fato fazendo isso, você memorizou
na sintaxe que agora, se você quiser criar uma estrutura no programa, você sabe como fazer isso
como a palma da sua mão.
Então, teremos alguns desafios em nossas próximas palestras
para familiarizá-los com todas essas coisas sobre as quais falamos sobre estruturas.
Obrigada.