Você está na página 1de 48

Linguagem C – Ponteiros

Algoritmos e Estruturas de Dados I


Prof. Christiano Colen Venancio
UNIPAC 2007
Observações

■ Ponteiros são também, antes de tudo, variáveis.


Logo, pode-se realizar operações com elas, isto é,
como por exemplo, p = p + 10;. Entretanto, neste
caso a operação + não é a operação usual de
adição. Se o valor de p é 3000, na aritmética
convencional o resultado da operação seria 3010.

Christiano Colen
UNIPAC - 2007
Observações
■ Quando um inteiro é adicionado ou subtraído de
um ponteiro, o valor do ponteiro não é
aumentado ou diminuído por aquele inteiro, mas
sim por aquele inteiro vezes o tamanho do
objeto apontado pelo apontador.
■ Por exemplo, supondo que um inteiro ocupa 2
bytes, a operação p = p + 10; quando p vale
3000, resultaria em algo como 3000 + 2*10.
Christiano Colen
UNIPAC - 2007
Operadores de apontadores
■ Existem dois operadores para manipular
ponteiros: * e &.
■ O operador & é um operador que retorna o
endereço de memória do seu operando.
■ O operador * é um operador que retorna o
conteúdo da variável localizada no endereço
(ponteiro) do operando, ou seja, devolve o
conteúdo da variável apontada pelo operando.
Christiano Colen
UNIPAC - 2007
Operadores de apontadores
■Para atribuir o endereço de uma variável
para um apontador utiliza-se o operador &
antes da variável.
<Nome do Ponteiro> = & <Nome da
Variável>;

Christiano Colen
UNIPAC - 2007
Operadores de apontadores
■Para atribuir o conteúdo apontado por
ponteiro para uma variável utiliza-se o
operador * antes da variável. Essa forma de
obter o conteúdo de uma variável apontada
por um ponteiro é dita indireta.
<Nome da Variável > = * <Nome do
Ponteiro >;

Christiano Colen
UNIPAC - 2007
Operadores de apontadores
■Pode-se igualar dois ponteiros. Ao fazer
essa atribuição, os dois ponteiros
envolvidos estarão apontando para o mesmo
lugar.
<Nome do Ponteiro 1 > = <Nome do
Ponteiro2 >;

Christiano Colen
UNIPAC - 2007
Operadores de apontadores
■ Pode-se também atribuir o conteúdo de um
apontador ao conteúdo de outro.
*<Nome do Ponteiro 1 > = *<Nome
do Ponteiro2 >;

Christiano Colen
UNIPAC - 2007
Incremento e decremento de
ponteiros
■ Quando se incrementa um ponteiro ele
passa a apontar para o próximo valor do
mesmo tipo para o qual o ponteiro aponta.
Isto é, se um ponteiro para um inteiro é
incrementado, ele passa a apontar para o
próximo inteiro. Esta é mais uma razão pela
qual o compilador precisa saber o tipo base
de um ponteiro.

Christiano Colen
UNIPAC - 2007
Incremento e decremento de
ponteiros
■ Por exemplo, ao incrementar um ponteiro char*
ele anda 1 byte na memória, ao incrementar um
ponteiro double* ele anda 8 bytes na memória.
O decremento funciona da mesma forma.
■ <Nome do Ponteiro>++; //incrementa

OU
■ <Nome do Ponteiro> – – ;
//decrementa
Christiano Colen
UNIPAC - 2007
Incremento e decremento de
ponteiros
■ (*<Nome do Ponteiro>)++;
//incrementa o conteúdo da
variável apontada pelo ponteiro
ou
■ (*<Nome do Ponteiro>) – – ;

//decrementa o conteúdo da
variável apontada pelo ponteiro

Christiano Colen
UNIPAC - 2007
Funções e Procedimentos
O que é um Módulo?
■ Um módulo nada mais é do que um grupo de
instruções que constitui um trecho de algoritmo com
uma função bem definida e o mais independente
possível das demais partes do algoritmo. Cada
módulo, durante a execução do algoritmo, realiza
uma tarefa específica da solução do problema e, para
tal, pode contar com o auxílio de outros módulos do
algoritmo.
■ Desta forma, a execução de um algoritmo contendo
vários módulos pode ser vista como um processo
cooperativo. Christiano Colen
UNIPAC - 2007
Tipos de Módulos
■ Há dois tipos de módulos:
– Função: sempre retorna um e apenas um valor
ao algoritmo que lhe chamou. Cada função tem
associada ao seu valor de retorno um tipo
explícito. Da mesma maneira com que os
parâmetros são fixos para todas as chamada o
retorno também é fixo. Ela pode ser vista como
uma expressão que é avaliada para um único
valor, sua saída, assim como uma função em
Matemática.
Christiano Colen
UNIPAC - 2007
Tipos de Módulos
– Procedimento: é um tipo de módulo usado para
várias tarefas, não produzindo valores de saída,
ou seja, nunca retornam valores. Em algumas
linguagens não existem explicitamente (como
na linguagem C).

Christiano Colen
UNIPAC - 2007
Criando Funções
< tipo_de_retorno> < nome_da_função>
( parâmetro1;...; ...parâmetron)
{ //declaração das variáveis locais
<conjunto instruções da função>
return <valor_de_retorno> ;
}

Christiano Colen
UNIPAC - 2007
Retorno da função
return ( <expressão> ); // retorna o
valor da expressão
return <expressão> ; // retorna o
valor da expressão
return;

Christiano Colen
UNIPAC - 2007
Exemplo
int Quadrado (int num)
{
int res;
res = num*num;
return res;
}

Christiano Colen
UNIPAC - 2007
Exemplo Procedimento
void Apresentacao ( char programador[50], char
objetivo[50])
{
printf(“\n----------------------------------------------------”);
printf(“\n Este algoritmo foi desenvolvido por: %s”,
programador);
printf(“\n Objetivo do algoritmo: %s”, objetivo );
printf(“\n Pressione qualquer tecla para continuar a
execução do programa...”);
printf(“\n--------------------------------------------”);
getch( ); } Christiano Colen
UNIPAC - 2007
Usando Funções e Procedimentos
■ Em um programa na linguagem C, devemos
declarar os protótipos dos módulos antes de
usá-los, e antes do módulo principal (Main).
■ A declaração do corpo do módulos virá
após o módulo principal.

Christiano Colen
UNIPAC - 2007
Exemplo
//Declaração das Bibliotecas
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define nome “Fulano de Tal”;
#define descricao “Soma do Quadrado”;
typedef char cadeia[50];
//prototipação dos módulos
void Apresentacao ( cadeia programador, cadeia
objetivo) ;
int Quadrado (int num);
Christiano Colen
UNIPAC - 2007
// função principal
int main( )
{ int x, y, soma;
Apresentacao(nome, descricao);
do{ printf( “\n Digite um número positivo:” );
scanf(“%d”, &x);
}while ( x < 0 );
do{ printf( “\n Digite um número positivo:” );
scanf(“%d”, &y);
}while ( y < 0 );
soma = Quadrado( x ) + Quadrado(y);
printf( “\n Soma dos quadrados : %d”, soma);
Christiano Colen
system(“PAUSE”); returnUNIPAC(0);} - 2007
//Especificação do corpo das funções
void Apresentacao ( cadeia programador, cadeia objetivo)
{clrscr( );
printf(“\n------------------------------------------------------------
-------------------”);
printf(“\n Este algoritmo foi desenvolvido por: %s”,
programador);
printf(“\n Objetivo do algoritmo: %s”, objetivo );
printf(“\n Pressione qualquer tecla para continuar a
execução do programa...”);
printf(“\n------------------------------------------------------------
-------------------”);
getch( ); } Christiano Colen
UNIPAC - 2007
int Quadrado (int num)
{
int res;
res = num*num;
return res;
}

Christiano Colen
UNIPAC - 2007
Passagem de Parâmetros
■ Passagem por Valor :Os valores dos
parâmetros passados por valor são passados
por um mecanismo denominado cópia. O
valor do parâmetro (uma constante ou o
valor de uma variável ou expressão) é
atribuído ao parâmetro quando da chamada
do procedimento/função.

Christiano Colen
UNIPAC - 2007
Passagem de Parâmetros
■ Passagem por Referência:A passagem por
referência ocorre quando alterações nos
parâmetros, dentro da função, alteram os valores
das variáveis que foram passadas para a função.
Este nome vem do fato de que, neste tipo de
chamada, não se passa para a função o valor das
variáveis, mas sim suas referências (a função usa
as referências para alterar os valores das
variáveis, que foram passadas como parâmetro,
fora da função). Christiano Colen
UNIPAC - 2007
Exemplos
■ Passagem por valor: Quadrado,
Apresentação

Christiano Colen
UNIPAC - 2007
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//prototipação das funções
void Troca ( int * a, int *b);

Christiano Colen
UNIPAC - 2007
int main( )
{
int num1, num2;
printf("Entre com 2 números inteiros: ");
scanf("%d %d", &num1, &num2);
printf("\n num1=%d e num2=%d", num1, num2);
Troca(&num1, &num2);
printf("\n num1=%d e num2=%d", num1, num2);
system(“PAUSE”);
return(0);
}

Christiano Colen
UNIPAC - 2007
void Troca (int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}

Christiano Colen
UNIPAC - 2007
Observação
■ Neste último exemplo, o que está
acontecendo é que passamos para a função
Troca o endereço das variáveis num1 e
num2. Estes endereços são copiados nos
ponteiros a e b. Através do operador ‘*’
estamos acessando o conteúdo apontado
pelos ponteiros e modificando-o. Este
conteúdo corresponde aos valores
armazenados em num1 e num2, que,
portanto, estão sendo modificados.
Christiano Colen
UNIPAC - 2007
Registros
Definição
■ Um registro é uma estrutura de dados que agrupa
dados de tipos distintos ou, mais raramente, do
mesmo tipo. Um registro de dados é composto
por um certo número de campos de dados, que
são itens de dados individuais.
■ Os tipos registros devem ser declarados ou
atribuídos antes das variáveis, pois pode ocorrer a
necessidade de declarar uma variável com o tipo
registro anteriormente declarado.
Christiano Colen
UNIPAC - 2007
Sintaxe
Defina Tipo
REGISTRO
< tipo do campo1 > < campo1 >,
< tipo do campo2 > < campo2 >,
...
< tipo do campon > < campon >
FIM-REGISTRO nome do tipo
Christiano Colen
UNIPAC - 2007
Exemplo
Defina Tipo
REGISTRO
caracter nome= vetor [40],
real nota1,
real nota2,
real media
FIM-REGISTRO NOTAS_ALUNOS
Variáveis
NOTAS_ALUNOSChristiano
aluno Colen
UNIPAC - 2007
Registros em C
■ Na linguagem C, uma estrutura é uma coleção
itens de dados, possivelmente de tipos diferentes,
referenciadas com um nome, provendo um meio
conveniente de manter juntas informações que
estão relacionadas. Este certo número de itens de
dados é chamado membro da estrutura.

Christiano Colen
UNIPAC - 2007
Registros em C
■ Em várias outras linguagens de
programação, uma estrutura é chamada de
registro e um membro é chamado de campo.
■ Uma estrutura é um tipo de dado cujo
formato é definido pelo programador. Em
C, a palavra reservada struct informa ao
compilador que um tipo de dado está sendo
declarado.
Christiano Colen
UNIPAC - 2007
Exemplo
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct {
char nome[40];
float nota1;
float nota2;
float media;
} NOTAS_ALUNOS;
Christiano Colen
UNIPAC - 2007
int main ( )
{/* Informa que o identificador NOTAS_ALUNOS é
sinônimo do especificador da estrutura anterior,
onde quer que NOTAS_ALUNOS ocorra. */
NOTAS_ALUNOS aluno1, aluno2, aluno3;
return (0);
system(“PAUSE”);
}

Christiano Colen
UNIPAC - 2007
Acessando membros da
Estrutura em C
■ Assim que uma variável é declarada como
uma estrutura, cada membro dessa variável
pode ser acessado, especificando-se o nome
da variável e o identificador do membro do
item, separados por um ponto.
< Variável estrutura> . <nome do membro >;

Christiano Colen
UNIPAC - 2007
Acessando membros da
Estrutura em C
■ Se o registro é um parâmetro de uma
função, o mesmo é sempre passado por
referência, assim como vetores e matrizes.
Logo, a maneira de acessar um membro da
estrutura será da seguinte forma:
< Variável estrutura> <nome do membro >;

Christiano Colen
UNIPAC - 2007
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//Definição dos Tipos
typedef struct {
char nome[40];
float nota1;
float nota2;
float media;
} NOTAS_ALUNOS;

Christiano Colen
UNIPAC - 2007
int main ( )
{
NOTAS_ALUNOS aluno;
printf ("Cadastro de aluno\n ");
printf ("Informe o nome ...........: ");
gets (aluno.nome);
printf ("Informe a 1a. nota .......: ");
scanf ("%f ", &aluno.nota1);
printf ("Informe a 2a. nota .......: ");
Christiano Colen
UNIPAC - 2007
scanf ("%f ", &aluno.nota2);
aluno.media = (aluno.nota1+ aluno.nota2)/2.0;
printf ("Nome........................: %s \n" , aluno.nome);
printf ("Nota 1.......................: %5.2f \n" , aluno.nota1);
printf ("Nota 2.......................: %5.2f \n" , aluno.nota2);
printf ("Media.......................: %5.2f \n" , aluno.media);
system(“PAUSE”);
return (0);
}
Christiano Colen
UNIPAC - 2007
Vetores de Registro
■ A grande força dos registros reside no uso
deles combinado com vetores. Por exemplo,
um grupo de 100 alunos iria requerer um
conjunto de 100 variáveis registros, o que
pode ser conseguido através da criação de
um vetor de 100 elementos do tipo registro
em questão.

Christiano Colen
UNIPAC - 2007
Vetores de Registro
■ Um vetor de registros é criado da mesma
forma que criamos vetores de qualquer um
dos tipos que aprendemos até então.

Christiano Colen
UNIPAC - 2007
Vetores de Registro
■ Declaração:
typedef struct {
char nome[50];
float nota;
float media;
} NOTAS_ALUNOS;
■ NOTAS_ALUNOS Alunos[40];

Christiano Colen
UNIPAC - 2007
Acessando os elementos
■ Alunos[0].nome= “Christiano”
■ Alunos[0].nota = 10.0;
■ Alunos[0].media = 10.0;

Christiano Colen
UNIPAC - 2007

Você também pode gostar