·
Engenharia Elétrica ·
Introdução à Lógica e Programação
Send your question to AI and receive an answer instantly
Recommended for you
2
Exercícios de Programação com Estruturas de Dados
Introdução à Lógica e Programação
IFSC
73
Arquivos em C - Guia Completo com Exemplos e Tipos
Introdução à Lógica e Programação
IFSC
56
Linguagem C Funções Guia Completo e Estruturação de Código
Introdução à Lógica e Programação
IFSC
29
Linguagem C - Estruturas Definidas pelo Programador - Tutorial e Exercícios
Introdução à Lógica e Programação
IFSC
Preview text
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 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 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 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 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 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 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 int main int p p1 x 10 float y 200 p x printfConteudo apontado por p d p p1 p printfConteudo apontado por p1 d p1 p y printfConteudo apontado por p d p printfConteudo apontado por p f p printfConteudo apontado por p f floatp return 0 Conteudo apontado por p 10 Conteudo apontado por p1 10 Conteudo apontado por p 1101004800 Conteudo apontado por p 0000000 Conteudo apontado por p 20000000 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 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úd o 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 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 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 int main void pp int p1 p2 10 p1 p2 recebe o endereço de um inteiro pp p2 printfEndereco em pp p pp recebe o endereço de um ponteiro para inteiro pp p1 printfEndereco em pp p pp recebe o endereço guardado em p1 endereço de p2 pp p1 printfEndereco em pp p pp return 0 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 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úd o 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 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 Clique para editar o texto mestre Clique para editar o texto mestre PONTEIROS E ARRAYS Usando array Usando ponteiro 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 Clique para editar o texto mestre Clique para editar o texto mestre 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 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 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 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 MATERIAL COMPLEMENTAR Vídeo Aulas Aula 55 Ponteiros pt1 Conceito Aula 56 Ponteiros pt2 Operações Aula 57 Ponteiros pt3 Ponteiro Genério Aula 58 Ponteiros pt4 Ponteiros e Arrays Aula 59 Ponteiros pt5 Ponteiro para Ponteiro
Send your question to AI and receive an answer instantly
Recommended for you
2
Exercícios de Programação com Estruturas de Dados
Introdução à Lógica e Programação
IFSC
73
Arquivos em C - Guia Completo com Exemplos e Tipos
Introdução à Lógica e Programação
IFSC
56
Linguagem C Funções Guia Completo e Estruturação de Código
Introdução à Lógica e Programação
IFSC
29
Linguagem C - Estruturas Definidas pelo Programador - Tutorial e Exercícios
Introdução à Lógica e Programação
IFSC
Preview text
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 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 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 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 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 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 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 int main int p p1 x 10 float y 200 p x printfConteudo apontado por p d p p1 p printfConteudo apontado por p1 d p1 p y printfConteudo apontado por p d p printfConteudo apontado por p f p printfConteudo apontado por p f floatp return 0 Conteudo apontado por p 10 Conteudo apontado por p1 10 Conteudo apontado por p 1101004800 Conteudo apontado por p 0000000 Conteudo apontado por p 20000000 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 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úd o 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 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 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 int main void pp int p1 p2 10 p1 p2 recebe o endereço de um inteiro pp p2 printfEndereco em pp p pp recebe o endereço de um ponteiro para inteiro pp p1 printfEndereco em pp p pp recebe o endereço guardado em p1 endereço de p2 pp p1 printfEndereco em pp p pp return 0 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 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úd o 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 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 Clique para editar o texto mestre Clique para editar o texto mestre PONTEIROS E ARRAYS Usando array Usando ponteiro 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 Clique para editar o texto mestre Clique para editar o texto mestre 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 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 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 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 MATERIAL COMPLEMENTAR Vídeo Aulas Aula 55 Ponteiros pt1 Conceito Aula 56 Ponteiros pt2 Operações Aula 57 Ponteiros pt3 Ponteiro Genério Aula 58 Ponteiros pt4 Ponteiros e Arrays Aula 59 Ponteiros pt5 Ponteiro para Ponteiro