·

Cursos Gerais ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

22042019 1 LINGUAGEM C PONTEIROS Prof André Backes DEFINIÇÃO Variável É um espaço reservado de memória usado para guardar um valor que pode ser modificado pelo programa Ponteiro É um espaço reservado de memória usado para guardar o endereço de memória de uma outra variável Um ponteiro é uma variável como qualquer outra do programa sua diferença é que ela não armazena um valor inteiro real caractere ou booleano Ela serve para armazenar endereços de memória são valores inteiros sem sinal 22042019 2 DECLARAÇÃO Como qualquer variável um ponteiro também possui um tipo É o asterisco que informa ao compilador que aquela variável não vai guardar um valor mas sim um endereço para o tipo especificado DECLARAÇÃO Exemplos de declaração de variáveis e ponteiros 22042019 3 DECLARAÇÃO Na linguagem C quando declaramos um ponteiro nós informamos ao compilador para que tipo de variável vamos apontálo Um ponteiro int aponta para um inteiro isto é int Esse ponteiro guarda o endereço de memória onde se encontra armazenada uma variável do tipo int INICIALIZAÇÃO Ponteiros apontam para uma posição de memória Cuidado Ponteiros não inicializados apontam para um lugar indefinido Exemplo int p Memória posição variável conteúdo 119 120 int p 121 122 123 22042019 4 INICIALIZAÇÃO Um ponteiro pode ter o valor especial NULL que é o endereço de nenhum lugar Exemplo int p NULL Memória posição variável conteúdo 119 120 int p NULL 121 122 123 Nenhum lugar na memória INICIALIZAÇÃO Os ponteiros devem ser inicializados antes de serem usados Assim devemos apontar um ponteiro para um lugar conhecido Podemos apontálo para uma variável que já exista no programa Memória posição variável conteúdo 119 120 int p 122 121 122 int c 10 123 22042019 5 INICIALIZAÇÃO O ponteiro armazena o endereço da variável para onde ele aponta Para saber o endereço de memória de uma variável do nosso programa usamos o operador Ao armazenar o endereço o ponteiro estará apontando para aquela variável Memória posição variável conteúdo 119 120 int p 122 121 122 int c 10 123 UTILIZAÇÃO Tendo um ponteiro armazenado um endereço de memória como saber o valor guardado dentro dessa posição 22042019 6 UTILIZAÇÃO Para acessar o valor guardado dentro de uma posição na memória apontada por um ponteiro basta usar o operador asterisco na frente do nome do ponteiro UTILIZAÇÃO p conteúdo da posição de memória apontado por p c o endereço na memória onde está armazenada a variável c 22042019 7 UTILIZAÇÃO De modo geral um ponteiro só pode receber o endereço de memória de uma variável do mesmo tipo do ponteiro Isso ocorre porque diferentes tipos de variáveis ocupam espaços de memória de tamanhos diferentes Na verdade nós podemos atribuir a um ponteiro de inteiro int o endereço de uma variável do tipo float No entanto o compilador assume que qualquer endereço que esse ponteiro armazene obrigatoriamente apontará para uma variável do tipo int Isso gera problemas na interpretação dos valores UTILIZAÇÃO 22042019 8 OPERAÇÕES COM PONTEIROS Atribuição p1 aponta para o mesmo lugar que p2 a variável apontada por p1 recebe o mesmo conteúdo da variável apontada por p2 OPERAÇÕES COM PONTEIROS Apenas duas operações aritméticas podem ser utilizadas com no endereço armazenado pelo ponteiro adição e subtração podemos apenas somar e subtrair valores INTEIROS p soma 1 no endereço armazenado no ponteiro p subtrai 1 no endereço armazenado no ponteiro p p15 soma 15 no endereço armazenado no ponteiro 22042019 9 OPERAÇÕES COM PONTEIROS As operações de adição e subtração no endereço dependem do tipo de dado que o ponteiro aponta Considere um ponteiro para inteiro int O tipo int ocupa um espaço de 4 bytes na memória Assim nas operações de adição e subtração são adicionadossubtraídos 4 bytes por incrementodecremento pois esse é o tamanho de um inteiro na memória e portanto é também o valor mínimo necessário para sair dessa posição reservada de memória Memória posição variável conteúdo 119 120 int a 10 121 122 123 124 int b 20 125 126 127 128 char c k 129 char d s 130 OPERAÇÕES COM PONTEIROS Operações Ilegais com ponteiros Dividir ou multiplicar ponteiros Somar o endereço de dois ponteiros Não se pode adicionar ou subtrair valores dos tipos float ou double de ponteiros 22042019 10 OPERAÇÕES COM PONTEIROS Já sobre seu conteúdo apontado valem todas as operações p incrementar o conteúdo da variável apontada pelo ponteiro p p p 10 multiplica o conteúdo da variável apontada pelo ponteiro p por 10 OPERAÇÕES COM PONTEIROS Operações relacionais e para saber se dois ponteiros são iguais ou diferentes e para saber qual ponteiro aponta para uma posição mais alta na memória 22042019 11 PONTEIROS GENÉRICOS Normalmente um ponteiro aponta para um tipo específico de dado Um ponteiro genérico é um ponteiro que pode apontar para qualquer tipo de dado Declaração PONTEIROS GENÉRICOS Exemplos 22042019 12 PONTEIROS GENÉRICOS Para acessar o conteúdo de um ponteiro genérico é preciso antes convertêlo para o tipo de ponteiro com o qual se deseja trabalhar Isso é feito vai type cast PONTEIROS E ARRAYS Ponteiros e arrays possuem uma ligação muito forte Arrays são agrupamentos de dados do mesmo tipo na memória Quando declaramos um array informamos ao computador para reservar uma certa quantidade de memória a fim de armazenar os elementos do array de forma sequencial Como resultado dessa operação o computador nos devolve um ponteiro que aponta para o começo dessa sequência de bytes na memória 22042019 13 PONTEIROS E ARRAYS O nome do array sem índice é apenas um ponteiro que aponta para o primeiro elemento do array Memória posição variável conteúdo 119 120 121 int p 123 122 123 int vet5 1 124 2 125 3 126 4 127 5 128 PONTEIROS E ARRAYS Os colchetes substituem o uso conjunto de operações aritméticas e de acesso ao conteúdo operador no acesso ao conteúdo de uma posição de um array ou ponteiro O valor entre colchetes é o deslocamento a partir da posição inicial do array Nesse caso p2 equivale a p2 22042019 14 PONTEIROS E ARRAYS Nesse exemplo Temos que p é equivalente a vet0 vetíndice é equivalente a píndice vet é equivalente a vet0 vetíndice é equivalente a vet índice PONTEIROS E ARRAYS Usando array Usando ponteiro 22042019 15 PONTEIROS E ARRAYS Arrays Multidimensionais Apesar de terem mais de uma dimensão na memória os dados são armazenados linearmente Ex int mat55 00 44 00 10 20 30 40 44 PONTEIROS E ARRAYS Usando array Usando ponteiro Podese então percorrer as várias dimensões do array como se existisse apenas uma dimensão As dimensões mais a direita mudam mais rápido 22042019 16 PONTEIRO PARA STRUCT Existem duas abordagens para acessar o conteúdo de um ponteiro para uma struct Abordagem 1 Devemos acessar o conteúdo do ponteiro para struct para somente depois acessar os seus campos e modificálos Abordagem 2 Podemos usar o operador seta ponteironomecampo PONTEIRO PARA PONTEIRO A linguagem C permite criar ponteiros com diferentes níveis de apontamento É possível criar um ponteiro que aponte para outro ponteiro criando assim vários níveis de apontamento Assim um ponteiro poderá apontar para outro ponteiro que por sua vez aponta para outro ponteiro que aponta para um terceiro ponteiro e assim por diante 22042019 17 PONTEIRO PARA PONTEIRO Um ponteiro para um ponteiro é como se você anotasse o endereço de um papel que tem o endereço da casa do seu amigo Podemos declarar um ponteiro para um ponteiro com a seguinte notação tipoponteiro nomeponteiro Acesso ao conteúdo nomeponteiro é o conteúdo final da variável apontada nomeponteiro é o conteúdo do ponteiro intermediário PONTEIRO PARA PONTEIRO Memória posição variável conteúdo 119 120 121 122 int p2 124 123 124 int p1 126 125 126 int x 10 127 22042019 18 PONTEIRO PARA PONTEIRO É a quantidade de asteriscos na declaração do ponteiro que indica o número de níveis de apontamento que ele possui PONTEIRO PARA PONTEIRO Conceito de ponteiro para ponteiro Memória posição variável conteúdo 119 120 char p3 122 121 122 char p2 124 123 124 char p1 126 125 126 char letra a 127 22042019 19 MATERIAL COMPLEMENTAR Vídeo Aulas Aula 55 Ponteiros pt1 Conceito youtubeSJzd9x2S2yg Aula 56 Ponteiros pt2 Operações youtubecg1mnWupbTE Aula 57 Ponteiros pt3 Ponteiro Genérico youtubebqwGebrvEU Aula 58 Ponteiros pt4 Ponteiros e Arrays youtubewBBUJWS50 Aula 59 Ponteiros pt5 Ponteiro para Ponteiro youtube2GllOuAYFE