Linguagem C
86 pág.

Linguagem C


DisciplinaAlgoritmos e Estrutura de Dados I720 materiais7.909 seguidores
Pré-visualização18 páginas
de dado, um trecho de código executável ou ainda outro ponteiro. A forma geral para declarar uma 
variável ponteiro é: 
<tipo> *<nome_do_ponteiro>; float *p 
 
O tipo base do ponteiro define que tipo de variáveis o ponteiro pode apontar. É 
importante declarar o ponteiro corretamente pois de acordo com o tipo base pode ser realizado a 
aritmética de ponteiros. 
 Após um ponteiro ser declarado o ponteiro possui um valor desconhecido. Portanto é 
necessário atribuir um valor antes de utilizá-lo. 
Existem dois operadores especiais para ponteiros: 
* = \u201dNo endereço de...\u201d & = \u201dO endereço de...\u201d 
 
Em geral, as expressões envolvendo ponteiros concordam com as mesmas regras de 
qualquer outra expressão de C. Existem apenas duas operações aritméticas que podem ser usadas 
com ponteiros: adição e subtração. 
Considerando-se o seguinte exemplo: 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. int main(void) 
5. { 
6. float *p, v[5]; 
7. int i; 
8. p=&v[0]; 
9. printf(&quot;p armazenou endereco %p\n&quot;,p); 
10. for (i=0; i<5; i++) 
11. { 
12. printf(&quot;O endereco armazenado e %p\n&quot;,p); 
13. p++; 
14. } 
15. return 0; 
16. } 
 
O ponteiro p armazena inicialmente o primeiro byte do vetor v (Hexa 0063FDE4). No 
primeira iteração do primeiro loop (for), o ponteiro p é incrementado. Sendo p um ponteiro para 
ponto flutuante (float), o novo valor é o antigo mais 4 bytes (0063FDE4 + 4 = 0063FDE8). O 
mesmo ocorre com as demais iterações. O segundo loop (for) o ponteiro q é do tipo é double (8 
bytes), logo, ao ser incrementado, soma-se 8 bytes. 
 
 
 
 45
8.1 Exercícios 
1. Considere o trecho de código a seguir e responda se as seguintes expressões são construções 
válidas ou inválida. Justifique cada uma delas. 
... 
int j, k[10], *r, *s; 
... 
1. r=j; 
2. r=&j; 
3. s=k[0]; 
4. s=&k[0]; 
5. s=k; 
6. *r=&j; 
7. *r=j; 
8. *s=k; 
9. *s=k[5]; 
10. *s=*r; 
 
2. Elabore um programa que um vetor de 10 números reais, apresente o conteúdo e o endereço de 
cada posição do vetor. Utilize um ponteiro. 
3. Elabore um programa que leia três números, calcule e mostre o maior e o menor número. Utilize 
um ponteiro. 
 
 
 
 
 46
9. PONTEIROS, VETORES E MATRIZES 
Ponteiros e matrizes possuem uma estreita relação. A linguagem C permite o acesso aos 
elementos de uma matriz de duas formas: aritmética de ponteiros e indexação de matrizes. 
Por exemplo, é criado um vetor tipo char e um ponteiro para char. Em seguida é 
atribuído ao ponteiro p a posição 0 da variável vetor str. Para x receber o conteúdo do vetor str 
posição 10, as seguintes expressões são válidas: 
x=str[10]; x=*(p+10); 
As duas expressões retornam o valor do décimo primeiro elemento do vetor str. 
Exemplo: 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. int main(void) 
5. { 
6. int *p, v[10], i; 
7. p=&v[0]; 
8. printf(&quot;p armazenou endereco %p\n&quot;,p); 
9. for (i=0; i<10; i++) 
10. printf(&quot;O endereco de p[%d] e: %p\n&quot;, i, &p[i]); 
11. printf(&quot;\n\n&quot;); 
12. for (i=0; i<10; i++) 
13. printf(&quot;O endereco de p+%d e: %p\n&quot;, i, p+i); 
14. return(0); 
15. } 
 
9.1 Vetores e 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]; 
 
Considere o seguinte exemplo: 
1. #include <stdlib.h> 
2. #include <stdio.h> 
3. 
4. void mostra_erro(int num); 
5. 
6. int main(void) 
7. { 
8. int i; 
9. for(i=0; i<5; i++) 
10. mostra_erro(i); 
11. return 0; 
12. } 
13. 
14. void mostra_erro(int num) 
15. { 
16. /*Inicia um vetor de ponteiros*/ 
17. char *erro[]= 
18. { 
19. &quot;Erro zero\n&quot;, 
20. &quot;Erro um\n&quot;, 
21. &quot;Erro dois\n&quot;, 
22. &quot;Erro tres\n&quot;, 
23. &quot;Erro quatro\n&quot;, 
24. }; 
25. printf(&quot;%s&quot;, erro[num]); 
26. } 
 47
9.2 Exercícios 
1. Escreva um programa que inverta a ordem dos caracteres de uma cadeia de caracteres. Use 
ponteiros. 
2. Faça um programa que carregue um vetor 10 de números reais, calcule a média aritmética dos 
elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na 
vetor. Utilize ponteiro. 
 
 
 
 
 
 
 48
10. FUNÇÕES 
Funções são blocos de construção em C. A forma geral de uma função é: 
<Tipo_de_retorno> <nome_da_função>(<lista de parâmetros>) 
{ 
 <Corpo da Função> 
} 
 
OBS: <lista de parâmetros> = <tipo> <Var1>, <tipo> <Var2>, ..., <tipo> <Varn> 
 
Cada função é um bloco discreto de código, sendo que é privativo à função e não pode 
ser acessado por nenhum comando em uma outra função, exceto por meio de uma chamada de 
função. O escopo da função é a porção de código e dados (variáveis locais) que constitui o corpo da 
função que é oculto do resto do programa, portanto, a menos que utilize variáveis ou dados globais, 
não pode afetar ou ser afetado por outras partes do programa. Os argumentos são chamados de 
parâmetros formais da função. São variáveis locais que pertencem à função e são criadas na entrada 
e destruídas na saída. Os argumentos podem ser passados de duas maneiras: 
\u2022 Chamada por Valor: Este método faz uma cópia do valor de um argumento no parâmetro 
formal. Desta forma, quaisquer alterações feitas no parâmetro não têm nenhum efeito nas 
variáveis usadas para chamá-la; 
\u2022 Chamada por Referência: Este método o endereço do argumento é copiado para o parâmetro 
formal. Isto implica que quaisquer alterações no parâmetro afetam a variável usada para chamar 
a rotina. 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. 
4. float valor(float x); 
5. float referencia(float *x); 
6. 
7. int main(void) 
8. { 
9. float y=10,z; 
10. printf(\u201dChamada por valor:\n\u201d); 
11. z=valor(y); 
12. printf(\u201dy=%f, z=%f\n\u201d, y, z); 
13. printf(\u201dChamada por Referencia:\n\u201d); 
14. z=valor(y); 
15. printf(\u201dy=%f, z=%f\n\u201d, y, z); 
16. return(0); 
17. } 
18. float valor(float x) 
19. { 
20. x=x*x; 
21. return(x); 
22. } 
23. 
24. float referencia(float *x) 
25. { 
26. x=x*x; 
27. return(x); 
28. } 
 
10.1 Ponteiros para Funções 
As variáveis possuem uma posição física na memória assim como o próprio código 
executável do programa. O endereço de uma função é o ponto de entrada da função, portanto, um 
ponteiro de função pode ser usado para chamar uma função. Quando uma função é compilada, o 
código fonte é transformado em código objeto e um ponto de entrada é estabelecido. Quando é feita 
 49
uma chamada de função, enquanto o programa está sendo executado, é efetuada uma chamada em 
linguagem de máquina para o endereço desse ponto de entrada. 
1. #include <stdlib.h> 
2. #include <stdio.h> 
3. 
4. void mostra_erro1(int num); 
5. void mostra_erro2(int num); 
6. 
7. int main(void) 
8. { 
9. int i; 
10. void (*p)(int); 
11. p=mostra_erro1; 
12. printf(&quot;End. da funcao: %p\n&quot;, p); 
13. for(i=0; i<5; i++) 
14. p(i); 
15. p=mostra_erro2; 
16. printf(&quot;End. da funcao: %p\n&quot;, p); 
17. for(i=0; i<5; i++) 
18. p(i); 
19. return 0; 
20. } 
21. void mostra_erro1(int num) 
22. { 
23. char *erro[]= 
24. { 
25. &quot;Primeiro Erro zero\n&quot;, 
26. &quot;Primeiro Erro um\n&quot;, 
27. &quot;Primeiro Erro dois\n&quot;, 
28. &quot;Primeiro Erro tres\n&quot;, 
29. &quot;Primeiro Erro quatro\n&quot;, 
30. }; 
31. printf(&quot;%s&quot;, erro[num]); 
32. } 
33. 
34. void mostra_erro2(int num) 
35. { 
36. char *erro[]= 
37. { 
38. &quot;Segundo Erro zero\n&quot;, 
39. &quot;Segundo Erro um\n&quot;, 
40. &quot;Segundo Erro dois\n&quot;, 
41. &quot;Segundo Erro tres\n&quot;, 
42. &quot;Segundo Erro quatro\n&quot;, 
43. }; 
44. printf(&quot;%s&quot;, erro[num]); 
45. } 
 
10.2 Recursividade 
Em C, funções podem chamar a si mesmas. A função é recursiva se um comando no 
corpo da função a chama. A recursividade talvez seja a mais importante vantagem das funções em 
C. A recursão é o processo é o processo de definir algo em termos de si mesmo, isto é, uma função 
que chama a si mesma repetidamente um número finito de vezes. Este recurso é muito útil em 
alguns tipos de algoritmos