TÓPICO 1 – CADEIA DE CARACTERES
2.2 PONTEIRO PARA ESTRUTURAS
Ponteiros são definidos como variáveis e possuem a responsabilidade de armazenar endereços na memória de um programa de computador. Ao realizar o processo de armazenamento de endereços na memória do programa é possível que sejam incluídos valores, bem como, também, podem ser utilizados. No entanto esse processo não é apenas armazenar ou gravar um endereço na memória, para que isso ocorra existe a necessidade de se fazer a declaração de um ponteiro, para que realize este armazenamento do endereço. Brookshear (2013, p. 313) apresenta:
um ponteiro como uma área de armazenamento que contém um desses endereços codificados. No caso de estruturas de dados os ponteiros são usados para gravar a posição na qual os itens de dados estão armazenados. Por exemplo, se precisássemos mover repetidamente um item de dados de uma posição para outra, poderíamos designar uma posição fixa para servir como um ponteiro. Então, cada vez que movêssemos um item, poderíamos atualizar o ponteiro para refletir o novo endereço dos dados. Posteriormente, quando precisássemos acessar o item de dados, poderíamos encontrá-lo por meio do ponteiro.
Na verdade, o ponteiro sempre “apontará” para os dados.
O ponteiro, também conhecido como apontador, e definido por ser uma variável que possui como uma de suas principais finalidades armazenar endereço na memória de um programa, tendo como características em suas essenciais funcionalidades apontar e acessar a posição, o endereço que a variável está armazenada, apontar para as variáveis que estão alocadas e declaradas, sua associação é sempre em relação ao tipo da variável que se está apontando.
Para que dados e informações possam sem encontrados em uma lista enorme de dados, é possível, segundo Brookshear (2013, p. 313),
reservar uma célula de memória adicional, dentro de cada bloco de células como ponteiros, onde esses ponteiros serão apontados para outros blocos, estes representam um livro do mesmo autor. Com isso os livros com os mesmos autores, mas com temas diferentes em comum podem tornar-se interligados com setas de identificação.
Vamos analisar a figura a seguir, que representa esta funcionalidade do ponteiro.
FIGURA 48 – PONTEIROS INTERLIGADOS
Adeus às Armas
por Ernest Hemingway Por Quem os Sinos Dobram
por Ernest Hemingway O Sol Também se Levanta por Ernest Hemingway
Ponteiro Ponteiro Ponteiro
O ponteiro pode apontar para uma estrutura. “Pode-se declarar um ponteiro para uma estrutura tal como se declara um ponteiro para qualquer outro objeto. Declara-se um ponteiro: especificando um ponteiro em lugar do nome da variável estrutura”. (AGUILAR, 2011, p. 330). Ao realizar a declaração do ponteiro, também são indicados ao compilador a quantidade de espaço da memória que se necessita fazer o armazenamento dos valores. Após realizar esses procedimentos de declarar o ponteiro e indicar para o compilador o espaço necessário na memória, uma variável identificada como tipo ponteiro, será apontada para uma variável que está identificada como tipo (char, int, float e double).
Uma característica muito interessante que deve ser observada ao realizar a declaração de um ponteiro é: precisa-se especificar para qual localização e qual tipo de variável que este ponteiro será apontado. Geralmente, os ponteiros são declarados através do seguinte operador ( * ), utilizado antes do nome da variável ao qual deverá ser apontado. Podemos citar como exemplo deste comando de declaração de ponteiro: operador ( * ) para apontar para a variável. Vamos analisar a figura a seguir que trata essas variáveis:
Analisando a figura é possível verificar que as variáveis do tipo aux, temp e pont, realizam o armazenamento dos endereços na memória do programa, lembrando que isso é necessário, pois ao declarar as variáveis é possível identificar o espaço necessário que essas variáveis vão ocupar no programa, é um fator muito importante para o desenvolvimento de programas. O operador ( * ) é utilizado para identificar e acessar a posição de memória da variável, observando que é a posição da variável que deve ser acessada e não o endereço da memória.
Os ponteiros possuem algumas vantagens muito interessantes e importantes, como possibilitam que se tenha passagem para os parâmetros de funções por referência, além de alocar endereço na memória, também possui a finalidade de liberar espaço na memória do programa e este processo ocorre de forma dinâmica, durante a execução do programa que está sendo utilizado, outra vantagem que é muito importante no processo de um ponteiro é que o mesmo permite que sejam implementadas de forma eficaz e dinâmica novas estruturas de dados.
2.2.1 Operadores
“O significado de um operador – é uma operação que realiza e tipo de resultado – depende dos tipos dos seus operandos. Até que se conheça o tipo de operando(s), não se pode conhecer o significado da expressão”. (AGUILAR 2008, p. 12). Os ponteiros possuem os seguintes operadores utilizados para realizar a declaração das variáveis, são: ( * , & e Null). O operador ( * ) possui como finalidade apontar a variável para um ponteiro, bem como realizar a recuperação de conteúdo das variáveis declaradas. O operador ( & ) tem a funcionalidade de indicar que um ponteiro poderá apenas receber endereços de memória, esta é sua única e principal função para um operador. O operador Nulo (Null) possui como funcionalidade receber valores dele mesmo, valores nulos, no entanto, esses valores não serão apontados para nenhuma variável na memória.
Especificamente o operador ( * ) realiza as seguintes funções:
• preferenciamento da variável;
• armazenar através de;
• apontar uma variável para um ponteiro.
O ponteiro ( & ) possui as seguintes funcionalidades:
• identificar o endereço da memória;
• armazenar um endereço na memória.
FIGURA 50 – OPERADORES DE PONTEIROS
FONTE: Almeida (2013)
Conforme Pinheiro (2012, p. 112), “os operadores podem ser classificados quanto ao número de operadores em unários, binários e ternários. Os operadores unários requerem um operador, os binários, dois e os ternários, três números. Podem existir operadores que realizam operações com quatro, cinco ou mais operações”.
Uma característica interessante do operador é que ele é avaliado pelas operações, pode resultar em um valor específico para a função. Ainda segundo o autor:
a notação utilizada para representar uma operação pode ser classificada como:
• prefixada, se o operador ocorre antes dos operandos;
• pós-fixada, se o operador ocorre após os operandos;
• infixada, se o operador ocorre entre os operandos.
Um operador nada mais é do que expressões, caracteres e vários jargões da linguagem de programação, que são considerados como valores e podem ser utilizados para realizar a alimentação dos operadores. Podemos encontrar vários tipos de operadores e cada um possui sua finalidade e especificidade. A seguir vamos listar cada um desses operadores, para que tenha uma noção de quais são eles:
• Operadores Aritméticos.
• Operadores Bit – a – Bit.
• Operadores de Comparação.
• Operadores de Controle de erro.
• Operadores de Execução.
• Operadores de Incremento/Decremento.
• Operadores Lógicos.
• Operadores de String.
• Operadores de Arrays.
• Operadores de Tipo.