SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Prof. Leonardo Barreto Campos 1
Linguagem C:
Ponteiros
Prof. Leonardo Barreto Campos 2/34
Sumário
Ponteiros;
Variáveis ponteiros;
Operadores de ponteiros;
Expressões com ponteiros;
Atribuição de ponteiros;
Aritmética de ponteiros;
Comparação de ponteiros;
Ponteiros e Matrizes;
Matrizes de Ponteiros;
Prof. Leonardo Barreto Campos 3/34
Ponteiros
A linguagem C é altamente dependente de ponteiros.
Para ser um bom programador em C é fundamental que
se tenha um bom domínio deles;
Um ponteiro é uma variável que contém um endereço
de memória;
Assim como um int guarda inteiro, um float guarda
ponto flutuante e um char guarda caracteres, o
ponteiro guarda um endereço de memória;
Prof. Leonardo Barreto Campos 4/34
Ponteiros
Alguns motivos para se usar ponteiros:
Passagem de parâmetros para uma função por referência.
Passamos o endereço (um ponteiro) da variável argumento;
Forma elegante de passar matrizes e strings como argumentos
para funções;
A utilização sensata de ponteiros deixa o programa mais
rápido;
Ponteiros são a base para a criação de estruturas de dados
mais avançadas, como listas, pilhas, filas, árvores,
etc(Estrutura de Dados I);
Prof. Leonardo Barreto Campos 5/34
Declaração de ponteiros
Para declarar um ponteiro temos a seguinte forma
geral:
tipo_do_ponteiro *nome_da_variavel;
O asterisco (*) que faz o compilador saber que aquela
variável não vai guardar um valor mas um endereço para aquele
tipo especificado;
Vejamos exemplos de declaração de ponteiros:
int *a, *b, *c;
char *nome;
Prof. Leonardo Barreto Campos 6/34
Operadores de ponteiros
Existem dois operadores especiais para ponteiros: * e
& :
O & é um operador unário que devolve o endereço na memória
do seu operando;
O * é um operador unário que devolve o valor da variável
localizada no endereço que o segue;
Por exemplo, o que seria na tela no programa a seguir?
O endereço de memória que
contém a variável cont
Código %p usado na na função
printf() para indicar que ela deve
imprimir um endereço em Hexa
Prof. Leonardo Barreto Campos 7/34
Operadores de ponteiros
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 8/34
Operadores de ponteiros
Vejamos outro exemplo que manipula ponteiros:
Saída no console:
Prof. Leonardo Barreto Campos 9/34
Expressões com ponteiros
Em geral, expressões envolvendo ponteiros concordam
com as mesmas regras de qualquer outra expresão de
C;
Vejamos alguns poucos aspectos especiais de
expressões com ponteiros:
Atribuição de ponteiros;
Aritmética de ponteiros;
Comparação de ponteiros;
Prof. Leonardo Barreto Campos 10/34
Atribuição de ponteiros
Como é o caso com qualquer variável, um ponteiro pode
ser usado no lado direito de um comando de atribuição
para passar seu valor para outro ponteiro, vejamos:
Tanto p1 quanto p2 apontam para o
endereço de memória da variável x
Prof. Leonardo Barreto Campos 11/34
Atribuição de ponteiros
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 12/34
Aritmética de ponteiros
Existem apenas duas operações aritméticas que
podem ser usadas com ponteiros:
Adição (incremento) e
Subtração (decremento).
Quando incrementamos um ponteiro ele passa a
apontar para o próximo valor do mesmo tipo para o
qual o ponteiro aponta;
Se tivermos um ponteiro para um inteiro e o incrementamos
ele passa a apontar para o próximo inteiro;
Prof. Leonardo Barreto Campos 13/34
Aritmética de ponteiros
Isso justifica a necessidade do compilador conhecer o
tipo de um ponteiro;
Se incrementarmos um ponteiro char * ele anda 1 byte na
memória;
Se incrementarmos um ponteiro double * ele anda 8 bytes na
memória;
p1 apontará para o próximo elemento
do tipo float (4 bytes adiante)
Prof. Leonardo Barreto Campos 14/34
Aritmética de ponteiros
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 15/34
Aritmética de ponteiros
A aritmética de ponteiros não se limita apenas ao
incremento e decremento, podemos somar ou subtrair
inteiros de ponteiros, vejamos:
p1 apontará para o 20º elemento do
tipo float adiante (20 x 4 bytes
adiante)
Prof. Leonardo Barreto Campos 16/34
Aritmética de ponteiros
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 17/34
Aritmética de ponteiros
Toda aritmética de ponteiros é relativa à seu tipo
base:
char *ch;
int *i;
i = ch;
Os ponteiros *ch e *i apontam para a mesma
posição de memória. Supondo esse endereço
de memória igual a 3000.
Prof. Leonardo Barreto Campos 18/34
Aritmética de ponteiros
Como faríamos para incrementar o conteúdo da
variável apontada por um ponteiro p qualquer?
(*p)++
Prof. Leonardo Barreto Campos 19/34
Aritmética de ponteiros
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 20/34
Aritmética de ponteiros
Além de adição e subtração entre um ponteiro e um
inteiro, nenhuma outra operação aritmétcia pode ser
efetuada com ponteiros;
Não podemos multiplicar ou dividir ponteiros;
Não podemos aplicar os operadores de deslocamento e de
mascaramento bit a bit com ponteiros;
Não podemos adicionar ou subtrair o tipo float ou o tipo
double a ponteiros;
Prof. Leonardo Barreto Campos 21/34
Comparação de ponteiros
É possível comparar dois ponteiros em uma expressão
relacional (<, <=, > e >=) ou se eles são iguais ou
diferentes (== e !=);
A comparação entre dois ponteiros se escreve como a
comparação entre outras duas variáveis quaisquer,
vejamos:
Prof. Leonardo Barreto Campos 22/34
Comparação de ponteiros
Vejamos:
Prof. Leonardo Barreto Campos 23/34
Comparação de ponteiros
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 24/34
Ponteiros e Matrizes
Há uma estreita relação entre ponteiros e matrizes;
Quando declaramos uma matriz da seguinte forma,
por exemplo:
int mat[20][30];
O compilador C calcula o tamanho, em bytes necessário para
armazenar esta matriz. Este tamanho é:
20 x 30 x 2 bytes
O compilador então aloca este número de bytes em um
espaço livre de memória;
Prof. Leonardo Barreto Campos 25/34
Ponteiros e Matrizes
O nome da variável que declaramos é na verdade um
ponteiro para o tipo da variável da matriz;
Consideremos o seguinte trecho de código:
char str[30], *p;
p = str;
Neste caso p foi inicializado com o endereço do primeiro
elemento da matriz st;
Como faríamos para acessar o quinto elemento em str?
str[4]; ou *(p + 4);
Prof. Leonardo Barreto Campos 26/34
Ponteiros e Matrizes
Vejamos um dos usos mais importantes dos ponteiros:
A varredura sequencial de uma matriz:
O ponteiro p aponta para a
posição 0 (zero) da string str
O ponteiro p é incrementado e
passa a apontar para próxima
posição da string str
O ponteiro p é testado até
atingir o delimitador /0
Prof. Leonardo Barreto Campos 27/34
Ponteiros e Matrizes
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 28/34
Ponteiros e Matrizes
Vejamos outro exemplo de varredura sequencial de uma matriz,
onde se torna ainda mais evidente a eficácia dos ponteiros:
Cálculo de 2500 deslocamentos
Apenas o incremento
de ponteiro
Prof. Leonardo Barreto Campos 29/34
Ponteiros e Matrizes
Faça um programa em C que leia uma matriz mat 2 x 3 de
inteiros e encontre o menor elemento da matriz.
Prof. Leonardo Barreto Campos 30/34
Ponteiros e Matrizes
A saída no console para o programa anterior será:
Prof. Leonardo Barreto Campos 31/34
Ponteiros e Matrizes
Há uma diferença entre o nome de uma matriz e um
ponteiro que deve ser frisada:
Um ponteiro é uma variável, mas o nome de uma matriz não é
uma variável;
Supondo as declarações a seguir, vejamos a corretude
das atribuições:
vetor = vetor + 2;
int vetor[10]; vetor = ponteiro;
int *ponteiro; ponteiro = vetor + 2;
ponteiro = vetor;
Errado!
Certo!
Prof. Leonardo Barreto Campos 32/34
Matrizes de Ponteiros
Ponteiros podem ser organizados em matrizes como
qualquer outro tipo de dado;
A declaração de uma matriz de ponteiros int, de tamanho 10,
é:
int *x[10];
Para atribuir o endereço de uma variável inteira, chamada var,
ao terceiro elemento da matriz de ponteiros, deve-se
escrever:
x[2] = &var;
Para encontrar o valor de var, escreve-se:
*x[2];
Prof. Leonardo Barreto Campos 33/34
Indireção Múltipla
Podemos também, ter um ponteiro apontando para
outro ponteiro que aponta para o valor final. Situação
chamada indireção múltipla, ou ponteiros para
ponteiros;
Endereço Valor
VariávelPonteiro
Endereço Valor
VariávelPonteiro
Endereço
Ponteiro
Prof. Leonardo Barreto Campos 34/34
Bibliografia
SCHILDT H. “C Completo e Total”, Makron Books. SP,
1997.
UFMG “Curso de Linguagem C”, Universidade Federal
de Minas Gerais.

Mais conteúdo relacionado

Mais procurados

Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducaommind
 
Algoritmos - Aula 10 A - Traducao Do Port Est Para Ling C
Algoritmos - Aula 10 A - Traducao Do Port Est Para Ling CAlgoritmos - Aula 10 A - Traducao Do Port Est Para Ling C
Algoritmos - Aula 10 A - Traducao Do Port Est Para Ling CRodrigo Kiyoshi Saito
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem Capolllorj
 
Aula04 ponteiros e conversao
Aula04   ponteiros e conversaoAula04   ponteiros e conversao
Aula04 ponteiros e conversaoYuri Passos
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cppRUI VIEIRA
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Kratos879
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem cJefferson Bessa
 
Prova 01 de Autômatos e Computabilidade
Prova 01 de Autômatos e ComputabilidadeProva 01 de Autômatos e Computabilidade
Prova 01 de Autômatos e Computabilidadeshichibukai_01
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoesYuri Passos
 
Aula01
Aula01Aula01
Aula01vdlos
 

Mais procurados (17)

Ativ complementar etapa 02
Ativ complementar etapa 02Ativ complementar etapa 02
Ativ complementar etapa 02
 
Aula4
Aula4Aula4
Aula4
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducao
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Linguagem c parte 1
Linguagem c parte 1Linguagem c parte 1
Linguagem c parte 1
 
Algoritmos - Aula 10 A - Traducao Do Port Est Para Ling C
Algoritmos - Aula 10 A - Traducao Do Port Est Para Ling CAlgoritmos - Aula 10 A - Traducao Do Port Est Para Ling C
Algoritmos - Aula 10 A - Traducao Do Port Est Para Ling C
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
 
Aula04 ponteiros e conversao
Aula04   ponteiros e conversaoAula04   ponteiros e conversao
Aula04 ponteiros e conversao
 
Autômatos
AutômatosAutômatos
Autômatos
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Prova 01 de Autômatos e Computabilidade
Prova 01 de Autômatos e ComputabilidadeProva 01 de Autômatos e Computabilidade
Prova 01 de Autômatos e Computabilidade
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoes
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 
Questesdetecnologia ano2003
Questesdetecnologia ano2003Questesdetecnologia ano2003
Questesdetecnologia ano2003
 
Aula01
Aula01Aula01
Aula01
 

Semelhante a C Ponteiros Guia Completo

Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
algoritmo-m03-tiposdedados-151221150545.pptx
algoritmo-m03-tiposdedados-151221150545.pptxalgoritmo-m03-tiposdedados-151221150545.pptx
algoritmo-m03-tiposdedados-151221150545.pptxGustavoMaciel67
 
Algoritmos - Aula 02 - Construcao de algoritmos
Algoritmos - Aula 02 - Construcao de algoritmosAlgoritmos - Aula 02 - Construcao de algoritmos
Algoritmos - Aula 02 - Construcao de algoritmosRodrigo Kiyoshi Saito
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+cThiago Freitas
 
Algoritmos computacionais
Algoritmos computacionaisAlgoritmos computacionais
Algoritmos computacionaisDérick Platini
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresAnderson Favaro
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfEizoKato
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfEizoKato
 
Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05thomasdacosta
 

Semelhante a C Ponteiros Guia Completo (20)

Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Apostila de Alocação Dinâmica em C
Apostila de Alocação Dinâmica em CApostila de Alocação Dinâmica em C
Apostila de Alocação Dinâmica em C
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Aula de C e C++
Aula de C e C++Aula de C e C++
Aula de C e C++
 
Cap 2
Cap 2Cap 2
Cap 2
 
Cap 2
Cap 2Cap 2
Cap 2
 
Apostila c++ básico
Apostila c++ básicoApostila c++ básico
Apostila c++ básico
 
Apostila c++ básico (1)
Apostila c++ básico (1)Apostila c++ básico (1)
Apostila c++ básico (1)
 
Ud3
Ud3Ud3
Ud3
 
algoritmo-m03-tiposdedados-151221150545.pptx
algoritmo-m03-tiposdedados-151221150545.pptxalgoritmo-m03-tiposdedados-151221150545.pptx
algoritmo-m03-tiposdedados-151221150545.pptx
 
Algoritmo - tipos de dados
Algoritmo - tipos de dadosAlgoritmo - tipos de dados
Algoritmo - tipos de dados
 
Algoritmos - Aula 02 - Construcao de algoritmos
Algoritmos - Aula 02 - Construcao de algoritmosAlgoritmos - Aula 02 - Construcao de algoritmos
Algoritmos - Aula 02 - Construcao de algoritmos
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Algoritmos computacionais
Algoritmos computacionaisAlgoritmos computacionais
Algoritmos computacionais
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - Compiladores
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
 
Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05
 

C Ponteiros Guia Completo

  • 1. Prof. Leonardo Barreto Campos 1 Linguagem C: Ponteiros
  • 2. Prof. Leonardo Barreto Campos 2/34 Sumário Ponteiros; Variáveis ponteiros; Operadores de ponteiros; Expressões com ponteiros; Atribuição de ponteiros; Aritmética de ponteiros; Comparação de ponteiros; Ponteiros e Matrizes; Matrizes de Ponteiros;
  • 3. Prof. Leonardo Barreto Campos 3/34 Ponteiros A linguagem C é altamente dependente de ponteiros. Para ser um bom programador em C é fundamental que se tenha um bom domínio deles; Um ponteiro é uma variável que contém um endereço de memória; Assim como um int guarda inteiro, um float guarda ponto flutuante e um char guarda caracteres, o ponteiro guarda um endereço de memória;
  • 4. Prof. Leonardo Barreto Campos 4/34 Ponteiros Alguns motivos para se usar ponteiros: Passagem de parâmetros para uma função por referência. Passamos o endereço (um ponteiro) da variável argumento; Forma elegante de passar matrizes e strings como argumentos para funções; A utilização sensata de ponteiros deixa o programa mais rápido; Ponteiros são a base para a criação de estruturas de dados mais avançadas, como listas, pilhas, filas, árvores, etc(Estrutura de Dados I);
  • 5. Prof. Leonardo Barreto Campos 5/34 Declaração de ponteiros Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variavel; O asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor mas um endereço para aquele tipo especificado; Vejamos exemplos de declaração de ponteiros: int *a, *b, *c; char *nome;
  • 6. Prof. Leonardo Barreto Campos 6/34 Operadores de ponteiros Existem dois operadores especiais para ponteiros: * e & : O & é um operador unário que devolve o endereço na memória do seu operando; O * é um operador unário que devolve o valor da variável localizada no endereço que o segue; Por exemplo, o que seria na tela no programa a seguir? O endereço de memória que contém a variável cont Código %p usado na na função printf() para indicar que ela deve imprimir um endereço em Hexa
  • 7. Prof. Leonardo Barreto Campos 7/34 Operadores de ponteiros A saída no console para o programa anterior será:
  • 8. Prof. Leonardo Barreto Campos 8/34 Operadores de ponteiros Vejamos outro exemplo que manipula ponteiros: Saída no console:
  • 9. Prof. Leonardo Barreto Campos 9/34 Expressões com ponteiros Em geral, expressões envolvendo ponteiros concordam com as mesmas regras de qualquer outra expresão de C; Vejamos alguns poucos aspectos especiais de expressões com ponteiros: Atribuição de ponteiros; Aritmética de ponteiros; Comparação de ponteiros;
  • 10. Prof. Leonardo Barreto Campos 10/34 Atribuição de ponteiros Como é o caso com qualquer variável, um ponteiro pode ser usado no lado direito de um comando de atribuição para passar seu valor para outro ponteiro, vejamos: Tanto p1 quanto p2 apontam para o endereço de memória da variável x
  • 11. Prof. Leonardo Barreto Campos 11/34 Atribuição de ponteiros A saída no console para o programa anterior será:
  • 12. Prof. Leonardo Barreto Campos 12/34 Aritmética de ponteiros Existem apenas duas operações aritméticas que podem ser usadas com ponteiros: Adição (incremento) e Subtração (decremento). Quando incrementamos um ponteiro ele passa a apontar para o próximo valor do mesmo tipo para o qual o ponteiro aponta; Se tivermos um ponteiro para um inteiro e o incrementamos ele passa a apontar para o próximo inteiro;
  • 13. Prof. Leonardo Barreto Campos 13/34 Aritmética de ponteiros Isso justifica a necessidade do compilador conhecer o tipo de um ponteiro; Se incrementarmos um ponteiro char * ele anda 1 byte na memória; Se incrementarmos um ponteiro double * ele anda 8 bytes na memória; p1 apontará para o próximo elemento do tipo float (4 bytes adiante)
  • 14. Prof. Leonardo Barreto Campos 14/34 Aritmética de ponteiros A saída no console para o programa anterior será:
  • 15. Prof. Leonardo Barreto Campos 15/34 Aritmética de ponteiros A aritmética de ponteiros não se limita apenas ao incremento e decremento, podemos somar ou subtrair inteiros de ponteiros, vejamos: p1 apontará para o 20º elemento do tipo float adiante (20 x 4 bytes adiante)
  • 16. Prof. Leonardo Barreto Campos 16/34 Aritmética de ponteiros A saída no console para o programa anterior será:
  • 17. Prof. Leonardo Barreto Campos 17/34 Aritmética de ponteiros Toda aritmética de ponteiros é relativa à seu tipo base: char *ch; int *i; i = ch; Os ponteiros *ch e *i apontam para a mesma posição de memória. Supondo esse endereço de memória igual a 3000.
  • 18. Prof. Leonardo Barreto Campos 18/34 Aritmética de ponteiros Como faríamos para incrementar o conteúdo da variável apontada por um ponteiro p qualquer? (*p)++
  • 19. Prof. Leonardo Barreto Campos 19/34 Aritmética de ponteiros A saída no console para o programa anterior será:
  • 20. Prof. Leonardo Barreto Campos 20/34 Aritmética de ponteiros Além de adição e subtração entre um ponteiro e um inteiro, nenhuma outra operação aritmétcia pode ser efetuada com ponteiros; Não podemos multiplicar ou dividir ponteiros; Não podemos aplicar os operadores de deslocamento e de mascaramento bit a bit com ponteiros; Não podemos adicionar ou subtrair o tipo float ou o tipo double a ponteiros;
  • 21. Prof. Leonardo Barreto Campos 21/34 Comparação de ponteiros É possível comparar dois ponteiros em uma expressão relacional (<, <=, > e >=) ou se eles são iguais ou diferentes (== e !=); A comparação entre dois ponteiros se escreve como a comparação entre outras duas variáveis quaisquer, vejamos:
  • 22. Prof. Leonardo Barreto Campos 22/34 Comparação de ponteiros Vejamos:
  • 23. Prof. Leonardo Barreto Campos 23/34 Comparação de ponteiros A saída no console para o programa anterior será:
  • 24. Prof. Leonardo Barreto Campos 24/34 Ponteiros e Matrizes Há uma estreita relação entre ponteiros e matrizes; Quando declaramos uma matriz da seguinte forma, por exemplo: int mat[20][30]; O compilador C calcula o tamanho, em bytes necessário para armazenar esta matriz. Este tamanho é: 20 x 30 x 2 bytes O compilador então aloca este número de bytes em um espaço livre de memória;
  • 25. Prof. Leonardo Barreto Campos 25/34 Ponteiros e Matrizes O nome da variável que declaramos é na verdade um ponteiro para o tipo da variável da matriz; Consideremos o seguinte trecho de código: char str[30], *p; p = str; Neste caso p foi inicializado com o endereço do primeiro elemento da matriz st; Como faríamos para acessar o quinto elemento em str? str[4]; ou *(p + 4);
  • 26. Prof. Leonardo Barreto Campos 26/34 Ponteiros e Matrizes Vejamos um dos usos mais importantes dos ponteiros: A varredura sequencial de uma matriz: O ponteiro p aponta para a posição 0 (zero) da string str O ponteiro p é incrementado e passa a apontar para próxima posição da string str O ponteiro p é testado até atingir o delimitador /0
  • 27. Prof. Leonardo Barreto Campos 27/34 Ponteiros e Matrizes A saída no console para o programa anterior será:
  • 28. Prof. Leonardo Barreto Campos 28/34 Ponteiros e Matrizes Vejamos outro exemplo de varredura sequencial de uma matriz, onde se torna ainda mais evidente a eficácia dos ponteiros: Cálculo de 2500 deslocamentos Apenas o incremento de ponteiro
  • 29. Prof. Leonardo Barreto Campos 29/34 Ponteiros e Matrizes Faça um programa em C que leia uma matriz mat 2 x 3 de inteiros e encontre o menor elemento da matriz.
  • 30. Prof. Leonardo Barreto Campos 30/34 Ponteiros e Matrizes A saída no console para o programa anterior será:
  • 31. Prof. Leonardo Barreto Campos 31/34 Ponteiros e Matrizes Há uma diferença entre o nome de uma matriz e um ponteiro que deve ser frisada: Um ponteiro é uma variável, mas o nome de uma matriz não é uma variável; Supondo as declarações a seguir, vejamos a corretude das atribuições: vetor = vetor + 2; int vetor[10]; vetor = ponteiro; int *ponteiro; ponteiro = vetor + 2; ponteiro = vetor; Errado! Certo!
  • 32. Prof. Leonardo Barreto Campos 32/34 Matrizes de Ponteiros Ponteiros podem ser organizados em matrizes como qualquer outro tipo de dado; A declaração de uma matriz de ponteiros int, de tamanho 10, é: int *x[10]; Para atribuir o endereço de uma variável inteira, chamada var, ao terceiro elemento da matriz de ponteiros, deve-se escrever: x[2] = &var; Para encontrar o valor de var, escreve-se: *x[2];
  • 33. Prof. Leonardo Barreto Campos 33/34 Indireção Múltipla Podemos também, ter um ponteiro apontando para outro ponteiro que aponta para o valor final. Situação chamada indireção múltipla, ou ponteiros para ponteiros; Endereço Valor VariávelPonteiro Endereço Valor VariávelPonteiro Endereço Ponteiro
  • 34. Prof. Leonardo Barreto Campos 34/34 Bibliografia SCHILDT H. “C Completo e Total”, Makron Books. SP, 1997. UFMG “Curso de Linguagem C”, Universidade Federal de Minas Gerais.