+ Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima
Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima
description
Transcript of Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima
![Page 1: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/1.jpg)
+
Curso de C/C++
Aula 3
Instrutor: Luiz Felipe Sotero
Material por: Allan Lima
http://allanlima.wordpress.com/
![Page 2: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/2.jpg)
Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra
Sob as seguintes condições: Atribuição. Você deve dar crédito ao autor original, da forma
especificada pelo autor ou licenciante. Compartilhamento pela mesma Licença. Se você alterar, transformar, ou
criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.
Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra.
Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor.
Veja aqui a licença completa
![Page 3: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/3.jpg)
+Roteiro
Ponteiros
Funções
Diretivas de compilação
![Page 4: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/4.jpg)
+Vetores e Ponteiros
Quando declaramos uma matriz:
tipo meuArray[tam];O compilador aloca a matriz em uma região de
memória contínuameuArray na verdade é um ponteiro para a
primeira posição da memória que foi alocada*.meuArray[10] é equivalente a *(meuArray + 10)
![Page 5: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/5.jpg)
+Vetores e Ponteiros
Podemos usar ponteiros como se fossem matrizes:
int mat[] = {1, 2, 3};
int *p = mat;
printf("%d", p[2]); // imprime 3
![Page 6: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/6.jpg)
+Exemplo#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;
}
![Page 7: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/7.jpg)
+Exemplo
#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[i] = 0;
}
return 0;
}
É muito mais rápido e diminui o tamanho do código
![Page 8: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/8.jpg)
+Vetores e Ponteiros
Matrizes não podem ser usadas como ponteirosExemplo: 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;
![Page 9: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/9.jpg)
+Strings e Ponteiros
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 %s\n", curso, p);
return 0;
}
![Page 10: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/10.jpg)
+Ponteiro do tipo void
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
![Page 11: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/11.jpg)
+Exemplo#include <stdio.h>
int main() {
char *s = "string";
int a = 1, *p = &a;
float f = 2.0f;
void *v;
v = p; // v aponta para um inteiro
printf("%d\n", *((int *) v));
v = s; // v aponta para uma string
printf("%s\n", (char *) v);
v = &f; // v aponta para um float
printf("%f\n", *((float *) v));
return 0;
}
![Page 12: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/12.jpg)
+Matrizes de Ponteiros
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];
![Page 13: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/13.jpg)
+Ponteiros para Ponteiros
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
![Page 14: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/14.jpg)
+Exemplo
#include <stdio.h>
int main() {
int a = 10, *p, **pp;
p = &a;
pp = &p;
printf("%d\n", **pp); // imprime 10
return 0;
}
Obs.: Para acessar o valor de a através de pp usamos o operador * duas vezes
![Page 15: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/15.jpg)
+Cuidados ao utilizar ponteiros
Saiba sempre para onde o ponteiro está apontando
Nunca utilize um ponteiro sem que antes ele tenha sido inicializado
![Page 16: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/16.jpg)
+Exemplo
// Errado - Não execute
int main () {
int a, *p;
a = 10;
*p = a; // Para onde p aponta???
return 0;
}
![Page 17: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/17.jpg)
+Funções
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
![Page 18: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/18.jpg)
+Sintaxe
tipoDeRetorno nomeDaFuncao(listaDeParâmetros) {
corpoDaFuncao;
}
listaDeParâmetros = tipo1 nome1, ... , tipoN nomeN
![Page 19: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/19.jpg)
+Parâmetros
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);
![Page 20: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/20.jpg)
+O comando return
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
![Page 21: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/21.jpg)
+Exemplo
int dividir(int a, int b) {
if (!b) {
return 0; // evita a divisão por 0
}
return a / b;
}
![Page 22: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/22.jpg)
+Protótipos de funções
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);
![Page 23: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/23.jpg)
+Exemplo
void b(int); // protótipo de b
void a(int i) {
// ...
b(i);
// ...
}
void b(int j) {
// ...
a(j);
// ...
}
![Page 24: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/24.jpg)
+Ponteiros para Funções
Sintaxe: tipoDeRetorno (*nomeDoPonteiro) (tipoP1, ... , tipoPN)
Exemplo:
// Define a estrutura do ponteiroint (*p)(const char *);p = puts; // inicializap ("UFPE"); // faz a chamada(*p) ("UFPE"); // faz a chamada
Também podemos passar ponteiros para funções como parâmetro de outras funções
![Page 25: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/25.jpg)
+Exemplo
exemploPonteiroFuncao.c
![Page 26: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/26.jpg)
+A função main
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âmetrosargv contém os parâmetrosObs.: argv[0] contém o nome do programa
por isso, argc > 0
![Page 27: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/27.jpg)
+Exemplo
#include <stdio.h>
int main (int argc, char *argv[]) {
int i;
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
printf("total: %d\n", argc);
return 0;
}
![Page 28: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/28.jpg)
+Diretivas de Compilação
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
![Page 29: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/29.jpg)
+A Diretiva #include
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”
![Page 30: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/30.jpg)
+A Diretiva #define
Define uma macro no compilador
Sintaxe:
#define nomeDaMacro corpoDaMacrocopoDaMacro é opcional
Exemplos:
#define TAMANHO 10#define _WIN32#define max(a,b) ((a>b)?(a):(b))
![Page 31: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/31.jpg)
+A Diretiva #undef
Apaga uma macro do compilador
Sintaxe:
#undef nomeDaMacro Exemplo:
#undef max
![Page 32: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/32.jpg)
+As Diretivas #ifdef e #endif
Permite a compilação condicional
Sintaxe:
#ifdef nomeDaMacro corpoDaMacro // código#endif
Se existir uma macro chamada nomeDaMacro no compilador corpoDaMacro será compilado
#endif é usada para indicar o fim da macro
![Page 33: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/33.jpg)
+A Diretiva #ifndef
Sintaxe:
#ifndef nomeDaMacro corpoDaMacro // código#endif
Se não existir uma macro chamada nomeDaMacro no compilador corpoDaMacro será compilado
![Page 34: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/34.jpg)
+As Diretivas #if, #else e #elif Sintaxe:
#if expressãoConstante1declarações1
#elif expressãoConstante2declarações2
...#elif expressãoConstanteN
declaraçõesN#else
declarações#endif
![Page 35: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/35.jpg)
+Exemplo
exemploDiretivas.c
exemploError.c
![Page 36: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/36.jpg)
+Exercícios
1) Implemente as seguintes funções: int mystrlen(char *c)
retorna o tamanho da string c 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 entra a e b isPar(a)
Retorna 1 se a for par e 0 caso contrário
![Page 37: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/37.jpg)
+Referências
Curso de C da UFMG
http://ead1.eee.ufmg.br/cursos/C/ Slides de Gustavo ([email protected]) do curso de C/C++
![Page 38: Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.tips/reader035/viewer/2022062802/56814544550346895db21029/html5/thumbnails/38.jpg)
+Agradecimentos
Allan Lima, Breno do Vale e Francisco Magalhães
Pelo material cedido para o curso