Académique Documents
Professionnel Documents
Culture Documents
Introdução à Ciência
Introdução
da Computação Definição de Ponteiros
Declaração de Ponteiros em C
Manipulação de Ponteiros em C
Ponteiros
Operações
em C Ponteiros e Arranjos
Prof. Ricardo J. G. B. Campello Passagem de Parâmetros por Referência
Introdução Definição
Por quê ponteiros são importantes? Um ponteiro (ou apontador) é uma variável
que armazena um endereço de memória
Permitem passagem de parâmetros para
Normalmente, esse endereço é a posição de outra
funções por referência variável na memória
Permitem alocar e liberar memória Dizemos portanto que um ponteiro “aponta” para
dinamicamente (em tempo de execução) uma variável
...
Exemplo:
1002 O símbolo * indica que as variáveis var1, var2, etc.
1003 conteúdo de A A são ponteiros para variáveis do tipo tipo
1004
1005 1003 P (ponteiro) Alternativamente pode-se declarar como:
1006
tipo* var1, var2, ...;
Exemplos:
...
Manipulação em C Manipulação em C
Operadores: Atribuição (P1 e P2 ponteiros – A, B e C variáveis):
vetor de 10 chars (string) e ponteiro para chars Por exemplo, o seguinte trecho de código não compila:
As seguintes expressões são equivalentes: char str[]={'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', '\0'};
endereço do argumento = ponteiro pois não altera as variáveis passadas como parâmetros,
altera apenas as cópias dos seus valores feitas em x e y
tais cópias desaparecem ao final da execução da função 20
Passagem de Ponteiros Passagem de Ponteiros
Para forçar uma passagem por referência, é preciso utilizar ponteiros Veja como fica uma chamada à função anterior:
void main(void){
Nesse caso, a função do exemplo anterior fica:
int temp, a = 10, b = 20;
void troca(int *x, int *y){
printf("%d %d\n", a, b);
int temp;
troca(&a, &b);
temp = *x;
printf("%d %d", a, b);
*x = *y;
}
*y = temp;
} Isso explica a sintaxe de scanf (ou seja, por que devemos incluir o
operador & antecedendo as variáveis a receberem valores) ???
e troca os valores contidos nos endereços passados como parâmetro
também explica por que isso não se faz necessário no caso de strings...?
21 22
Quando uma função possui um arranjo (vetor/matriz) como while (*st != '\0'){ printf("%c", *st); st++; }
parâmetro, apenas uma cópia do endereço do arranjo é
passada na chamada, não uma cópia do arranjo todo Formas alternativas equivalentes:
void imprime_string(char* st) { ... }
Como já sabemos, o endereço do arranjo é um ponteiro para
o seu 1º elemento e é referenciado pelo seu próprio nome void imprime_string(char st[]) { ... }
Exemplos de chamada:
Exemplo:
imprime_string("alo!");
Função para imprimir string sem usar fprintf("%s", var)
imprime_string(var); /* var = vetor de chars (string) */
23 24
Passagem de Ponteiros Outros Tópicos sobre Ponteiros
Exercícios Exercícios
Explique o que #include <stdio.h> Definir um tipo de registro (struct) com três campos: um
void main(void){
será apresentado campo numérico real, um campo caractere e um campo
int A=1, B=2, C=3, *P1, *P2, *P3;
como resultado do P1 = &B;
dado por um vetor de inteiros
seguinte código P2 = P1;
Declarar um registro do tipo acima
P3 = &C;
em C:
*P2 = 5;
C = *P1; Declarar um ponteiro para esse tipo de estrutura e
P1 = &A; apontá-lo para o registro declarado no item anterior
*P1 = *P3;
printf("%d\n%d\n%d",A, B, C); Atribuir valores aos campos do registro utilizando o
} ponteiro (ou seja, o operador seta, ao invés do
operador ponto)
27 28
Exercícios Exercícios
Faça uma função que recebe como parâmetros três Faça uma função que recebe como parâmetro uma
ponteiros para vetores de inteiros, todos do mesmo string (vetor de caracteres) e o respectivo número
tamanho, tamanho este que também é passado de caracteres válidos (tamanho da string, sem
como parâmetro para a função. Essa função deve contar o \0) como parâmetros. Essa função deve
fazer com que cada célula do terceiro vetor se “inverter” a string, ou seja, fazer com que ela
torne igual à soma das células correspondentes apareça de trás para frente caso seja escrita.
dos outros dois
29 30
Bibliografia
Schildt, H. "C Completo e Total", 3a. Edição,
Pearson, 1997.
Damas, L. “Linguagem C”, 10a. Edição, LTC, 2007
31