Este documento apresenta os principais tópicos sobre ponteiros e funções em C, incluindo: 1) como declarar e usar ponteiros para variáveis, vetores e strings; 2) como declarar e usar funções, incluindo parâmetros, retorno e protótipos; e 3) diretivas de compilação como #include e #define. Exemplos de código são fornecidos para ilustrar cada tópico.
6. Vetorese Ponteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Quando declaramos uma matriz:
tipo meuArray[tam];
O compilador aloca a matriz em uma região de memória contínua
meuArray na verdade é umponteiropara a primeira posição da memória que foi alocada.
meuArray[10] é equivalente a *(meuArray + 10)
7. Vetorese Ponteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Podemos usar ponteiros como se fossem matrizes:
int mat[] = { 1, 2 , 3 };
int *p = mat;
printf(“%d”, p[2]); // imprime 3
8. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
int mat[50][50];
int i, j;
// percorre a matriz com dois loops
for (i = 0; i < 50; i++) {
for (j = 0; j < 50; j++) {
mat[i][j] = 0;
}
}
return 0;
}
9. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
int mat[50][50];
int *p= (int *) mat, i;
// percorre a matriz com um único loop
for (i = 0; i < 2500; i++) {
*p = 0;
p++;
}
return 0;
}
É muito mais
rápido e diminui o
tamanho do código
10. Vetorese Ponteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Matrizes nãopodem ser usadas como ponteiros
Exemplo:
int vetor[10];
int *ponteiro, i;
ponteiro = &i;
// as operações a seguir são inválidas
// ERRADO: vetor não é variável
vetor = vetor + 2;
// ERRADO: vetor não é variável
*vetor = 0;
// ERRADO: vetor não é variável
vetor = ponteiro;
tipo meuArray[]; const tipo * meuArray;
11. Stringse Ponteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Strings são variáveis do tipo *char
Exemplo:
#include <stdio.h>
#include <string.h>
int main() {
char curso[15];
char *p = "Curso de C/C++“;
// p pode ser usado como uma string
strcpy(curso, p);
printf("%s %sn", curso, p);
return 0;
}
12. Ponteirodo tipo void
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Este tipo de ponteiro pode apontar para qualquer outro tipo
Mas para se ter acesso ao conteúdo por ele endereçado precisamos fazer um cast
É útil para a passagem de parâmetros genéricos
13. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
char *s = "string";
int a = 1, *p = &a;
float f = 2.0;
void *v;
v = p; // v aponta para um inteiro
a = *((int *) v);
v = s; // v aponta para uma string
s = (char *) v;
v = &f; // v aponta para um float
f = *((float *) v);
return 0;
}
14. Matrizesde Ponteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Podemos declarar matrizes de ponteiros
Exemplos:
// vetor de ponteiros
int *vetor[10];
// vetor de strings
char *strings[] = {"EU", "TU", "ELE" };
// matriz de ponteiros
int *matriz[2][2];
15. PonteirosparaPonteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Guardam o endereço de outro ponteiro
Sintaxe:
tipo **nomeDaVariavel;
Também podem ser usados como matrizes bidimensionais
Podemos criar ponteiros para ponteiros para ponteiros para ponteiros, e assim por
diante
16. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
int a = 10, *p, **pp;
p = &a;
pp = &p;
printf("%dn", **pp); // imprime 10
return 0;
}
Obs.: Para acessar o valor
de a através de pp usamos
o operador * duas vezes
17. Cuidadosao utilizarponteiros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Saiba sempre para onde o ponteiro esta apontando
Nunca utilize um ponteiro sem que antes ele tenha sido inicializado
18. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
// Errado - Não execute
int main () {
int a,*p;
a = 10;
*p = a; // Para onde p aponta???
return 0;
}
19. Funções
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Funções são estruturas que permitem ao programador separar o seu código em
blocos
Ajudam a tornar o código mais legível e fácil de reutilizar
Um bom programador deve saber como dividir o seu problema em funções para
torná-lo mais fácil de resolver
20. Sintaxe
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
tipoDeRetorno nomeDaFuncao(listaDeParâmetros) {
corpoDaFuncao;
}
listaDeParâmetros = tipo1 nome1, ... , tipoN nomeN
21. Parâmetros
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Os parâmetros são cópias das variáveis originais (Chamada por valor)
Mas podemos utilizar ponteiros como parâmetros e com isto alterar o valor de uma
variável que não pertence à função (Chamada por referência)
Exemplo:
int a;
scanf(“%d”, &a);
22. O comandoreturn
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
return nomeDaVariável;
nomeDaVariável não é usado em funções que retornam void
O return encerra a execução da função
Pode ser comparado com o break usado nos loops
Uma função pode ter mais de um return
23. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
int dividir(int a, int b) {
if (!b) {
return 0; // evita a divisão por 0
}
return a / b;
}
24. Protótiposde funções
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Os compiladores de C são muito eficientes, mas isto traz alguns problemas
Funções só podem ser usadas se forem definidas anteriormente
A solução é utilizar protótipos de funções
Sintaxe:
tipoDeRetorno nomeDaFunção(tipo1, ... , tipoN);
25. Protótiposde funções
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
void b(int); // protótipo de b
void a(int i) {
// ...
b(i);
// ...
}
void b(int j) {
// ...
a(j);
// ...
}
26. PonteirosparaFunções
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
tipoDeRetorno (*nomeDoPonteiro) (tipoP1, ... , tipoPN)
Exemplo:
int (*p)(const char *);
p = puts; // inicializa
(*p) (“UFPE”); // faz a chamada
Também podemos passar ponteiros para funções como parâmetro de outras
funções
27. A funçãomain
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Principal função do programa
Sintaxe completa:
int main(int argc, char *argv[]);
Permite que o usuário passe argumentos para o programa
argc é quantidade de parâmetros
argv contém os parâmetros
Obs.:argv[0] contémo nomedoprogramaporisso,argc > 0
28. Exemplo
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main (int argc, char *argv[]) {
int i;
for (i = 0; i < argc; i++) {
printf("%sn", argv[i]);
}
printf("total: %dn", argc);
return 0;
}
29. Diretivasde Compilação
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
São comandos que não são compilados, mas sim interpretados pelo pré-processador
Todas as diretivas começam por # e podem ser utilizadas em qualquer parte do
código
Principais diretivas definidas no C ANSI:
#if, #ifdef, #ifndef, #else, #elif, #endif,#include,
#define, #undef, #error
30. A Diretiva#include
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Diz ao compilador para incluir um arquivo especificado no seu programa
Sintaxe:
#include <nomeDoArquivo>
• O arquivo se encontra no path do compilador
#include “nomeDoArquivo”
• O arquivo se encontra em outro local
Exemplos:
#include <string.h>
#include “pessoa.h”
31. A Diretiva#define
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Define uma macro no compilador
Sintaxe:
#define nomeDaMacro corpoDaMacro
copoDaMacro é opcional
Exemplos:
#define TAMANHO 10
#define _WIN32
#define max(a,b) ((a>b)?(a):(b))
32. A Diretiva#undef
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Apaga uma macro do compilador
Sintaxe:
#undef nomeDaMacro
Exemplo:
#undef max
33. As Diretivas#if,#elsee #elif
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
#if expressãoConstante1
declarações1
#elif expressãoConstante2
declarações2
...
#elif expressãoConstanteN
declaraçõesN
#else
declarações
#endif
34. Exercícios
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
1) Implemente as seguintes funções:
int mystrlen(char *c)
• retorna o tamanho da stringc
void mystrcpy(char *dest, char *orig)
• copia orig para dest
void mystrcat(char *dest, char *orig)
• concatena orig em dest
int mystrchar(char *str, char c)
• Retorna o índice onde c ocorre em str
2) Declare um ponteiro para uma das funções que você fez no exercício anterior e chame-a utilizando o
mesmo
3) Crie as seguintes macros:
min(a,b)
• Retorna o mínimo entraa e b
isPar(a)
• Retorna 1 se a for par e 0 caso contrário
36. Referênciados Slides
Curso de C da UFMG
http://ead1.eee.ufmg.br/cursos/C/
Slides de Gustavo (ghcp@cin.ufpe.br) do curso de C/C++
16:46
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Apresentar as definições dos comandos While, do-While, For, Break e Continue.
2. Utilizaremos trechos de diagramas de contexto hipotéticos para modelar algumas estruturas de repetição e de desvio de fluxo.
3. Mostrar as várias formas de aplicação e utilização
Apresentar as definições dos comandos While, do-While, For, Break e Continue.
2. Utilizaremos trechos de diagramas de contexto hipotéticos para modelar algumas estruturas de repetição e de desvio de fluxo.
3. Mostrar as várias formas de aplicação e utilização
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
1941 - 2011
Uma estrutura em C serve basicamente para
agrupar diversas variáveis dentro de um único
contexto
Apresentar as definições dos comandos While, do-While, For, Break e Continue.
2. Utilizaremos trechos de diagramas de contexto hipotéticos para modelar algumas estruturas de repetição e de desvio de fluxo.
3. Mostrar as várias formas de aplicação e utilização