·
Biomedicina ·
Linguagens de Programação
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
Texto de pré-visualização
TECNICAS DE PROGRAMACAO UNIDADE 3 ALOCACAO DE MEMORIA ESTATICA E DINAMICA Fernando Cortez Sica 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 231 21082023 1631 Técnicas de Programacgao ee Introducgao trodug Iniciamos o nosso terceiro encontro sobre Técnicas de Programado Conversaremos sobre um ponto que ajudara o programa a se tornar mais flexivel e em certos casos mais eficiente essa flexibilidade é conseguida pela utilizacgdo de ponteiros Mas j4 ndo usamos ponteiros na passagem de pardmetros por referéncia Sim exato O primeiro uso e contato com os ponteiros foi na passagem de pardmetros por referéncia usando os simbolos e Mas aonde mais usamos ponteiros Podemos encontrar ponteiros nos cdédigos que manipulam os dispositivos do hardware os chamados device drivers no kernel do sistema operacional nos sistemas de banco de dados e em outras diferentes aplicacdes Quando conversamos sobre vetores e falamos que seria necessario definirmos um tamanho ja na declaraao de variaveis vocé pode ter se perguntado mas caso a quantidade de itens manipulados aumentasse teriamos que modificar 0 programa alterandose o tamanho do vetor Sim no caso dos vetores ja que eles sdo estruturas de tamanho fixo prédefinido Mas entéo com a utilizacdo de ponteiros esse problema é eliminado Sim veremos uma estratégia denominada alocacdo de memoria dinamica que servira dentre outras coisas para eliminar esse problema No entanto pode surgir uma outra questao se os ponteiros nos possibilitam uma manipulacao de memoria mais poderosa entdo é mais dificil de programar Vamos tentar nao usar o termo dificuldade e sim falar que o uso de ponteiros requer um pouco mais de atenao devido ao seu alto poder de abstracao Neste capitulo falaremos sobre os conceitos e manipulacdo de ponteiros Ja que mencionamos anteriormente que os vetores na passagem de parametros das funées sao considerados como ponteiros entaéo veremos como definir vetores e matrizes usando ponteiros em seguida conversaremos sobre uma outra forma de manipular informagées no caso informacées heterogéneas o uso de estruturas ou registros Por fim vamos abordar a representacdo de tais estruturas como ponteiros 31 Ponteiros Um ponteiro é uma referéncia a uma posiado de memoria A diferenca basica entre uma variavel do tipo ponteiro e uma ndo ponteiro consiste no fato de que uma variavel que nado seja ponteiro armazena um valor propriamente dito Por sua vez uma variavel do tipo ponteiro realiza uma indirecdo ou seja faz uma referéncia indireta a um valor Mas na declaracdéo de uma variavel como diferenciar e manipular os dois tipos Para respondermos essa pergunta vamos nos amparar com 0 cédigo abaixo httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 331 21082023 1631 Técnicas de Programacgao include stdioh int maine ink a1 ffvariavel normal finha 1 int bg fivariavel do tipo ponteiro para int fflinha 2 b J sinha 3 printf a s2dvt bk4d posicao a sipi iponteiro bepin Ay D Hay b5 inha 4 a Sey ff inha 5 printfValor de b modificado para d by sinha 6 return y Neste cédigo temos as explanac6es para as linhas descritas a seguir Clique nos itens e confira Linhal Declaracgao da variavel a do tipo int sem ser ponteiro instanciada com o valor 10 Linha 2 Declaragdo da variavel b como sendo um ponteiro para um int Para declarar um ponteiro utilizase antes do nome da variavel como denotado por b Linha 3 Nesta linha temos a indicacao que a posiccao de memoria apontada por b passa a ser 0 endereco da variavel a O ponteiro b neste caso nao fez uso do o precedendo pois estamos a manipular o proprio valor do ponteiro Para denotarmos a posicdo de memoria de uma httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 431 21082023 1631 Técnicas de Programagao variavel usamos o simbolo como denotado por a Vocé pode se perguntar é por esse motivo que usamos esse simbolo na passagem de parametros por referéncia nas fundes Sim exatamente Na chamada da funao OS pardmetros passados por referéncia sao precedidos por pois passamos para a fundo na verdade o endereco de memoria da variavel envolvida Linha 4 A funcao printf imprime os valores da variavel a e do conteido da posiao de memoria apontado por b e também a posicado de memoria na qual foi alocada a variavel a e a posicao do ponteiro b Na execuao poderemos notar que esses dois Uultimos valores sao iguais pois referenciam a mesma posiao de memoria Linha5 O valor da variavel a é modificada Como o ponteiro b aponta para a qualquer modificacgao de a altera prontamente o valor do conteudo de b Sendo assim a funao printf da linha 6 imprimira o valor atribuido a a no caso imprimira o valor 30 O fato da modificacao da variavel a impactar 0 valor do contetido apontado pela variavel b apés a execucao da linha 3 pode ser explicado por intermédio da figura a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTTECPRO19unidade3ebookindexhtml 531 21082023 1631 Técnicas de Programacgao Figura 1 Estados das variaveis apés a execucdo da linha 5 do cédigo acima O ponteiro b aponta para a mesma posido de memoria da variavel a Fonte Elaborada pelo autor 2019 A figura acima ilustra que apos a execuao da linha contendo a instanciaao b a 0 ponteiro b aponta para a mesma posido de memoria da variavel a Sendo assim qualquer alteracdo de a altera 0 contetido do ponteiro b b Como mencionado em Deitel 2011 todo ponteiro para ser efetivamente manipulado deve ser instanciado Porém podemos em algumas ocasi6ées definir um ponteiro apontando para um valor nulo Neste caso para criarmos um ponteiro nulo poderemos proceder de alguma das formas a seguir int p es NULL q BF Na linha de cédigo acima temos a instanciagao de dois ponteiros m q com o valor nulo A definiado do encontrase no arquivo header ot rll by Falamos até aqui de um ponteiro apontando para uma variavel nao ponteiro Mas um ponteiro também pode apontar para um ponteiro Veremos isso a seguir 32 Ponteiros para ponteiros Um ponteiro para ponteiro significa que a variavel do tipo ponteiro nao faz referéncia a uma posiado de memoria e sim faz referéncia a um outro ponteiro Esse Ultimo por sua vez aponta uma posiao de memoria que contém efetivamente o valor armazenado Para falarmos de ponteiros para ponteiros vamos imaginar uma utilidade suponha que uma matriz seja implementada com ponteiros como veremos adiante e que em um certo momento necessitemos realizar uma operacdo de ordenado sabemos que a ordenacdo da matriz necessita da movimentaao de dados Uma Ultima suposiao cada célula da matriz armazena uma informado de tamanho relativamente grande Com esse cenario podemos concluir que demandaremos para realizar a operacado de ordenado uma grande movimentaado de informacées Para atenuar isso podemos construir uma matriz formada por ponteiros para ponteiros Neste caso cada ponteiro aponta para uma posido da matriz ou seja um ponteiro aponta para cada ponteiro que caracteriza a matriz Sendo assim ordenar uma matriz significa instanciar ponteiros e nado movimentar grandes volumes de informacdo MIZRAHI 2008 Mas como podemos definir ponteiros para ponteiros Vamos analisar o cédigo a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 631 21082023 1631 Técnicas de Programacgao include stdioh int maint c ink a 16 by mc ffi OD ag FF2 c b5 ff3 printfasid beid cxdinaabacdy Fit prantfipos akp pos bp pos wwcsp pos acsip pos cpin Ha0CyHCCG fi return Gy Clique nas abas abaixo e conhea a descriao de cada linha do cédigo acima Linha 1 Avariavel b éum ponteiro para int uso do simbolo precedendo o nome da variavel Por sua vez 0 uso de dois sinais denotaem um ponteiro para ponteiro Linha 2 Instanciagdo do ponteiro b recebendo o endereco da variavel a Linha 3 instanciagdo do ponteiro para ponteiro recebendo o endereco do ponteiro b Linha4e5 Impressdo dos conteudos e dos enderecos das variaveis e ponteiros Notase que para imprimir o valor final no caso 10 devemos indicar no caso do ponteiro para ponteiro queaimpressdo se refere ao contetido do conteuido de c ou seja valor do ponteiro que aponta para o ponteiro b que por sua vez aponta para a variavel a esse 60 motivo da utilizagdo de precedendo o nome da variavel A figura a seguir ilustra melhor esse encadeamento de indireées httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 731 21082023 1631 Técnicas de Programacgao qd b C Figura 2 Relacdo dos apontamentos feitos por um ponteiro b e por um ponteiro para ponteiro c Fonte Elaborada pelo autor 2019 Em C podemos aumentar a indirecdo criando por exemplo ponteiro para ponteiro para ponteiro Neste caso a criacdo da variavel seria feita da seguinte forma por exemplo int p A quantidade de simbolos indica a quantidade de indireées desejadas VOCE SABIA e Em algumas ocasi6es tais como sistemas embarcados fun6es para o tratamento de interrup6es e implementacdo de threads temos que usar ponteiros para fungdes Desta forma a chamada de fungdes tornase dinamica facilmente configuravel Para saber um pouco mais sobre o assunto clique neste link httpswwwembarcadoscombrponteiroemcfuncoes https wwwembarcadoscombrponteiroemcfuncoes GARCIA 2015 eee eee eeeeeeeeeeeeeeeee reer reer e eee eeeeeeeeeeee eee eee eee eee eee Quando mencionamos uma das aplicacgées de ponteiros para ponteiros mencionamos o caso de matrizes definidas com ponteiros Para chegar 14 vamos compreender antes como definimos vetores com ponteiros ww e 33 Alocacao de vetores como ponteiros Quando mencionamos o fato de que na passagem de paradmetros de funcées os vetores se comportam como passagem por referéncia queremos dizer que na verdade vetores sdo manipulados como ponteiros De fato o compilador cria um espaco de memoria de tamanho NK onde N representa a dimensAo do vetor e K 0 espaco httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 831 21082023 1631 Técnicas de Programacgao gasto para armazenar um item de um determinado tipo de dado Entéo podemos definir um vetor como ponteiros da seguinte forma int avetor Mas como inserir e ler os valores contidos em um vetor declarado desta forma Para que possamos entrar neste assunto veremos 0 exemplo de codificaao a seguir include stdioh int maint int vVetlh10201234567990 fLinha 1 int pvety ffLinha 2 pvet vetj fflinha 2 apvet3 1355 fflLinha vetS 159 fLinha 5 forint 1807 i1 i ffLinha 6 printfe vetCud xditepvetkddexdin 1vetlid1pveti34 ffLinha return Para conhecer a descriao do cddigo apresentado clique nas abas abaixo Linha 1 Criado e instanciacado do vetor vet de valores inteiros de 10 posicées Criagdéo de uma variavel do tipo ponteiro para inteiro pvet linha 2 e a sua instanciado na linha 3 recebendo o endereco ocupado pelo vetor vet Notase Linha 2 que nesta linha ndo aparece 0 simbolo precedendo a variavel vet pois ela inha2e 3 sendo um vetor ja é considerada como um ponteiro Sendo assim a partir deste momento a variavel pvet aponta para o inicio do vetor vet Essa instanciaao poderia ser feita também da seguinte forma pvet vet0 0 ponteiro pvet recebe o endereco da posiao 0 do vetor vet Instanciaao de uma posiao do vetor O cédigo pvet 3 13 pode ser traduzido Linha 4 para a seguinte forma o contetido do vetor cuja posiccdo é 0 inicio do vetor deslocada de 3 itens recebe o valor 13 httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 931 21082023 1631 Técnicas de Programacgao O mesmo processo de acessar a posiao 5 a partir do inicio do vetor para que seja Linha 5 instanciada com o valor 15 Essa mesma interpretacao deve ser feita na linha 7 para proceder a impressdo do contetido do vetor O processo de acessar uma posiao N a partir do inicio do vetor é ilustrada na figura a seguir CLT mT TT TT vet O123456789 Deslocamento offset Figura 3 Acessando a posiao 3 de um vetor através do uso de ponteiro O valor 3 representa o deslocamento offset a partir do inicio do vetor Fonte Elaborada pelo autor 2019 Como ilustrado na figura acima o indice utilizado para o acesso a uma posiao especifica no caso utilizado como exemplo o valor 3 representa o deslocamento a partir da posiao inicial do vetor Mas quantos bytes representa esse deslocamento A quantidade de bytes saltada por unidade de indice varia em funcdo do tamanho do item representado Para saber o tamanho de um tipo podese utilizar a funcdo sizeoftipo da seguinte forma printfeTamanho de um int 2dinsizeoraintj Na linha acima a fundo sizeof retornara um valor inteiro que representa a quantidade de bytes utilizada por um int Voltando ao deslocamento vocé pode se perguntar se eu posso adicionar um valor a um ponteiro eu obtenho uma posiao especifica de memoria entaéo eu posso incrementar um ponteiro Sim é possivel realizar incrementades com ponteiros Por exemplo caso fagamos p sendo p um ponteiro significa que p apontara para a proxima posiccdo deslocados N bytes sendo que N denota o tamanho ocupado pelo tipo manipulado Para testar esse comportamento tomaremos como exemplo o trecho a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1031 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1131 Vamos entao substituir o pveti por pvet Teremos o mesmo resultado Porem ao inves de incrementarmos o ındice i estamos a mudar o proprio ponteiro fazendoo apontar para a posiçao subsequente de memoria a cada iteraçao do laço de repetiçao Neste caso para que voltemos a posiçao inicial do vetor precisaremos decrementar o ponteiro ou ter salvo em outra variavel a referencia de memoria relativa a posiçao 0 Ate o momento usamos ponteiros apenas para referenciar vetores criados estaticamente ou seja referenciar vetores criados atraves do codigo tipo nomedimensao Seria possıvel criar um vetor dinamicamente O que seria alocaçao dinamica de memoria Alocaçao dinamica consiste em reservar espaços de memoria sob demanda ela e util para por exemplo quando nao se conhece previamente a quantidade de informaçoes que serao manipuladas ou ainda quando e necessario criar estruturas temporarias de armazenamento na memoria principal 21082023 1631 Técnicas de Programacgao ee VOCE QUER VER e A alocagdo dinamica de memoria é realizada em uma regido denominada heap O computador para gerenciar os programas usa além do heap a pilha stack O video postado pelo professor da USP de Sado Carlos Rodrigo Mello mostra a diferenca entre as duas porgdes de memoria Vocé pode assistilo neste link httpswwwyoutubecomwatchviOIBJkXn2M httpswwwyoutubecomwatchviOIBJkxXn2M e aumentar seus conhecimentos sobre o assunto ener eeeee reer e eee e reer reer ener eee ee O processo de criacao de estruturas dinamicas vetores ou registros é feito por intermédio da funcdo malloc ou calloc para a liberagdo da memoria previamente alocada pelo malloc utilizase a funao free malloc e free estao definidas no arquivo header stdlibh httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1231 21082023 1631 Técnicas de Programacgao OO VOCE O CONHECE Uma das primeiras ideias para a alocacdo dindmica de memoria surgiu com os manuscritos de Von Neumann estudado e publicado em 1970 por Donald Knuth através do artigo Von Neumanns first Computer Program O primeiro programa de computador do Von Neumann Para saber um pouco mais sobre a importdancia de Knuth para 0 mundo dos algoritmos acesse httpsinternacionalestadaocombrnoticiasnytiwconhecaocientistaconsiderado oguiaespiritualdosalgoritmos70002654893 httpsinternacionalestadaocombrnoticiasnytiwconhecaocientistaconsiderado oguiaespiritualdosalgoritmos70002654893 De Mas como utilizar as funées malloc e free Para responder a esta pergunta vamos analisar antes as suas sintaxes para depois darmos uma olhada na sua forma de uso void mallocquantidadedebytesaseremalocados void callocquantidadedeitens tamanhodeumitem void reallocponteiroaserrealocado quantidadedebytes freeponteiroaserdesalocado A diferena basica entre as fundes malloc e calloc consiste no fato de que a calloc além de alocar espaco da memoria 0 preenche com o valor 0 zero Por sua vez a funcdo realloc tem a funcdo de realocar um espaco de memoria A funao retorna um novo ponteiro cujo tamanho é especificado como parametro Entaéo como utilizar efetivamente as fundes malloc calloc realloc e free Para isso vejamos 0 cédigo a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTTECPRO19unidade3ebookindexhtml 1331 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1431 No trecho de codigo acima podemos encontrar a utilizaçao de alocaçao dinamica para a construçao de um vetor de inteiros com a dimensao de NumCelulas e uma string de tamanho TamanhoStr Notase que foram utilizadas as funçoes malloc e calloc para a alocaçao dinamica inicial de memoria Para realizar o redimensionamento do vetor apos a sua criaçao utilizouse a funçao realloc tomandose por base o proprio ponteiro vetor para a sua nova instanciaçao 34 Alocação de matrizes como ponteiros Assim como os vetores as matrizes tambem podem ser manipuladas atraves da utilizaçao de ponteiros O processo de criaçao e manipulaçao e analogo aos vetores porem adicionaremos uma dimensao a mais vamos lembrar que para a criaçao de um vetor sao alocados NK bytes na memoria onde N representa a dimensao do vetor e K o espaço gasto para armazenar um item de um determinado tipo de dado Por sua vez para a criaçao de uma matriz sao alocados NMK bytes onde N e M representam a dimensao da matriz e K denota o tamanho de cada item em funçao do tipo de dado a ser armazenado Desta forma para acessar um item da matriz procedemos na forma 21082023 1631 Técnicas de Programacgao int matrizy eComatriztitj xg Para entendermos melhor vamos analisar 0 cédigo a seguir include stdioh define NLINHAS 4 ffLinha 1 define NCOLUNAS 4 fflinha 2 int maind int matreiZENLINHASIENCOLUNAS 2612 50 E 5555705 fflLinha 59101131271311533 OmMat fflLinha Jinhas2colunarils fflLinha pmat matrizLly fou pmatsmatrizoelceiyy fLinha 6 epomat inhasNCOLUNAScolunad 155 ffLinha 7 matreiZzE1IJ0CSI 155 for dlinhaseg JinhkatNLINHASs linhat fForicolunasey colunmaNCOLUNAS colunatt printfeMCedICid d eComatCid Addadekdin fflLinha 8 Jinhacolunamatrizelinkalcolunal Jinhkaco una fpmatt inhaNCOLUNAScol unally return y No cédigo acima temos as seguintes funcionalidades das linhas marcadas como comentarios clique nos itens e confira Linhas 1e 2 httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1531 21082023 1631 Técnicas de Programagao Definigdes de constantes de compilacao para facilitar a parametrizacao da matriz dessa forma tornase mais pratico quando necessario alterar as dimens6des da matriz pois nao se necessita mudar o cdédigo no tangente as dimensdes da matriz Linha 3 Criagdo da matriz do tipo int com dimens6es NLINHAS x NCOLUNAS e a sua respectiva instanciaao Linha 4 Criagdo do ponteiro para inteiro que ficara a cargo de referenciar a posido de memoria alocada para armazenar a matriz Além disso foram instanciadas variaveis que serdo os indices manipulados pelos lacos de repeticao Linha 6 Instanciagdo do ponteiro para a matriz denominada como matriz A referéncia neste caso é feita através da indicacdo do inicio da linha 0 ou passando o endereco do elemento matriz00 Linha 7 Instanciagdo do elemento matriz21 atribuindolhe o valor 13 Notase que foi realizado o calculo linhaNCOLUNAScoluna httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTTECPRO19unidade3ebookindexhtml 1631 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1731 pelo fato de que uma matriz e transformada em uma estrutura linear para que seja armazenada na memoria principal do dispositivo computacional Essa linearizaçao e realizada por linha ou seja o primeiro elemento da segunda linha encontrase apos todos os elementos da primeira e assim sucessivamente Sendo assim a cada linha devese saltar NCOLUNAS itens Linha 8 Impressao do conteudo das celulas da matriz Notase tambem a mesma operaçao linhaNCOLUNAScoluna para o acesso ao conteudo Da mesma forma dos vetores poderemos alocar as matrizes dinamicamente usando tambem as funçoes malloc ou calloc e liberando o seu espaço com a funçao free conforme as linhas a seguir int matriz matriz int callocnumlinhasnumcolunas sizeofint freematriz No trecho de codigo acima temos a criaçao de forma dinamica de uma matriz de dimensoes numlinhas por numcolunas totalizando numlinhas numcolunas celulas do tipo int Mencionamos anteriormente que uma matriz pode ser construıda a partir do uso de ponteiros para ponteiros Mas como seria isso Para entender vamos observar o codigo abaixo 21082023 1631 Técnicas de Programacgao include stdioh include stdlibh int maint int Matriz linhkas4colunatSyi3 ffLinha 1 Matriz Cink JmallocsizeofCinc inhaly ffLinha 2 FOorCLEGy ilinhsag itt Mmateizid Cint JmalloctsizeofCintdecol unaly fLinha 3 ForCisey if jinhag itt Forj26 jtcolunay jt mate ZELIj12110 3 ffLinha Forcisey ilinhag itt fForejzo jtcolunay jt printfécsd ymatriziIi03133 ffLinha 5 preintrosn dy return y Neste cédigo temos as linhas numeradas como comentarios com algumas funcionalidades clique nos itens e confira Linha1 Declaragdo das variaveis destacandose a variavel matriz que é do tipo ponteiro para ponteiro de inteiro Linha2e3 Na linha 2 ocorre a alocacado de espaco de memoria para receber um vetor de ponteiros para ponteiros de tamanho linha Cada linha httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1831 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1931 da matriz na linha 4 do codigo recebe o endereço de um ponteiro que denota um vetor correspondente as colunas Linha 4 Ocorre a instanciaçao das celulas da matriz Note que podemos utilizar tambem colchetes para delimitar os ındices da matriz Foi escolhida a expressao i10j para que cada celula contenha a referencia da coordenada correspondente Por exemplo a posiçao 32 correspondera a 3102 ou seja 32 Linha 5 Contem o codigo para realizar a impressao na tela das celulas da matriz Essa aplicaçao de mapeamento de matrizes utilizandose ponteiro para ponteiro e extremamente util para a passagem de parametro por referencia No caso uma matriz podera ser recebida como int matriz 21082023 1631 Técnicas de Programacgao a CASO Um projetista de software recebeu um projeto de um sistema computacional para que fosse implementado fazia parte deste um problema de otimizacdo para gerenciar recursos energéticos o chamado Smart Grid Grade Inteligente na traducdo literal Esses recursos envolvem a parte de gerado por operadores de energia geracdo particular nas residéncias e industrias e distribuicdo de energia No projeto ele recebeu um numero especifico de pontos que deveriam ser alocados em matrizes 0 processo de otimizacdo envolve a manipulacdo de forma massiva de tais matrizes Ele teve os seguintes pensamentos sera que a solucgdo dada ao problema poderia ser usada em outras circunstancias Sera que a quantidade de elementos poderia mudar para mais ou para menos em projetos similares futuros Sera que poderiam ser implementadas matrizes esparsas ao invés de matrizes que alocam todos os seus elementos inclusive os valores nulos na memoria Informamos aqui que somente as células nado nulas de uma matriz esparsa sdo alocadas na memoria Entdo para resolver esses questionamentos o projetista implementou o seu sistema usando alocacao dinamica para representar os dados a serem manipulados Com isso ele introduziu em seu sistema 0 conceito de escalabilidade que consiste em criar um programa que seja facil se adequar a outros volumes de dados para o processamento Essa adequacdo deve ser realizada com a menor quantidade possivel de alteragdes no cédigo do programa ee Até 0 momento conversamos apenas sobre a manipulacdo de estruturas para o armazenamento de informacgé6es do mesmo tipo ou seja estruturas homogéneas Mas seria possivel 0 armazenamento de informagées de varios tipos em uma Unica estrutura Para isso existem os registros ou estruturas que veremos a Seguin e aA 35 Tipos de dados heterogeneos Algumas vezes quando implementamos programas é Util criarmos variaveis que conseguem armazenar varios itens com tipos diferentes de informacées Vamos pensar que devemos manipular informaées de uma pessoa para depois por exemplo salvar em um arquivo ela pode ter atributos tais como nome endereo dia més e ano de nascimento Para o processo de gravacao ou recuperaao do arquivo neste caso manipulamos todas as informacées simultaneamente ao invés de efetuarmos a gravado ou recuperado campo por campo ASCENCIO 2012 Mas como declarar varidveis que admitem informacées heterogéneas E 0 que veremos agora httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2031 21082023 1631 Técnicas de Programacgao n of 351 Declaragdao de Variaveis do Tipo Registro Como mencionamos a pouco existe a possibilidade de criarmos estruturas de dados que conseguem armazenar de forma agrupada informades heterogéneas Nomeiase como dados heterogéneos aqueles constituidos de informagées que possuem tipos distintos Na programacao em C esse agrupamento é conseguido através da utilizagdo de estruturas de dados denominadas como struct Mas como criar uma struct Abordaremos quatro formas para a criacao de struct na figura a seguir typedef struct struct nome da struct tipo varl var2 tipo varl var2 tipo var3 tipo var3 nome da struct nome da struct var struct struct nome da struct var struct a b struct nomeda struct struct tipo varl var2 tipo varl var2 tipo var3 tipo vars varstruct Varstruct c d Figura 4 Formas de declaraao e instanciaao de registros struct Notase que a struct é formada por campos podendo possuir tipagens distintas Fonte Elaborada pelo autor 2019 Temos na figura acima em a a criagdo de um novo tipo de dados para representar struct O termo typedef struct identifica que estamos criando um novo tipo de dados no formato de estrutura esse novo tipo foi batizado como nomedastruct Ele sera usado posteriormente para a criacdo de variaveis na forma tipo nomedavariavel como especificado em nomedastruct varstruct Ainda em relacao a figura acima temos em b c e d outras formas de criado de variaveis do tipo struct Em todas as formas temos os dois momentos distintos a criacdo da struct e depois a criacdo das variaveis que manipulardo as informacées heterogéneas Para melhor ilustrar vamos analisar o trecho de cédigo abaixo httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2131 21082023 1631 Técnicas de Programacgao tyupedet struct ffi char nomelse ender iSe 2 int dia mésj 3 int anc f 4 PESSOAS ff int main PESSOA pa ff6 return No cédigo acima temos entre as linhas 1 e 5 a criacdo de um novo tipo de dado do tipo struct batizado como PESSOA linha 5 Os campos que compéem a estrutura integram as linhas 2 a 4 A declaragao de uma variavel do tipo PESSOA intitulada p é realizada na linha 6 Uma outra forma de se declarar um registro utilizandose a forma indicada por b na figura anterior seria struct PESSOA char nomelse ender tSe int dia més ancy int ano ij int main struct PESSOA py return Notase no exemplo de cddigo acima como nao foi criado um novo tipo de dado auséncia do typedef houve a necessidade da utilizado de struct antes do tipo PESSOA para a criaao da variavel p httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2231 21082023 1631 Técnicas de Programacgao ee VOCE QUER LER e Nas estruturas podemos definir os tamanhos dos campos em bits desta forma é possivel criar os chamados campos de bits estes sao utilizados sobretudo na manipulacao de sistemas em baixo nivel como por exemplo para a escrita de device drivers sistemas embarcados e kernel de sistemas operacionais Para saber mais sobre o assunto acesse este link httpsdocsmicrosoftcomptbrcppclanguagecbit fieldsviewvs2019 httpsdocsmicrosoftcomptbrcppclanguagecbitfields viewvs2019 ener eeeee reer e eee e reer reer ener eee ee Até o momento realizamos a criacdo de variaveis do tipo struct Mas como manipulalas Como acessar e instanciar os seus campos Veremos a manipulacdo de variaveis do tipo struct a seguir 352 Acesso aos membros de um registro O acesso ao campo se faz de forma igual tanto para a instanciacado quanto para a coleta dos valores de uma variavel do tipo struct mencionando o nome da variavel e o nome do membro da estrutura a ser acessada esses dois itens separados por um ponto varidvelmembro Para ilustrar melhor convidoo para analisar 0 cédigo a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2331 21082023 1631 Técnicas de Programacgao include stdioh typedef struct ffi char nomecse ender ltsey f2 int dia mesj fF3 int anoj fF F PESSOAS fFS int maint PESSOA pl fF6 strcputpznome Abcde5 ff scanfadtspender Jj ffS padia 15 ff3 pmes BF fF16 scantaid p anody fF11 return Como ja mencionamos as linhas 1 a 5 do cédigo acima visam a definicdo da struct intitulada como PESSOA enquanto a linha 6 realiza a criacdo da variavel p do tipo PESSOA O acesso aos seus campos podem ser observados nas linhas de 7 a 10 Notase o formato varcampo na manipulaao dos campos da estrutura httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2431 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2531 Alem de facilitar o processo de manipulaçao de arquivos a utilizaçao de estruturas deixa o codigo mais organizado aumenta o fator de abstraçao pelos desenvolvedores e dentre outras vantagens facilita a implementaçao quando desejamos passar informaçoes para outros modulosfunçoes do programa Mas ja que mencionamos ponteiros anteriormente estruturas podem ser mapeadas como ponteiros A resposta a essa pergunta veremos adiante VOCÊ QUER VER Uma forma de estruturar e encapsular informaçoes heterogeneas e a base da programaçao orientada por objetos Orientaçao por objeto e a base de muitos sistemas atuais escritos por exemplo em C e em Java Acesse este vıdeo httpswwwyoutubecomwatchvfyvhlEostE httpswwwyoutubecomwatchvfyvhlEostE para conhecer mais dos conceitos deste paradigma de programaçao httpswwwyoutubecomwatchvfyvhlEostE 36 Ponteiros como Registros Uma questao que podera ser levantada agora reside no fato de como usar as struct como ponteiros Essa e uma informaçao importante pois poderemos usala inicialmente em dois momentos um relativo a passagem de parametro por referencia nas funçoes e o outro que consiste em alocaçao dinamica Para o primeiro momento vamos manipular uma struct como um ponteiro alocado estaticamente na forma 21082023 1631 Técnicas de Programacgao tupeder struct char nomeEs ender fSoj int dia mes ancy PESSOAS int maint PESSOA Pessoal PESSOA spPessoal pPessoa Pessoal 2 No cédigo acima podemos visualizar que o ponteiro para o tipo PESSOA intitulado como pPessoa recebeu a posido de memoria alocada para a variavel Pessoa pPessoa Pessoa Porém 0 acesso ao campo tem uma alteracdo de sintaxe em relado ao acesso de campos de struct que nao sejam ponteiro Nesse momento o acesso se dara na forma varcampo ou varcampo Sendo assim no trecho de cédigo acima para o caso desejarmos instanciar 0 campo dia do ponteiro pPessoa teremos que fazer por exemplo pPessoadia 5 1 scanfdpPessoames 2 Nas linhas acima temos em 1 a instanciacdo direta do campo dia do ponteiro pPessoa Ja na linha 2 0 campo mes encontrase passado por referéncia a fundo scanf Notase que nas duas linhas foram usadas duas formas distintas para 0 acesso aos membros do registro Até o momento conversamos sobre alocacgées estaticas as quais temos que conhecer previamente a quantidade de informades que serdo manipuladas Veremos a seguir como podemos realizar alocacées dinamicas e mais especificamente como podemos realizar busca insercdo e remocao de registros alocados dinamicamente 361 Operagées sobre ponteiros busca inserdo e remodo Ja que falamos sobre ponteiros e registros que tal praticarmos operaées basicas sobre uma lista de registros usando ponteiros Vamos voltar ao exemplo do registro que denota uma pessoa e a partir dele vamos criar uma lista para armazenar no maximo 10 pessoas Para facilitar vamos criar um registro descritor que contém além do ponteiro da lista um campo que armazena a quantidade de itens armazenados httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2631 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2731 Utilizando a estrutura acima vamos implementar as funçoes para realizar o processo de busca inserçao e remoçao de registros Porem inicialmente temos que criar uma lista vazia alocando o espaço para o recebimento das informaçoes relativas a no maximo 10 pessoas No codigo acima a funçao CriarListaVazia visa a alocaçao dinamica do vetor com capacidade para o armazenamento das informaçoes relativas a 10 pessoas e a iniciaçao com 0 do campo que indica a quantidade de pessoas armazenadas A partir da criaçao da lista poderemos entao realizar as operaçoes basicas Vamos iniciar pela operaçao de busca cuja funçao e apresentada a seguir 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2831 Como se observa no codigo acima o processo de busca e realizado percorrendose todo vetor pPessoas por intermedio da utilizaçao do ındice i somado ao endereço base do ponteiro listaPpPessoas de modo a comparar o conteudo do campo nome com o argumento passado como parametro Caso seja encontrado o endereço do item achado e copiado para o ponteiro e retornado o ındice no qual encontrase o elemento encontrado Para a inserçao na posiçao pos e necessario realizar o deslocamento das informaçoes para a direita a partir da posiçao na qual ocorrera a inserçao Esse deslocamento e mostrado atraves do codigo a seguir 21082023 1631 Técnicas de Programacgao Na fundo de inserao acima notase que a cada iteragao forizlistaPQtdPessoasy isposyi é feita uma copia da célula i 1 para a célula i liberandose assim a célula pos para receber as informacées da pessoa a ser cadastrada CmemcpuC istaPpPessoasti istaPpPessoasti1sizeofCPESsoAy d Nesta etapa foi utilizada a fundo memcpy definida no arquivo header stringh para efetuar a copia das informacgées de acordo com o formato memcpydestinofontequantidadebytes Além de efetuar o deslocamento das informacées dentro do vetor essa fundo incrementa 0 campo que indica a quantidade de itens no vetor istaPQtdPessoas 3 Por fim para realizar a remocdo de um item da posido pos podese proceder como exemplificado no cédigo a seguir int RemoverRegqistrotLISTAPESsoAs 1staPint pos int iy 1 istaPatdPessoass return 15 ffindicativo 118ta vazia ifpos 38 11S8taPs0tdPessoas return 2 findicativoe posicaco xtrapola qtd pessoas armazenadas forCigposf 1 JistaPtdPessoas11 memcoyut 1 istaPpPessoasti1istaPpPessoastiti sizeofPESsoAyy istaPatdPessoasj Ao contrario da funcdo de insercdo a remocao realiza um deslocamento do contetido para a esquerda em cada iteracdo do laco de repetido Neste caso a posido i recebe 0 contetido da posicdo i 1 Ao final do deslocamento a quantidade de itens armazenados no vetor é decrementada em uma unidade httpswwwyoutubecomwatchviOIBJkXn2MNa pratica existem diversas outras estratégias para a manipulaao de estruturas usando a alocaao dinamica dentre as quais podemos citar listas filas pilhas e arvores PUGA 2016 Alocagées dinadmicas sao extremamente Uteis para a criacdo de cédigos escalaveis Escalabilidade de um programa referese a sua facilidade para se adequar a outras dimens6es de massa de dados que sera manipulada Além das listas encadeadas podemos usar a alocacdo dindmica em outras estruturaées tais como listas duplamente encadeadas e arvores Sintese Chegamos ao fim de nossa terceira conversa sobre técnicas de programacdo nesta pudemos ampliar o universo da programacdo através da conceituado e experimentaao da utilizagao de ponteiros Conseguimos verificar 0 uso de ponteiros nos processos de alocacdo estatica e alocacdo dindmica Com os pontos abordados vocé ja conseguira implementar programas mais complexos e tornalos mais eficientes estruturados e escalaveis através da utilizacdo dos ponteiros Através dos contetidos apresentados nesta terceira unidade esperamos que vocé continue o processo de incremento em relado a criacdo de programas computacionais de modo a tornalos ainda mais eficientes organizados e agora escalaveis Nesta unidade vocé teve a oportunidade de httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2931 21082023 1631 Técnicas de Programacgao e ter contato com conceitos inerentes aos ponteiros analisar as vantagens para a manipulacao de ponteiros modelar vetores e matrizes através de ponteiros conhecer e empregar estruturas de dados heterogéneas analisare utilizar alocacdes dindmicas de memoria Clique para baixar o contetido deste tema Bibliografia ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 FERREIRA D Como funciona memoria de C a JavaScript memory management 2017 22 min Disponivel em httpswwwyoutubecomwatchv82yMCuCyY2k httpswwwyoutubecomwatchv82yMCuCY2 k Acesso em 11072019 GARCIA F D Ponteiro em C Funcées 2015 Disponivel em httpswwwembarcadoscombrponteiro emcfuncoes httpswwwembarcadoscombrponteiroemcfuncoes Acesso em 03072019 LACERDA LC RAMOS JMB Instituto Federal de Educacdo Ciéncia e Tecnologia Programagao orientada a objetos Aula 01 Rondénia 2015 1hi5min Disponivel em httpswwwyoutubecomwatchvl CaVliXaA0 httpswwwyoutubecomwatchvlCaVliXaA0 Acesso em 11072019 MELLO R Introducdo ao Funcionamento da Memoria Stack e Heap 1145min 2015 Disponivel em httpswwwyoutubecomwatchviOIBJkxXn2M httpswwwyoutubecomwatchviOIBJkxXn2M Acesso em 14072019 MICROSOFT Campos de Bits C 2016 Disponivel em httpsdocsmicrosoftcomptbrcppc languagecbitfields viewvs2019httpsdocsmicrosoftcomptbrcppclanguagecbitfieldsviewvs 2019 httpsdocsmicrosoftcomptbrcppclanguagecbitfieldsviewvs2019 Acesso em 11072019 ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 3031 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 3131 ROBERTS S Conheça o cientista considerado o guia espiritual dos algorıtimos The New York Times Nova York 25 dez 2018 International Weekly Estadao Disponıvel em httpsinternacionalestadaocombrnoticiasnytiwconhecaocientistaconsideradooguiaespiritualdos algoritmos70002654893 httpsinternacionalestadaocombrnoticiasnytiwconhecaocientista consideradooguiaespiritualdosalgoritmos70002654893 Acesso em 11072019
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
Texto de pré-visualização
TECNICAS DE PROGRAMACAO UNIDADE 3 ALOCACAO DE MEMORIA ESTATICA E DINAMICA Fernando Cortez Sica 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 231 21082023 1631 Técnicas de Programacgao ee Introducgao trodug Iniciamos o nosso terceiro encontro sobre Técnicas de Programado Conversaremos sobre um ponto que ajudara o programa a se tornar mais flexivel e em certos casos mais eficiente essa flexibilidade é conseguida pela utilizacgdo de ponteiros Mas j4 ndo usamos ponteiros na passagem de pardmetros por referéncia Sim exato O primeiro uso e contato com os ponteiros foi na passagem de pardmetros por referéncia usando os simbolos e Mas aonde mais usamos ponteiros Podemos encontrar ponteiros nos cdédigos que manipulam os dispositivos do hardware os chamados device drivers no kernel do sistema operacional nos sistemas de banco de dados e em outras diferentes aplicacdes Quando conversamos sobre vetores e falamos que seria necessario definirmos um tamanho ja na declaraao de variaveis vocé pode ter se perguntado mas caso a quantidade de itens manipulados aumentasse teriamos que modificar 0 programa alterandose o tamanho do vetor Sim no caso dos vetores ja que eles sdo estruturas de tamanho fixo prédefinido Mas entéo com a utilizacdo de ponteiros esse problema é eliminado Sim veremos uma estratégia denominada alocacdo de memoria dinamica que servira dentre outras coisas para eliminar esse problema No entanto pode surgir uma outra questao se os ponteiros nos possibilitam uma manipulacao de memoria mais poderosa entdo é mais dificil de programar Vamos tentar nao usar o termo dificuldade e sim falar que o uso de ponteiros requer um pouco mais de atenao devido ao seu alto poder de abstracao Neste capitulo falaremos sobre os conceitos e manipulacdo de ponteiros Ja que mencionamos anteriormente que os vetores na passagem de parametros das funées sao considerados como ponteiros entaéo veremos como definir vetores e matrizes usando ponteiros em seguida conversaremos sobre uma outra forma de manipular informagées no caso informacées heterogéneas o uso de estruturas ou registros Por fim vamos abordar a representacdo de tais estruturas como ponteiros 31 Ponteiros Um ponteiro é uma referéncia a uma posiado de memoria A diferenca basica entre uma variavel do tipo ponteiro e uma ndo ponteiro consiste no fato de que uma variavel que nado seja ponteiro armazena um valor propriamente dito Por sua vez uma variavel do tipo ponteiro realiza uma indirecdo ou seja faz uma referéncia indireta a um valor Mas na declaracdéo de uma variavel como diferenciar e manipular os dois tipos Para respondermos essa pergunta vamos nos amparar com 0 cédigo abaixo httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 331 21082023 1631 Técnicas de Programacgao include stdioh int maine ink a1 ffvariavel normal finha 1 int bg fivariavel do tipo ponteiro para int fflinha 2 b J sinha 3 printf a s2dvt bk4d posicao a sipi iponteiro bepin Ay D Hay b5 inha 4 a Sey ff inha 5 printfValor de b modificado para d by sinha 6 return y Neste cédigo temos as explanac6es para as linhas descritas a seguir Clique nos itens e confira Linhal Declaracgao da variavel a do tipo int sem ser ponteiro instanciada com o valor 10 Linha 2 Declaragdo da variavel b como sendo um ponteiro para um int Para declarar um ponteiro utilizase antes do nome da variavel como denotado por b Linha 3 Nesta linha temos a indicacao que a posiccao de memoria apontada por b passa a ser 0 endereco da variavel a O ponteiro b neste caso nao fez uso do o precedendo pois estamos a manipular o proprio valor do ponteiro Para denotarmos a posicdo de memoria de uma httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 431 21082023 1631 Técnicas de Programagao variavel usamos o simbolo como denotado por a Vocé pode se perguntar é por esse motivo que usamos esse simbolo na passagem de parametros por referéncia nas fundes Sim exatamente Na chamada da funao OS pardmetros passados por referéncia sao precedidos por pois passamos para a fundo na verdade o endereco de memoria da variavel envolvida Linha 4 A funcao printf imprime os valores da variavel a e do conteido da posiao de memoria apontado por b e também a posicado de memoria na qual foi alocada a variavel a e a posicao do ponteiro b Na execuao poderemos notar que esses dois Uultimos valores sao iguais pois referenciam a mesma posiao de memoria Linha5 O valor da variavel a é modificada Como o ponteiro b aponta para a qualquer modificacgao de a altera prontamente o valor do conteudo de b Sendo assim a funao printf da linha 6 imprimira o valor atribuido a a no caso imprimira o valor 30 O fato da modificacao da variavel a impactar 0 valor do contetido apontado pela variavel b apés a execucao da linha 3 pode ser explicado por intermédio da figura a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTTECPRO19unidade3ebookindexhtml 531 21082023 1631 Técnicas de Programacgao Figura 1 Estados das variaveis apés a execucdo da linha 5 do cédigo acima O ponteiro b aponta para a mesma posido de memoria da variavel a Fonte Elaborada pelo autor 2019 A figura acima ilustra que apos a execuao da linha contendo a instanciaao b a 0 ponteiro b aponta para a mesma posido de memoria da variavel a Sendo assim qualquer alteracdo de a altera 0 contetido do ponteiro b b Como mencionado em Deitel 2011 todo ponteiro para ser efetivamente manipulado deve ser instanciado Porém podemos em algumas ocasi6ées definir um ponteiro apontando para um valor nulo Neste caso para criarmos um ponteiro nulo poderemos proceder de alguma das formas a seguir int p es NULL q BF Na linha de cédigo acima temos a instanciagao de dois ponteiros m q com o valor nulo A definiado do encontrase no arquivo header ot rll by Falamos até aqui de um ponteiro apontando para uma variavel nao ponteiro Mas um ponteiro também pode apontar para um ponteiro Veremos isso a seguir 32 Ponteiros para ponteiros Um ponteiro para ponteiro significa que a variavel do tipo ponteiro nao faz referéncia a uma posiado de memoria e sim faz referéncia a um outro ponteiro Esse Ultimo por sua vez aponta uma posiao de memoria que contém efetivamente o valor armazenado Para falarmos de ponteiros para ponteiros vamos imaginar uma utilidade suponha que uma matriz seja implementada com ponteiros como veremos adiante e que em um certo momento necessitemos realizar uma operacdo de ordenado sabemos que a ordenacdo da matriz necessita da movimentaao de dados Uma Ultima suposiao cada célula da matriz armazena uma informado de tamanho relativamente grande Com esse cenario podemos concluir que demandaremos para realizar a operacado de ordenado uma grande movimentaado de informacées Para atenuar isso podemos construir uma matriz formada por ponteiros para ponteiros Neste caso cada ponteiro aponta para uma posido da matriz ou seja um ponteiro aponta para cada ponteiro que caracteriza a matriz Sendo assim ordenar uma matriz significa instanciar ponteiros e nado movimentar grandes volumes de informacdo MIZRAHI 2008 Mas como podemos definir ponteiros para ponteiros Vamos analisar o cédigo a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 631 21082023 1631 Técnicas de Programacgao include stdioh int maint c ink a 16 by mc ffi OD ag FF2 c b5 ff3 printfasid beid cxdinaabacdy Fit prantfipos akp pos bp pos wwcsp pos acsip pos cpin Ha0CyHCCG fi return Gy Clique nas abas abaixo e conhea a descriao de cada linha do cédigo acima Linha 1 Avariavel b éum ponteiro para int uso do simbolo precedendo o nome da variavel Por sua vez 0 uso de dois sinais denotaem um ponteiro para ponteiro Linha 2 Instanciagdo do ponteiro b recebendo o endereco da variavel a Linha 3 instanciagdo do ponteiro para ponteiro recebendo o endereco do ponteiro b Linha4e5 Impressdo dos conteudos e dos enderecos das variaveis e ponteiros Notase que para imprimir o valor final no caso 10 devemos indicar no caso do ponteiro para ponteiro queaimpressdo se refere ao contetido do conteuido de c ou seja valor do ponteiro que aponta para o ponteiro b que por sua vez aponta para a variavel a esse 60 motivo da utilizagdo de precedendo o nome da variavel A figura a seguir ilustra melhor esse encadeamento de indireées httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 731 21082023 1631 Técnicas de Programacgao qd b C Figura 2 Relacdo dos apontamentos feitos por um ponteiro b e por um ponteiro para ponteiro c Fonte Elaborada pelo autor 2019 Em C podemos aumentar a indirecdo criando por exemplo ponteiro para ponteiro para ponteiro Neste caso a criacdo da variavel seria feita da seguinte forma por exemplo int p A quantidade de simbolos indica a quantidade de indireées desejadas VOCE SABIA e Em algumas ocasi6es tais como sistemas embarcados fun6es para o tratamento de interrup6es e implementacdo de threads temos que usar ponteiros para fungdes Desta forma a chamada de fungdes tornase dinamica facilmente configuravel Para saber um pouco mais sobre o assunto clique neste link httpswwwembarcadoscombrponteiroemcfuncoes https wwwembarcadoscombrponteiroemcfuncoes GARCIA 2015 eee eee eeeeeeeeeeeeeeeee reer reer e eee eeeeeeeeeeee eee eee eee eee eee Quando mencionamos uma das aplicacgées de ponteiros para ponteiros mencionamos o caso de matrizes definidas com ponteiros Para chegar 14 vamos compreender antes como definimos vetores com ponteiros ww e 33 Alocacao de vetores como ponteiros Quando mencionamos o fato de que na passagem de paradmetros de funcées os vetores se comportam como passagem por referéncia queremos dizer que na verdade vetores sdo manipulados como ponteiros De fato o compilador cria um espaco de memoria de tamanho NK onde N representa a dimensAo do vetor e K 0 espaco httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 831 21082023 1631 Técnicas de Programacgao gasto para armazenar um item de um determinado tipo de dado Entéo podemos definir um vetor como ponteiros da seguinte forma int avetor Mas como inserir e ler os valores contidos em um vetor declarado desta forma Para que possamos entrar neste assunto veremos 0 exemplo de codificaao a seguir include stdioh int maint int vVetlh10201234567990 fLinha 1 int pvety ffLinha 2 pvet vetj fflinha 2 apvet3 1355 fflLinha vetS 159 fLinha 5 forint 1807 i1 i ffLinha 6 printfe vetCud xditepvetkddexdin 1vetlid1pveti34 ffLinha return Para conhecer a descriao do cddigo apresentado clique nas abas abaixo Linha 1 Criado e instanciacado do vetor vet de valores inteiros de 10 posicées Criagdéo de uma variavel do tipo ponteiro para inteiro pvet linha 2 e a sua instanciado na linha 3 recebendo o endereco ocupado pelo vetor vet Notase Linha 2 que nesta linha ndo aparece 0 simbolo precedendo a variavel vet pois ela inha2e 3 sendo um vetor ja é considerada como um ponteiro Sendo assim a partir deste momento a variavel pvet aponta para o inicio do vetor vet Essa instanciaao poderia ser feita também da seguinte forma pvet vet0 0 ponteiro pvet recebe o endereco da posiao 0 do vetor vet Instanciaao de uma posiao do vetor O cédigo pvet 3 13 pode ser traduzido Linha 4 para a seguinte forma o contetido do vetor cuja posiccdo é 0 inicio do vetor deslocada de 3 itens recebe o valor 13 httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 931 21082023 1631 Técnicas de Programacgao O mesmo processo de acessar a posiao 5 a partir do inicio do vetor para que seja Linha 5 instanciada com o valor 15 Essa mesma interpretacao deve ser feita na linha 7 para proceder a impressdo do contetido do vetor O processo de acessar uma posiao N a partir do inicio do vetor é ilustrada na figura a seguir CLT mT TT TT vet O123456789 Deslocamento offset Figura 3 Acessando a posiao 3 de um vetor através do uso de ponteiro O valor 3 representa o deslocamento offset a partir do inicio do vetor Fonte Elaborada pelo autor 2019 Como ilustrado na figura acima o indice utilizado para o acesso a uma posiao especifica no caso utilizado como exemplo o valor 3 representa o deslocamento a partir da posiao inicial do vetor Mas quantos bytes representa esse deslocamento A quantidade de bytes saltada por unidade de indice varia em funcdo do tamanho do item representado Para saber o tamanho de um tipo podese utilizar a funcdo sizeoftipo da seguinte forma printfeTamanho de um int 2dinsizeoraintj Na linha acima a fundo sizeof retornara um valor inteiro que representa a quantidade de bytes utilizada por um int Voltando ao deslocamento vocé pode se perguntar se eu posso adicionar um valor a um ponteiro eu obtenho uma posiao especifica de memoria entaéo eu posso incrementar um ponteiro Sim é possivel realizar incrementades com ponteiros Por exemplo caso fagamos p sendo p um ponteiro significa que p apontara para a proxima posiccdo deslocados N bytes sendo que N denota o tamanho ocupado pelo tipo manipulado Para testar esse comportamento tomaremos como exemplo o trecho a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1031 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1131 Vamos entao substituir o pveti por pvet Teremos o mesmo resultado Porem ao inves de incrementarmos o ındice i estamos a mudar o proprio ponteiro fazendoo apontar para a posiçao subsequente de memoria a cada iteraçao do laço de repetiçao Neste caso para que voltemos a posiçao inicial do vetor precisaremos decrementar o ponteiro ou ter salvo em outra variavel a referencia de memoria relativa a posiçao 0 Ate o momento usamos ponteiros apenas para referenciar vetores criados estaticamente ou seja referenciar vetores criados atraves do codigo tipo nomedimensao Seria possıvel criar um vetor dinamicamente O que seria alocaçao dinamica de memoria Alocaçao dinamica consiste em reservar espaços de memoria sob demanda ela e util para por exemplo quando nao se conhece previamente a quantidade de informaçoes que serao manipuladas ou ainda quando e necessario criar estruturas temporarias de armazenamento na memoria principal 21082023 1631 Técnicas de Programacgao ee VOCE QUER VER e A alocagdo dinamica de memoria é realizada em uma regido denominada heap O computador para gerenciar os programas usa além do heap a pilha stack O video postado pelo professor da USP de Sado Carlos Rodrigo Mello mostra a diferenca entre as duas porgdes de memoria Vocé pode assistilo neste link httpswwwyoutubecomwatchviOIBJkXn2M httpswwwyoutubecomwatchviOIBJkxXn2M e aumentar seus conhecimentos sobre o assunto ener eeeee reer e eee e reer reer ener eee ee O processo de criacao de estruturas dinamicas vetores ou registros é feito por intermédio da funcdo malloc ou calloc para a liberagdo da memoria previamente alocada pelo malloc utilizase a funao free malloc e free estao definidas no arquivo header stdlibh httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1231 21082023 1631 Técnicas de Programacgao OO VOCE O CONHECE Uma das primeiras ideias para a alocacdo dindmica de memoria surgiu com os manuscritos de Von Neumann estudado e publicado em 1970 por Donald Knuth através do artigo Von Neumanns first Computer Program O primeiro programa de computador do Von Neumann Para saber um pouco mais sobre a importdancia de Knuth para 0 mundo dos algoritmos acesse httpsinternacionalestadaocombrnoticiasnytiwconhecaocientistaconsiderado oguiaespiritualdosalgoritmos70002654893 httpsinternacionalestadaocombrnoticiasnytiwconhecaocientistaconsiderado oguiaespiritualdosalgoritmos70002654893 De Mas como utilizar as funées malloc e free Para responder a esta pergunta vamos analisar antes as suas sintaxes para depois darmos uma olhada na sua forma de uso void mallocquantidadedebytesaseremalocados void callocquantidadedeitens tamanhodeumitem void reallocponteiroaserrealocado quantidadedebytes freeponteiroaserdesalocado A diferena basica entre as fundes malloc e calloc consiste no fato de que a calloc além de alocar espaco da memoria 0 preenche com o valor 0 zero Por sua vez a funcdo realloc tem a funcdo de realocar um espaco de memoria A funao retorna um novo ponteiro cujo tamanho é especificado como parametro Entaéo como utilizar efetivamente as fundes malloc calloc realloc e free Para isso vejamos 0 cédigo a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTTECPRO19unidade3ebookindexhtml 1331 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1431 No trecho de codigo acima podemos encontrar a utilizaçao de alocaçao dinamica para a construçao de um vetor de inteiros com a dimensao de NumCelulas e uma string de tamanho TamanhoStr Notase que foram utilizadas as funçoes malloc e calloc para a alocaçao dinamica inicial de memoria Para realizar o redimensionamento do vetor apos a sua criaçao utilizouse a funçao realloc tomandose por base o proprio ponteiro vetor para a sua nova instanciaçao 34 Alocação de matrizes como ponteiros Assim como os vetores as matrizes tambem podem ser manipuladas atraves da utilizaçao de ponteiros O processo de criaçao e manipulaçao e analogo aos vetores porem adicionaremos uma dimensao a mais vamos lembrar que para a criaçao de um vetor sao alocados NK bytes na memoria onde N representa a dimensao do vetor e K o espaço gasto para armazenar um item de um determinado tipo de dado Por sua vez para a criaçao de uma matriz sao alocados NMK bytes onde N e M representam a dimensao da matriz e K denota o tamanho de cada item em funçao do tipo de dado a ser armazenado Desta forma para acessar um item da matriz procedemos na forma 21082023 1631 Técnicas de Programacgao int matrizy eComatriztitj xg Para entendermos melhor vamos analisar 0 cédigo a seguir include stdioh define NLINHAS 4 ffLinha 1 define NCOLUNAS 4 fflinha 2 int maind int matreiZENLINHASIENCOLUNAS 2612 50 E 5555705 fflLinha 59101131271311533 OmMat fflLinha Jinhas2colunarils fflLinha pmat matrizLly fou pmatsmatrizoelceiyy fLinha 6 epomat inhasNCOLUNAScolunad 155 ffLinha 7 matreiZzE1IJ0CSI 155 for dlinhaseg JinhkatNLINHASs linhat fForicolunasey colunmaNCOLUNAS colunatt printfeMCedICid d eComatCid Addadekdin fflLinha 8 Jinhacolunamatrizelinkalcolunal Jinhkaco una fpmatt inhaNCOLUNAScol unally return y No cédigo acima temos as seguintes funcionalidades das linhas marcadas como comentarios clique nos itens e confira Linhas 1e 2 httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1531 21082023 1631 Técnicas de Programagao Definigdes de constantes de compilacao para facilitar a parametrizacao da matriz dessa forma tornase mais pratico quando necessario alterar as dimens6des da matriz pois nao se necessita mudar o cdédigo no tangente as dimensdes da matriz Linha 3 Criagdo da matriz do tipo int com dimens6es NLINHAS x NCOLUNAS e a sua respectiva instanciaao Linha 4 Criagdo do ponteiro para inteiro que ficara a cargo de referenciar a posido de memoria alocada para armazenar a matriz Além disso foram instanciadas variaveis que serdo os indices manipulados pelos lacos de repeticao Linha 6 Instanciagdo do ponteiro para a matriz denominada como matriz A referéncia neste caso é feita através da indicacdo do inicio da linha 0 ou passando o endereco do elemento matriz00 Linha 7 Instanciagdo do elemento matriz21 atribuindolhe o valor 13 Notase que foi realizado o calculo linhaNCOLUNAScoluna httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTTECPRO19unidade3ebookindexhtml 1631 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1731 pelo fato de que uma matriz e transformada em uma estrutura linear para que seja armazenada na memoria principal do dispositivo computacional Essa linearizaçao e realizada por linha ou seja o primeiro elemento da segunda linha encontrase apos todos os elementos da primeira e assim sucessivamente Sendo assim a cada linha devese saltar NCOLUNAS itens Linha 8 Impressao do conteudo das celulas da matriz Notase tambem a mesma operaçao linhaNCOLUNAScoluna para o acesso ao conteudo Da mesma forma dos vetores poderemos alocar as matrizes dinamicamente usando tambem as funçoes malloc ou calloc e liberando o seu espaço com a funçao free conforme as linhas a seguir int matriz matriz int callocnumlinhasnumcolunas sizeofint freematriz No trecho de codigo acima temos a criaçao de forma dinamica de uma matriz de dimensoes numlinhas por numcolunas totalizando numlinhas numcolunas celulas do tipo int Mencionamos anteriormente que uma matriz pode ser construıda a partir do uso de ponteiros para ponteiros Mas como seria isso Para entender vamos observar o codigo abaixo 21082023 1631 Técnicas de Programacgao include stdioh include stdlibh int maint int Matriz linhkas4colunatSyi3 ffLinha 1 Matriz Cink JmallocsizeofCinc inhaly ffLinha 2 FOorCLEGy ilinhsag itt Mmateizid Cint JmalloctsizeofCintdecol unaly fLinha 3 ForCisey if jinhag itt Forj26 jtcolunay jt mate ZELIj12110 3 ffLinha Forcisey ilinhag itt fForejzo jtcolunay jt printfécsd ymatriziIi03133 ffLinha 5 preintrosn dy return y Neste cédigo temos as linhas numeradas como comentarios com algumas funcionalidades clique nos itens e confira Linha1 Declaragdo das variaveis destacandose a variavel matriz que é do tipo ponteiro para ponteiro de inteiro Linha2e3 Na linha 2 ocorre a alocacado de espaco de memoria para receber um vetor de ponteiros para ponteiros de tamanho linha Cada linha httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1831 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 1931 da matriz na linha 4 do codigo recebe o endereço de um ponteiro que denota um vetor correspondente as colunas Linha 4 Ocorre a instanciaçao das celulas da matriz Note que podemos utilizar tambem colchetes para delimitar os ındices da matriz Foi escolhida a expressao i10j para que cada celula contenha a referencia da coordenada correspondente Por exemplo a posiçao 32 correspondera a 3102 ou seja 32 Linha 5 Contem o codigo para realizar a impressao na tela das celulas da matriz Essa aplicaçao de mapeamento de matrizes utilizandose ponteiro para ponteiro e extremamente util para a passagem de parametro por referencia No caso uma matriz podera ser recebida como int matriz 21082023 1631 Técnicas de Programacgao a CASO Um projetista de software recebeu um projeto de um sistema computacional para que fosse implementado fazia parte deste um problema de otimizacdo para gerenciar recursos energéticos o chamado Smart Grid Grade Inteligente na traducdo literal Esses recursos envolvem a parte de gerado por operadores de energia geracdo particular nas residéncias e industrias e distribuicdo de energia No projeto ele recebeu um numero especifico de pontos que deveriam ser alocados em matrizes 0 processo de otimizacdo envolve a manipulacdo de forma massiva de tais matrizes Ele teve os seguintes pensamentos sera que a solucgdo dada ao problema poderia ser usada em outras circunstancias Sera que a quantidade de elementos poderia mudar para mais ou para menos em projetos similares futuros Sera que poderiam ser implementadas matrizes esparsas ao invés de matrizes que alocam todos os seus elementos inclusive os valores nulos na memoria Informamos aqui que somente as células nado nulas de uma matriz esparsa sdo alocadas na memoria Entdo para resolver esses questionamentos o projetista implementou o seu sistema usando alocacao dinamica para representar os dados a serem manipulados Com isso ele introduziu em seu sistema 0 conceito de escalabilidade que consiste em criar um programa que seja facil se adequar a outros volumes de dados para o processamento Essa adequacdo deve ser realizada com a menor quantidade possivel de alteragdes no cédigo do programa ee Até 0 momento conversamos apenas sobre a manipulacdo de estruturas para o armazenamento de informacgé6es do mesmo tipo ou seja estruturas homogéneas Mas seria possivel 0 armazenamento de informagées de varios tipos em uma Unica estrutura Para isso existem os registros ou estruturas que veremos a Seguin e aA 35 Tipos de dados heterogeneos Algumas vezes quando implementamos programas é Util criarmos variaveis que conseguem armazenar varios itens com tipos diferentes de informacées Vamos pensar que devemos manipular informaées de uma pessoa para depois por exemplo salvar em um arquivo ela pode ter atributos tais como nome endereo dia més e ano de nascimento Para o processo de gravacao ou recuperaao do arquivo neste caso manipulamos todas as informacées simultaneamente ao invés de efetuarmos a gravado ou recuperado campo por campo ASCENCIO 2012 Mas como declarar varidveis que admitem informacées heterogéneas E 0 que veremos agora httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2031 21082023 1631 Técnicas de Programacgao n of 351 Declaragdao de Variaveis do Tipo Registro Como mencionamos a pouco existe a possibilidade de criarmos estruturas de dados que conseguem armazenar de forma agrupada informades heterogéneas Nomeiase como dados heterogéneos aqueles constituidos de informagées que possuem tipos distintos Na programacao em C esse agrupamento é conseguido através da utilizagdo de estruturas de dados denominadas como struct Mas como criar uma struct Abordaremos quatro formas para a criacao de struct na figura a seguir typedef struct struct nome da struct tipo varl var2 tipo varl var2 tipo var3 tipo var3 nome da struct nome da struct var struct struct nome da struct var struct a b struct nomeda struct struct tipo varl var2 tipo varl var2 tipo var3 tipo vars varstruct Varstruct c d Figura 4 Formas de declaraao e instanciaao de registros struct Notase que a struct é formada por campos podendo possuir tipagens distintas Fonte Elaborada pelo autor 2019 Temos na figura acima em a a criagdo de um novo tipo de dados para representar struct O termo typedef struct identifica que estamos criando um novo tipo de dados no formato de estrutura esse novo tipo foi batizado como nomedastruct Ele sera usado posteriormente para a criacdo de variaveis na forma tipo nomedavariavel como especificado em nomedastruct varstruct Ainda em relacao a figura acima temos em b c e d outras formas de criado de variaveis do tipo struct Em todas as formas temos os dois momentos distintos a criacdo da struct e depois a criacdo das variaveis que manipulardo as informacées heterogéneas Para melhor ilustrar vamos analisar o trecho de cédigo abaixo httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2131 21082023 1631 Técnicas de Programacgao tyupedet struct ffi char nomelse ender iSe 2 int dia mésj 3 int anc f 4 PESSOAS ff int main PESSOA pa ff6 return No cédigo acima temos entre as linhas 1 e 5 a criacdo de um novo tipo de dado do tipo struct batizado como PESSOA linha 5 Os campos que compéem a estrutura integram as linhas 2 a 4 A declaragao de uma variavel do tipo PESSOA intitulada p é realizada na linha 6 Uma outra forma de se declarar um registro utilizandose a forma indicada por b na figura anterior seria struct PESSOA char nomelse ender tSe int dia més ancy int ano ij int main struct PESSOA py return Notase no exemplo de cddigo acima como nao foi criado um novo tipo de dado auséncia do typedef houve a necessidade da utilizado de struct antes do tipo PESSOA para a criaao da variavel p httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2231 21082023 1631 Técnicas de Programacgao ee VOCE QUER LER e Nas estruturas podemos definir os tamanhos dos campos em bits desta forma é possivel criar os chamados campos de bits estes sao utilizados sobretudo na manipulacao de sistemas em baixo nivel como por exemplo para a escrita de device drivers sistemas embarcados e kernel de sistemas operacionais Para saber mais sobre o assunto acesse este link httpsdocsmicrosoftcomptbrcppclanguagecbit fieldsviewvs2019 httpsdocsmicrosoftcomptbrcppclanguagecbitfields viewvs2019 ener eeeee reer e eee e reer reer ener eee ee Até o momento realizamos a criacdo de variaveis do tipo struct Mas como manipulalas Como acessar e instanciar os seus campos Veremos a manipulacdo de variaveis do tipo struct a seguir 352 Acesso aos membros de um registro O acesso ao campo se faz de forma igual tanto para a instanciacado quanto para a coleta dos valores de uma variavel do tipo struct mencionando o nome da variavel e o nome do membro da estrutura a ser acessada esses dois itens separados por um ponto varidvelmembro Para ilustrar melhor convidoo para analisar 0 cédigo a seguir httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2331 21082023 1631 Técnicas de Programacgao include stdioh typedef struct ffi char nomecse ender ltsey f2 int dia mesj fF3 int anoj fF F PESSOAS fFS int maint PESSOA pl fF6 strcputpznome Abcde5 ff scanfadtspender Jj ffS padia 15 ff3 pmes BF fF16 scantaid p anody fF11 return Como ja mencionamos as linhas 1 a 5 do cédigo acima visam a definicdo da struct intitulada como PESSOA enquanto a linha 6 realiza a criacdo da variavel p do tipo PESSOA O acesso aos seus campos podem ser observados nas linhas de 7 a 10 Notase o formato varcampo na manipulaao dos campos da estrutura httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2431 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2531 Alem de facilitar o processo de manipulaçao de arquivos a utilizaçao de estruturas deixa o codigo mais organizado aumenta o fator de abstraçao pelos desenvolvedores e dentre outras vantagens facilita a implementaçao quando desejamos passar informaçoes para outros modulosfunçoes do programa Mas ja que mencionamos ponteiros anteriormente estruturas podem ser mapeadas como ponteiros A resposta a essa pergunta veremos adiante VOCÊ QUER VER Uma forma de estruturar e encapsular informaçoes heterogeneas e a base da programaçao orientada por objetos Orientaçao por objeto e a base de muitos sistemas atuais escritos por exemplo em C e em Java Acesse este vıdeo httpswwwyoutubecomwatchvfyvhlEostE httpswwwyoutubecomwatchvfyvhlEostE para conhecer mais dos conceitos deste paradigma de programaçao httpswwwyoutubecomwatchvfyvhlEostE 36 Ponteiros como Registros Uma questao que podera ser levantada agora reside no fato de como usar as struct como ponteiros Essa e uma informaçao importante pois poderemos usala inicialmente em dois momentos um relativo a passagem de parametro por referencia nas funçoes e o outro que consiste em alocaçao dinamica Para o primeiro momento vamos manipular uma struct como um ponteiro alocado estaticamente na forma 21082023 1631 Técnicas de Programacgao tupeder struct char nomeEs ender fSoj int dia mes ancy PESSOAS int maint PESSOA Pessoal PESSOA spPessoal pPessoa Pessoal 2 No cédigo acima podemos visualizar que o ponteiro para o tipo PESSOA intitulado como pPessoa recebeu a posido de memoria alocada para a variavel Pessoa pPessoa Pessoa Porém 0 acesso ao campo tem uma alteracdo de sintaxe em relado ao acesso de campos de struct que nao sejam ponteiro Nesse momento o acesso se dara na forma varcampo ou varcampo Sendo assim no trecho de cédigo acima para o caso desejarmos instanciar 0 campo dia do ponteiro pPessoa teremos que fazer por exemplo pPessoadia 5 1 scanfdpPessoames 2 Nas linhas acima temos em 1 a instanciacdo direta do campo dia do ponteiro pPessoa Ja na linha 2 0 campo mes encontrase passado por referéncia a fundo scanf Notase que nas duas linhas foram usadas duas formas distintas para 0 acesso aos membros do registro Até o momento conversamos sobre alocacgées estaticas as quais temos que conhecer previamente a quantidade de informades que serdo manipuladas Veremos a seguir como podemos realizar alocacées dinamicas e mais especificamente como podemos realizar busca insercdo e remocao de registros alocados dinamicamente 361 Operagées sobre ponteiros busca inserdo e remodo Ja que falamos sobre ponteiros e registros que tal praticarmos operaées basicas sobre uma lista de registros usando ponteiros Vamos voltar ao exemplo do registro que denota uma pessoa e a partir dele vamos criar uma lista para armazenar no maximo 10 pessoas Para facilitar vamos criar um registro descritor que contém além do ponteiro da lista um campo que armazena a quantidade de itens armazenados httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2631 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2731 Utilizando a estrutura acima vamos implementar as funçoes para realizar o processo de busca inserçao e remoçao de registros Porem inicialmente temos que criar uma lista vazia alocando o espaço para o recebimento das informaçoes relativas a no maximo 10 pessoas No codigo acima a funçao CriarListaVazia visa a alocaçao dinamica do vetor com capacidade para o armazenamento das informaçoes relativas a 10 pessoas e a iniciaçao com 0 do campo que indica a quantidade de pessoas armazenadas A partir da criaçao da lista poderemos entao realizar as operaçoes basicas Vamos iniciar pela operaçao de busca cuja funçao e apresentada a seguir 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2831 Como se observa no codigo acima o processo de busca e realizado percorrendose todo vetor pPessoas por intermedio da utilizaçao do ındice i somado ao endereço base do ponteiro listaPpPessoas de modo a comparar o conteudo do campo nome com o argumento passado como parametro Caso seja encontrado o endereço do item achado e copiado para o ponteiro e retornado o ındice no qual encontrase o elemento encontrado Para a inserçao na posiçao pos e necessario realizar o deslocamento das informaçoes para a direita a partir da posiçao na qual ocorrera a inserçao Esse deslocamento e mostrado atraves do codigo a seguir 21082023 1631 Técnicas de Programacgao Na fundo de inserao acima notase que a cada iteragao forizlistaPQtdPessoasy isposyi é feita uma copia da célula i 1 para a célula i liberandose assim a célula pos para receber as informacées da pessoa a ser cadastrada CmemcpuC istaPpPessoasti istaPpPessoasti1sizeofCPESsoAy d Nesta etapa foi utilizada a fundo memcpy definida no arquivo header stringh para efetuar a copia das informacgées de acordo com o formato memcpydestinofontequantidadebytes Além de efetuar o deslocamento das informacées dentro do vetor essa fundo incrementa 0 campo que indica a quantidade de itens no vetor istaPQtdPessoas 3 Por fim para realizar a remocdo de um item da posido pos podese proceder como exemplificado no cédigo a seguir int RemoverRegqistrotLISTAPESsoAs 1staPint pos int iy 1 istaPatdPessoass return 15 ffindicativo 118ta vazia ifpos 38 11S8taPs0tdPessoas return 2 findicativoe posicaco xtrapola qtd pessoas armazenadas forCigposf 1 JistaPtdPessoas11 memcoyut 1 istaPpPessoasti1istaPpPessoastiti sizeofPESsoAyy istaPatdPessoasj Ao contrario da funcdo de insercdo a remocao realiza um deslocamento do contetido para a esquerda em cada iteracdo do laco de repetido Neste caso a posido i recebe 0 contetido da posicdo i 1 Ao final do deslocamento a quantidade de itens armazenados no vetor é decrementada em uma unidade httpswwwyoutubecomwatchviOIBJkXn2MNa pratica existem diversas outras estratégias para a manipulaao de estruturas usando a alocaao dinamica dentre as quais podemos citar listas filas pilhas e arvores PUGA 2016 Alocagées dinadmicas sao extremamente Uteis para a criacdo de cédigos escalaveis Escalabilidade de um programa referese a sua facilidade para se adequar a outras dimens6es de massa de dados que sera manipulada Além das listas encadeadas podemos usar a alocacdo dindmica em outras estruturaées tais como listas duplamente encadeadas e arvores Sintese Chegamos ao fim de nossa terceira conversa sobre técnicas de programacdo nesta pudemos ampliar o universo da programacdo através da conceituado e experimentaao da utilizagao de ponteiros Conseguimos verificar 0 uso de ponteiros nos processos de alocacdo estatica e alocacdo dindmica Com os pontos abordados vocé ja conseguira implementar programas mais complexos e tornalos mais eficientes estruturados e escalaveis através da utilizacdo dos ponteiros Através dos contetidos apresentados nesta terceira unidade esperamos que vocé continue o processo de incremento em relado a criacdo de programas computacionais de modo a tornalos ainda mais eficientes organizados e agora escalaveis Nesta unidade vocé teve a oportunidade de httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 2931 21082023 1631 Técnicas de Programacgao e ter contato com conceitos inerentes aos ponteiros analisar as vantagens para a manipulacao de ponteiros modelar vetores e matrizes através de ponteiros conhecer e empregar estruturas de dados heterogéneas analisare utilizar alocacdes dindmicas de memoria Clique para baixar o contetido deste tema Bibliografia ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 FERREIRA D Como funciona memoria de C a JavaScript memory management 2017 22 min Disponivel em httpswwwyoutubecomwatchv82yMCuCyY2k httpswwwyoutubecomwatchv82yMCuCY2 k Acesso em 11072019 GARCIA F D Ponteiro em C Funcées 2015 Disponivel em httpswwwembarcadoscombrponteiro emcfuncoes httpswwwembarcadoscombrponteiroemcfuncoes Acesso em 03072019 LACERDA LC RAMOS JMB Instituto Federal de Educacdo Ciéncia e Tecnologia Programagao orientada a objetos Aula 01 Rondénia 2015 1hi5min Disponivel em httpswwwyoutubecomwatchvl CaVliXaA0 httpswwwyoutubecomwatchvlCaVliXaA0 Acesso em 11072019 MELLO R Introducdo ao Funcionamento da Memoria Stack e Heap 1145min 2015 Disponivel em httpswwwyoutubecomwatchviOIBJkxXn2M httpswwwyoutubecomwatchviOIBJkxXn2M Acesso em 14072019 MICROSOFT Campos de Bits C 2016 Disponivel em httpsdocsmicrosoftcomptbrcppc languagecbitfields viewvs2019httpsdocsmicrosoftcomptbrcppclanguagecbitfieldsviewvs 2019 httpsdocsmicrosoftcomptbrcppclanguagecbitfieldsviewvs2019 Acesso em 11072019 ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 ASCENCIO A F G Fundamentos de Programacgao de Computadores Algoritmos PASCAL CC Padrao ANSI e Java 3 ed Sdo Paulo Pearson Education do Brasil 2012 Disponivel em https brasilblackboardcomhttps brasilblackboardcom https brasilblackboardcom Acesso em 11072019 httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 3031 21082023 1631 Técnicas de Programação httpscodelyfmucontents3amazonawscomMoodleEADConteudoCTITECPRO19unidade3ebookindexhtml 3131 ROBERTS S Conheça o cientista considerado o guia espiritual dos algorıtimos The New York Times Nova York 25 dez 2018 International Weekly Estadao Disponıvel em httpsinternacionalestadaocombrnoticiasnytiwconhecaocientistaconsideradooguiaespiritualdos algoritmos70002654893 httpsinternacionalestadaocombrnoticiasnytiwconhecaocientista consideradooguiaespiritualdosalgoritmos70002654893 Acesso em 11072019