Escolar Documentos
Profissional Documentos
Cultura Documentos
Tipos de funções:
• Funções void*: não retornam valor associado à função
1. sem parâmetros (parâmetros void*)
2. com parâmetros:
1. passados por valor
2. passados por referência (endereço)
• Funções tipadas ou com retorno: devolvem um único
valor associado a execução da função, usando o comando
return.
1. sem parâmetros (parâmetros void*)
2. com parâmetros.
1. passador por valor
2. passados por referência (endereço)
Exemplos:
float *f; // f é um ponteiro para variáveis do tipo float
int *p; // p é um ponteiro para variáveis do tipo inteiro
char a, b, *p, c, *q; // pode declarar junto com variáveis de mesmo tipo
int menu();
float media_aritmetica(float n1, float n2, float n3);
float media_harmonica(float n1, float n2, float n3);
float media_geometrica(float n1, float n2, float n3);
Memória
2000
p1 2000 2004 Endereços
Após p1++
2004
p1 2000 2004
9 INF 01202 - Prof. Marcelo Walter – Aula 19
Aritmética de Ponteiros: exemplos
/* Programa para ilustrar algumas operações com ponteiros */
#include <stdio.h>
int main()
{
int i, *pi1, *pi2;
double d, *pd1, *pd2;
char c, *pc1, *pc2;
c = ‘A';
d = 5.423;
i = -20;
pi1 = &i;
pi2 = pi1+1; // incrementa o espaco ocupado por um inteiro (4 bytes)
pd1 = &d;
pd2 = pd1 + 2; // incrementa duas vezes o espaco ocupado por um double (2*8 bytes)
pc1 = &c;
pc2 = pc1 - 1; // decrementa o espaco ocupado por um char (1 byte)
printf("Resultados em hexadecimal\n");
printf("pi1: %p, pi2: %p\n", pi1, pi2);
printf("pd1: %p, pd2: %p\n", pd1, pd2);
printf("pc1: %p, pc2: %p\n\n", pc1, pc2);
printf("Resultados em decimal\n");
printf("pi1: %d, pi2: %d\n", pi1, pi2);
printf("pd1: %d, pd2: %d\n", pd1, pd2);
printf("pc1: %d, pc2: %d\n", pc1, pc2);
return 0;
}
10 INF 01202 - Prof. Marcelo Walter – Aula 19
Semelhanças entre Ponteiros e Vetores
• O nome de um vetor corresponde a um ponteiro constante, isto
é, ao ponteiro para o primeiro elemento.
• Em geral, as operações válidas para ponteiros podem ser
executadas com vetores.
• Assim, as notações abaixo são equivalentes:
com vetores equivale a com ponteiros
int v[100]; int *v;
v[i] ou *(v+i) *(v+i) ou v[i]
&v[i] v+i
declaração de vetor v
declaração do ponteiro v
de inteiros com 100
aponta para a posição inicial, mas
elementos indica que v é
não aloca área para isso.
um ponteiro que aponta
para o 1º elemento do
vetor (v[0]), alocando a
área necessária
int main()
{
int v[5];
int i;
printf("Leitura com acesso tipo ponteiro\n");
for (i = 0; i < 5; i++)
scanf("%d",v+i); // ja eh ponteiro, nao vai &
printf("\n");
return 0;
}
12 INF 01202 - Prof. Marcelo Walter – Aula 19
Diferença entre Ponteiros e Vetores
• Declaração de vetor:
– o compilador automaticamente reserva um bloco de
memória para que o vetor seja armazenado, do tamanho
especificado na declaração (mas não controla se o uso é
limitado à área reservada).
• Declaração de ponteiro:
– o compilador aloca um ponteiro para apontar para a
memória, sem reservar espaço de memória (usado para
alocação dinâmica de memória).
#define NUMELEM 5
void le_vetor(float vetor[ ], int num_vet) //leitura de um vetor de floats
{
int i; // variável local, para auxiliar leitura
printf(“entre os %d valores do vetor, separados por espaços\n”,num_vet);
for (i=0; i < num_vet; i++)
scanf(“%f”,&vetor[i]);
}
Flexibilidade.
int main() Podemos variar o num
{
int i;
de elementos como
float vec[40]; necessário, dentro do
printf(“leitura de 5 elementos \n");
le_vetor(vec, NUMELEM);
máximo permitido (40
neste caso)
for (i=0; i < NUMELEM; i++)
printf(“%f ”, vec[i]);
return 0; void le_vetor(float *vetor, int num_vet)
}
14 Maneira
INF 01202 - Prof. Marcelo Walter – Aulaalternativa
19
Vetores e parâmetros de funções
Exemplo:
int main()
{
int maior, posicao;
int vec[MAXELEM];
maior = omaior(vec,5,&posicao);
printf(“O maior elemento do vetor eh %d na posicao %d\n”, maior, posicao);
return 0;
}