Solon Tavares
Técnico em Gerenciamento de Redes
Técnico em Sistemas de Informação
Apostila da Disciplina de
Estruturas de Dados
Guaíba, 2007.
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
Sumário
CAPÍTULO 2 – EXPRESSÕES
2.1. DADO, INSTRUÇÃO E PROGRAMA
2.2. TIPOS DE DADOS
2.3. VARIÁVEIS
2.4. IDENTIFICADORES DE VARIÁVEIS EM C
2.5. CONSTANTES
2.6. ATRIBUIÇÃO
2.7. OPERADORES ARITMÉTICOS
2.8. OPERADORES RELACIONAIS
2.9. OPERADORES LÓGICOS
2.10. OPERADOR BIT A BIT
2.11. OPERADOR ?
2.12. OPERADORES DE PONTEIROS & E *
2.13. OPERADOR SIZEOF
2.14. OPERADORES PONTO (.) E SETA (->)
2.15. PRECEDÊNCIA
2.16. CASTS
2.17. PARÊNTESES E ESPAÇAMENTOS
EXERCÍCIOS
CAPÍTULO 7 – PONTEIROS
7.1. ARITMÉTICA DE PONTEIROS
7.2. PONTEIROS PARA VETORES
7.3. PONTEIROS PARA VETORES
7.4. CUIDADOS COM PONTEIROS
CAPÍTULO 8 – FUNÇÕES
8.1. ARGUMENTOS DE FUNÇÕES
8.2. COMANDO RETURN
BIBLIOGRAFIA
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
Objetivo
Esta apostila foi construída com o intuito de facilitar o ensino da linguagem de
programação C, a ser aplicado na disciplina de Estruturas de Dados do segundo módulo na Escola
Solon Tavares. Poderemos acompanhar o conteúdo através dela, a qual será composta pelos
comandos básicos de C e muitos exemplos e exercícios, pois sem a prática da programação, o
ensino e a compreensão se tornam mais complexo.
1. Conceitos básicos
1.1. Introdução
A linguagem C foi criada por Dennis Ritchie, implementada em UNIX. O nome da
linguagem se deve a uma linguagem anterior que tinha o nome de B. A linguagem segue um
padrão estabelecido em 1983 pelo ANSI (American National Standards Institute). C é considerada
uma linguagem de médio nível, podendo trabalhar com bits, bytes e endereços.
Códigos escritos em C são altamente portáveis, ou seja, programas aplicados em um
sistema operacional funcionarão normalmente em outros sistemas operacionais, com pouca ou
nenhuma alteração. O C é uma linguagem estruturada, ou seja, um programa pode ser dividido em
varias sub-rotinas (mini-programa), onde cada sub-rotina cria suas próprias variáveis e executa
determinada função.
Quando você cria um programa em C, você obtêm o código-fonte, mas para esse
programa ser executado pela máquina é necessário compila-lo. Um compilador tem como função
ler um código-fonte e através da conversão deste criar um código-objeto, então este código-objeto
(também conhecido como código-binário ou código de máquina) pode ser executado pela máquina.
Em Estruturas de Dados serão discutidas diversas técnicas de programação, introduzindo
os conceitos básicos da linguagem de programação C, que serão utilizadas para a implementação
das estruturas de dados apresentadas. A linguagem C tem sido amplamente utilizada na
elaboração de programas e sistemas nas diversas áreas em que a informática atua.
Utilizaremos nas aulas de programação C o sistema operacional Kubuntu GNU/Linux, os
programas serão digitados no Editor de texto Kate e o programa será compilado e executado
através do Konsole. Para quem preferir programar no Windows há uma ferramenta muito boa, na
qual você edita o código fonte, compila e também executa, chamado de Devc++.
Se não houver erro de compilação no arquivo fonte, será gerado um executável com nome
prog. Podemos então executar o programa da seguinte forma:
>./prog
1.4. Implementação
Tradução do algoritmo para linguagem de programação. Programa é um roteiro que orienta
o computador, mostrando-lhe a seqüência de operações necessárias para executar uma
determinada tarefa.
#include<stdio.h>
main() {
bloco de comandos;
}
- #include<stdio.h>: esta linha mostra ao compilador que será usado o arquivo cabeçalho
stdio.h. Este arquivo contém declarações de funções úteis de entrada e saída de dados (std =
standard, padrão em inglês, io = input/output, entrada/saída em inglês).
- main: define o inicio da execução em um programa C. É a única função obrigatória em
qualquer programa C e é uma palavra reservada da linguagem.
- { }: indicam, respectivamente, o inicio e o termino da função main.
- ( ): contem os parâmetros da função (se existir).
- a palavra reservada main, os parênteses e as chaves são os únicos elementos
obrigatórios.
- as palavras reservadas têm um significado pré-definido na linguagem.
Podem-se inserir comentários no código fonte, iniciados com /* e finalizados com */, assim
como pode ser utilizado também o // (mas este só comenta a linha correspondente). Declarações e
comandos em C são terminados pelo caractere ponto-e-vírgula (;).
2. Expressões
A combinação de variáveis, constantes e operadores constituem uma expressão.
Os tipos short int e long int podem ser referenciados simplesmente com short e long,
respectivamente. O tipo int isolado é mapeado para o tipo inteiro natural da maquina, que pode ser
short ou long.
2.3. Variáveis
• Correspondem a uma posição de memória;
• conteúdo pode variar ao longo do tempo;
• armazenam um só valor por vez;
• armazenam valores de um só tipo (logo, tem tipo definido);
• devem ser declaradas antes de serem utilizadas;
• valor inicial imprevisível (posição de memória);
Uma variável é uma entidade que possui um valor, sendo conhecida no programa por um
nome (identificador). As variáveis são declaradas em três lugares básicos: no campo de
parâmetros de funções, no início de funções e fora de todas as funções.
Variáveis Locais: são declaradas dentro de uma função, somente esta função tem acesso direto a
elas, as variáveis locais deixam de existir quando a função finaliza sua execução. As variáveis
locais devem ser declaradas sempre que inicia-se um bloco de comandos, antes de qualquer
instrução do programa.
Variáveis Globais: normalmente são definidas no inicio do arquivo-fonte, devendo estar fora de
qualquer função. Podem ser acessadas diretamente por qualquer função subseqüente, existem
permanentemente e guardam seus valores enquanto o programa existir.
Forma geral para declaração de variáveis:
tipo lista_de_variáveis;
Exemplo:
int reta, curva, a, b;
char nome, turma;
short int lado;
2.5. Constantes
As constantes se caracterizam por valores fixos que não podem ser alterados. As
constantes satisfazem os cinco tipos de dados em C, variando sua representação de acordo com o
tipo. Para números inteiros e ponto flutuante basta colocar o valor (p.e.: 7, -2.13, 25423).
Constantes do tipo caractere são envolvidas por aspas simples (p.e.: ‘a’, ‘A’, ‘!’). Constantes do tipo
string são representadas entre aspas duplas (p.e.: “ola”, “ola novamente amigo”). Constantes em
octal são representadas com um 0 na frente (e seguidas de 0 a 7) e constantes em hexadecimal
são representadas com um 0x na frente ( e seguidas de 0 a 9 ou de a até f).
2.6. Atribuição
A operação de atribuição especifica que a uma variável será dado um valor ou o resultado
de uma expressão. A atribuição em C é indicada pelo símbolo de igualdade ‘=’. O lado esquerdo da
igualdade será o destino do valor e deve ser uma variável ou um ponteiro, o lado direito pode ser
uma constante, uma expressão ou uma variável.
Exemplo:
variável = expressão; // variável recebe valor da expressão
a = 5; /* armazena o valor 5 em a */
c = 10.3; /* armazena o valor 10.3 em c */
a = b = c = 10; // todas as variáveis recebem o valor 10
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Módulo (devolve o resto da divisão inteira, e só aceita operandos inteiros).
++ Incremento
-- Decremento
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
Exemplo:
c=a+b; /* armazena a soma do conteúdo de a e b em c */
i=i+2; // variável i recebe conteúdo de i + 2
n++; // n recebe n + 1;
n--; // n recebe n – 1;
Exemplo:
x += 10; // é igual a x = x + 10;
y *= (10 + 25); // é igual a y = y * (10 + 25)
2.11. Operador ?
O operador ternário ? é utilizado para substituir uma instrução de desvio condicional como
if-then-else. Sua forma geral é:
Onde expressão1 é a expressão que está sendo testada, se ela for verdadeira a
expressão2 será validada, caso contrário a expressão3 será validada.
Exemplo:
resultado = (nota>6) ? 10 : 0; // resultado recebe 10 ou 0
pt = &auxiliar;
A declaração de variáveis ponteiros é diferente das outras, pois devem receber o símbolo *
antes do nome da variável. De acordo com o tipo de dados que for apontado por um ponteiro, este
deverá corresponder ao tipo declarado.
Exemplo:
float *pt; // este ponteiro irá apontar dados do tipo ponto flutuante
char *ch; // já este irá apontar dados do tipo caractere
Exemplo:
int a;
char b;
a = sizeof (float); // armazena o valor 4 em a
a = sizeof b;
Exemplo:
struct solon {
char nome[30];
float nota;
}est;
struct solon *pt = &est; // ponteiro pt recebe endereço da estrutura (est)
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
2.15. Precedência
Maior precedência () [] ->
! ++ --
* / %
+ -
< <= > >=
== !=
&&
|| Menor precedência
2.16. Casts
Quando utilizamos tipos de dados diferentes em expressões, o compilador faz conversões
de operandos que possuem tamanho menor em maiores, se existirem na expressão, porém,
podemos garantir um tipo de dado final da expressão com Casts. Este comando irá forçar uma
expressão a ser de determinado tipo. Onde tipo é qualquer tipo de dado válido em C. Sua forma
geral é:
(tipo) expressão;
Exercícios:
Resolva as expressões abaixo e descubra se o resultado é 1 (Verdadeiro) ou 0 (Falso).
a) 10 > 3
b) 10 != 10
#include <stdio.h>
3.2. printf
Esta função escreve dados no vídeo e sua forma geral é:
printf (“string_de_controle”,lista_de_argumentos);
A string_de_controle descreve o que a função printf( ) vai imprimir na tela. Ela mostra não
somente a mensagem que deve ser colocada na tela, mas também quais as variáveis e suas
respectivas posições, isto é feito usando-se os códigos de controle que usam a notação %. Na
string de controle indicamos quais, de qual tipo e em que posições estão as variáveis a serem
impressas. Para cada código de controle deve haver uma variável na lista_de_argumentos, estes
dois são combinados na ordem da esquerda para a direita.
Exemplo:
int b = 8;
float a = 10.4;
printf(“\n\tO inteiro eh %d e o real eh %f \n”, b, a);
//será impresso no Konsole “O inteiro eh 8 e o real eh 10.4”(sem aspas)
printf(“\n Ola,eu estou vivo!”);
// será impresso no Konsole “Ola,eu estou vivo!”
3.3. scanf:
Responsável pela entrada de dados via Konsole, sua forma geral é:
scanf(“string_de_controle”,lista_de_argumentos);
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
Exemplo:
scanf(“%20s”,str); // irá ler apenas os 20 primeiros caracteres digitados
4. Comandos de controle
Em C encontramos dois comandos de desvio condicional, esse desvio depende do teste de
uma expressão, resultando em um valor verdadeiro ou falso, porém, não encontramos esses
resultados em C, mas sim valores iguais ou diferentes de zero. Para qualquer valor diferente de
zero consideramos que a resposta é verdadeira, já um valor falso é representado pelo valor 0.
if(condição) {
comando ou bloco de comandos;
}
ou
if(condição) {
bloco de comandos do if;
}
else {
bloco de comandos do else;
}
O uso de comandos if aninhados (em cascata) é válido e muito usado. Conforme veremos
no exemplo:
if (expressão) {
if (expressão)
comando;
if (expressão)
comando;
else
comando; }
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
if (expressão)
comando;
else if (expressão)
commando;
else if (expressão)
commando;
...
else
commando;
switch(variável ou expressão) {
case constante1:
comando1;
break;
case constante2:
comando2;
break;
.... ....
.... ....
case onteúdo n:
comandoN;
break;
default:
comando_default;
break;
}
O switch testa a variável (ou expressão) contra os valores especificados nos comandos
case e executa o comando (ou bloco de comandos) cujo case coincidiu com o valor da variável ou
expressão, esses comandos serão executados até que seja encontrado o comando break ou o fim
do comando switch. A declaração default é opcional e será executada apenas se a variável (ou
expressão) que está sendo testada não for igual a nenhuma das constantes pré-estabelecidas nos
case. O case não pode existir fora do comando switch.
O break é um comando de desvio em C, faz com que o switch seja interrompido passando
a execução do programa a partir da próxima linha de comando após o fecha chaves do switch. O
comando break é muito utilizado em laços.
Duas constantes case no mesmo switch não podem possuir o mesmo valor, à exceção de
um switch dentro de outro. No caso de constantes caracteres, estas devem estar entre aspas
simples, e elas são automaticamente convertidas para seus valores correspondentes inteiro de
acordo com a tabela ASCII.
É possível ter instruções case sem nenhum comando associado, porém, quando isto
acontece a execução do programa cai no próximo case. É importante deixar claro que todo o
comando switch forma um bloco de comandos e os comandos associados a cada case são uma
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
seqüência de comandos, ou seja, variáveis locais são declaradas no início de blocos de comandos
e não podem ser declaradas dentro dos comandos associados aos cases.
Exemplo1:
#include<stdio.h>
int main( ) {
int contador;
for(contador=1;contador<=100;contador++)
printf(“\n Não devo conversar em aula”);
}
inicialização
if (condição) {
comando; // ou bloco de comandos
incremento;
“volte para o comando if”
}
Exemplo2:
for (i=100; i>0; i=i-1)
printf(“\n %d ”, i);
No exemplo 2 será impresso todos os valores inteiros entre os números 100 e 1, na ordem
decrescente de unidade em unidade, até que o valor 0 seja atingido no contador (i) e interrompa a
execução do looping.
Exemplo3:
for (i=0; i>0; i=i+5)
printf(“\n Oi ”);
Neste exemplo 3 não será impresso nenhuma vez a mensagem “Oi”, pois o laço é
inicializado com 0 e a condição exige que este valor seja maior que zero..
Exemplo4:
for (i=0; i!=666; )
scanf(“%d”, &i);
Conforme demonstrado no exemplo 4, partes da definição do laço for não precisam existir.
O programa inicializa a variável i com 0 e testa se ela é diferente de 666, enquanto o usuário não
digitar este último valor o laço continuará em execução, sem que seja feito nenhuma operação de
incremento na repetição do laço.
Exemplo5:
for ( ; ; )
printf(“ Looping Infinito”);
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
while (condição)
comando; // ou bloco de comandos entre chaves
Ele faz com que o laço (comando ou bloco de comandos) sejam executados enquanto a
condição for verdadeira, onde a condição verdadeira será sempre que for um valor diferente de
zero. Quando a condição for falsa, a execução do programa passa para o próximo comando após
o bloco de comandos do laço while.
O while seria equivalente a:
if(condição) {
comando;
“volte para o comando if”
}
O while tem a mesma característica que o laço for referente a verificação condicional, que
sempre é feita no inicio do laço.
Exemplo:
#include<stdio.h> // imprime o numero de i de 0 ate 99
int main( ) {
int i=0;
while(i<100) {
printf(“ %d “,i);
i++; }
}
do {
comando ou bloco de comandos;
}while(condição);
Este laço repete o comando ou bloco de comandos até que a condição seja falsa, ou seja,
até que o valor condicional resultante seja zero. Para esta instrução, procure sempre utilizar as
chaves, mesmo que tenha apenas um comando, a fim de evitar confusões futuras.
Exemplo:
do {
scanf(“%d”, &valor);
} while( (valor >= 1) && (valor <= 100) )
O exemplo acima demonstra um código que lerá do teclado um valor, enquanto este valor
estiver compreendido entre 1 e 100, ele continuará lendo novos valores, quando for digitado um
valor maior que 100 ou menor que 1 o laço interrompe a execução.
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
return expressão;
É importante enfatizar que em funções do tipo void não poderá ser utilizado o comando
return.
Comando goto
Comando de desvio incondicional, normalmente não utilizado em C devido a ilegibilidade
do código fonte. Utilizando este comando você define um rótulo, este rótulo você coloca em outra
parte do programa seguido de dois pontos “:”, definindo ali o ponto de salto (destino) do programa.
Sua forma geral é a seguinte:
goto rótulo;
...
...
rótulo:
Comando break
Conforme estudado no comando switch, o comando break é utilizado para interromper a
execução dos comandos dentro de um case, assim como interromper a continuidade de execução
de um laço.
Função exit()
Utilizando a função exit() você sai imediatamente de um programa. Sua forma geral é:
exit(código_de_retorno);
Onde código_de_retorno contém um valor inteiro, se este valor for 0 (zero) significa para o
sistema operacional que o programa teve uma terminação normal, já outros valores normalmente
indicam algum tipo de erro.
Exercícios:
1) Faca um programa que receba hora e minuto inicial e final de uma partida de tênis, a duração do
jogo não pode ultrapassar 60 minutos. O programa deve calcular a duração do jogo, considere que
o jogo pode começar em um dia e acabar somente no outro.
2) Faça um programa que simule uma calculadora padrão, com as operações ‘+’ soma, ‘-‘
subtração, ‘*’ multiplicação e ‘/’ divisão. Inicialmente o programa deve pedir a operação ao usuário,
após o usuário deve entrar com os 2 operandos. Ao final, o programa deve imprimir a resposta.
3) Faça um programa que receba um valor n inteiro e calcule seu fatorial. O programa deve
imprimir a resposta.
4) Faça um programa que continue em execução enquanto não receber um valor múltiplo de 7,
assim que for digitado um valor correto o programa deverá encerrar sua execução.
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
5) Escreva um programa que descubra se três valores recebidos estão ou não em ordem
crescente.
6) Escreva um programa que mostre na tela o conceito conforme a nota obtida, de acordo com a
tabela seguinte:
De 9,0 a 10,0 A
De 7,5 a 9,0 B
De 6,0 a 7,5 C
De 4,0 a 6,0 D
De 0,0 a 4,0 E
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
5. Vetores e Matrizes
Vetores e matrizes são conjuntos de variáveis que são referenciados pelo mesmo nome, e
trabalham com o mesmo tipo de dados. Para ter o acesso a essas diferentes variáveis é
necessário utilizar índices. Esses índices atuam como deslocamentos na memória a partir de um
endereço inicial. Vetores e matrizes em C utilizam uma parte contígua da memória, onde o primeiro
índice corresponde ao endereço mais inferior e o ultimo índice corresponde ao endereço superior
da memória.
5.1. Vetores
A forma geral para declarar um vetor em C é a seguinte:
tipo_de_dado nome_da_variavel[tamanho];
Assim como as variáveis, vetores também devem ser declarados. Esta declaração reserva
um espaço na memória suficientemente grande para armazenar o número de células especificadas
por tamanho, onde está especificado quantos elementos o vetor poderá guardar. No campo
tipo_de_dado será escolhido um dos tipos de dados da linguagem C (inteiro, real, caracter). O
nome_da_variavel é o identificador do vetor. Na linguagem C, a numeração dos índices de um
vetor ou matriz inicia sempre em zero, ou seja, o primeiro elemento sempre será referenciado pelo
índice 0. Isto significa que, no exemplo abaixo, os dados serão indexados de 0 a 29.
Exemplo1:
int num[30]; // declara vetor do tipo inteiro que poderá armazenar até 30 valores
Em C não é verificado se o índice usado está dentro dos limites válidos. Este é um cuidado
que o programador deve tomar, caso contrário há risco de haver variáveis sobre-escritas ou de
escrever no próprio código do programa.
Vetores e matrizes podem ser passados como parâmetros para funções, porém, não é
todo o vetor que será passado, mas sim um ponteiro para o primeiro elemento do vetor. Para isso
você deve passar como parâmetro apenas o nome do vetor, sem colocar o índice.
A função que está sendo chamada, que irá receber o ponteiro para o primeiro elemento do
vetor nota, deve estar preparada para isso. A variável que vai receber este parâmetro poderá ser
declarada de três formas distintas, conforme o exemplo a seguir:
float mat[4][3];
tipo_da_variavel nome_da_variavel[linha][coluna];
No exemplo acima, a cada vez que for executado o primeiro comando for, será executado
todas as vezes possíveis o segundo laço for. Será executado esse conjunto de laços até que a
condição do primeiro laço for seja falsa.
6. Cadeia de Caracteres
6.1. Caracteres
Os caracteres são representados por códigos numéricos. A correspondência entre os
caracteres e seus códigos numéricos é feita por uma tabela de códigos. Em geral, usa-se a tabela
ASCII, mas diferentes máquinas podem usar diferentes códigos.
Em C, a diferença entre caracteres e inteiros é feita apenas através da maneira pela qual
são tratados. Por exemplo, podemos imprimir o mesmo valor de duas formas diferentes usando
formatos diferentes. Um constante caractere é escrito envolvendo o caractere com aspas simples.
Assim, a expressão ‘a’ representa um constante caractere e resulta no valor numérico associado
ao caractere a.
char c = ‘a’;
printf(“%d %c\n”, c, c);
#include<string.h>
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
char a;
scanf(“%c”, &a);
puts(<var_string>);
Esta função escreve o seu argumento no dispositivo padrão de saída (vídeo), colocando
um ‘\n’ (um salto de linha) no final.
gets(<var_string>);
Esta função é utilizada para leitura de uma string através do dispositivo padrão, até que a
tecla ENTER seja pressionada. A função gets() não testa limites do vetor em que é chamada.
Exemplo1:
main() {
char str1[80];
printf(“Entre com um string:\n”);
gets(str1);
printf(“O string lido foi:\n”);
puts(str1);
printf(“Entre com uma palavra:\n”);
scanf(“%s”,str1);
printf(“A palavra lida foi: %s”,str1);
}
printf(“%s\n”,s);
Assumimos que a cadeia que receberá a cópia tem espaço suficiente para que a operação
seja realizada. Salientamos a necessidade de “fechar” a cadeia copiada após a cópia dos
caracteres não nulos. Quando o laço for terminar, a variável i terá o índice de onde está
armazenado o caractere nulo na cadeia original. A cópia também deve conter o ‘\0’ nesta posição.
strcpy(<string1>,<string2>);
strlen(<string>);
strcat(<string1>,<string2>);
strcmp(<string1>,<string2>);
Observações:
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
Exemplo6:
main() {
char str1[100],str2[100],str3[100];
//inicializa um string com uma constante
strcpy(str1,“uma constante string”);
//copia o onteúdo de um string noutro
strcpy(str2,str1);
//concatena um texto ao fim de str1
strcat(str2,“que foi concatenada com outra”);
//inicializa o string str3
strcpy(str3,“uma constante string”);
//compara os tamanhos de strings
if(strlen(str1)==strlen(str3))
printf(“str1 tem o mesmo tamanho de str3\n”);
else
printf(“str1 não tem o mesmo tamanho que str3\n”);
//compara os strings str1 e str2
if(strcmp(str1,str2)==0)
printf(“str1 e str2 sao iguais\n”);
else if(strcmp(str1,str2)<0)
printf(“str1 eh menor que str2\n”)
else
printf(“str1 eh maior que str2\n”)
}
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
7. Ponteiros
Ponteiros são variáveis que contém um endereço de memória, normalmente este endereço
é a posição de uma outra variável na memória. Para declarar variáveis ponteiros o programador
deve colocar o ‘*’ (asterisco) antes do nome da variável, conforme a seguir:
tipo_de_valor_apontado *nome;
pt = &auxiliar;
Exemplo1:
int *pt, vet[5];
pt=vet; // pt recebe ponteiro para primeiro elemento do vetor
pt[4]=10; // atribuição usando índice do ponteiro
*(pt+4)=10; // atribuição usando aritmética de ponteiros
Um ponteiro assim que é declarado, não aponta para um local de memória válido, então
por convenção, a maioria dos programadores atribui a ele o valor nulo (zero). Assim, qualquer
ponteiro que tiver o valor nulo, significará que ele não aponta para nada.
É importante salientar que qualquer ponteiro em C, pode ser indexado como um vetor,
usando os colchetes ‘[‘ ‘]’.
7.4. Cuidados com Ponteiros
Entre os erros mais difíceis de serem encontrados em C, está na utilização incorreta dos
ponteiros. Analise o exemplo a seguir:
Exemplo1: // programa incorreto
int main() {
int x=10, *pt;
*pt=x; // endereço apontado por pt recebe 10
}
Aí que está o perigo, estamos colocando um valor em alguma posição da memória, sendo
que não temos nem certeza se está posição é ou não válida, o ponteiro pt não recebeu um valor,
portanto ele possui lixo. Portanto, sempre antes de começar a utilizar um ponteiro procure
inicializá-lo, de forma que garanta que este ponteiro nunca irá sobrescrever o próprio código do
programa, ou a área de dados ou o sistema operacional.
Escola Solon Tavares - Estruturas de Dados Prof. Alan Malta Rodrigues
8. Funções
tipo_de_dado nome_da_função(lista_de_parametros) {
corpo da função ou bloco de comandos;
}
O campo tipo_de_dado especifica o tipo de dado que será retornado pela função, através
do comando return. Se o tipo de dado for void, significa que a função não retornará nenhum valor.
Se não for especificado nenhum tipo de dado de retorno, o compilador assumirá que será
retornado dado do tipo inteiro. O campo nome_da_funcao seque as mesmas regras para
identificadores de variáveis. A lista_de_parametros conterá declaração de variáveis separadas por
vírgula, essas variáveis serão utilizadas para receber os argumentos passados no momento que é
feito a chamada de função. Uma função que não for receber nenhum parâmetro, não precisará ter
variáveis na lista_de_parametros, mas obrigatoriamente deverá aparecer o abre e fecha
parênteses ‘(‘ ‘)’. No caso de declarar variáveis na lista_de_parametros devemos tomar uma
atenção especial, pois qualquer variável deverá ser precedida pelo seu tipo, conforme o exemplo a
seguir:
Se for necessário passar argumentos a uma função, ela deverá conter variáveis declaradas
para receber estes argumentos. Essas variáveis possuem as mesmas características de variáveis
locais, e devem ser declaradas logo após o nome da função e entre parênteses, não esquecendo
do tipo de dados que estas variáveis receberão, que deve coincidir com o argumento recebido.
Quando uma matriz é passada como argumento para uma função, apenas o endereço
inicial da matriz é passado, e não todo seu conteúdo.
Bibliografia
SCHILDT, Herbert. C Completo e Total [3ª edição]. São Paulo: Makron Books, 1996.
CELES, Waldemar; RANGEL, José Lucas. Apostila de Estruturas de Dados. PUC-RIO, 2002.