1 / 38

Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima http://allanlima.wordpress.com/. Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra Sob as seguintes condições:

suzuki
Download Presentation

Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Curso de C/C++ Aula 3 Instrutor: Luiz Felipe Sotero Material por: Allan Lima http://allanlima.wordpress.com/

  2. 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

  3. Roteiro • Ponteiros • Funções • Diretivas de compilação

  4. Vetores e Ponteiros • Quando declaramos uma matriz: • tipo meuArray[tam]; • O compilador aloca a matriz em uma região de memória contínua • meuArray na verdade é um ponteiro para a primeira posição da memória que foi alocada*. • meuArray[10] é equivalente a *(meuArray + 10)

  5. Vetores e Ponteiros • Podemos usar ponteiros como se fossem matrizes: int mat[] = {1, 2, 3}; int *p = mat; printf("%d", p[2]); // imprime 3

  6. 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; } } return0; }

  7. 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; } return0; } É muito mais rápido e diminui o tamanho do código

  8. Vetores e Ponteiros • Matrizes não podem 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;

  9. 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); return0; }

  10. 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

  11. 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)); return0; }

  12. 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];

  13. 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

  14. Exemplo #include <stdio.h> int main() { int a = 10, *p, **pp; p = &a; pp = &p; printf("%d\n", **pp); // imprime 10 return0; } Obs.: Para acessar o valor de a através de pp usamos o operador * duas vezes

  15. Cuidados ao utilizar ponteiros • Saiba sempre para onde o ponteiro está apontando • Nunca utilize um ponteirosem que antes ele tenha sido inicializado

  16. Exemplo // Errado - Não execute int main () { int a, *p; a = 10; *p = a; // Para onde p aponta??? return 0; }

  17. 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

  18. Sintaxe tipoDeRetorno nomeDaFuncao(listaDeParâmetros) { corpoDaFuncao; } listaDeParâmetros = tipo1 nome1, ... , tipoN nomeN

  19. 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);

  20. 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

  21. Exemplo int dividir(int a, int b) { if (!b) { return0; // evita a divisão por 0 } return a / b; }

  22. 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);

  23. Exemplo void b(int); // protótipo de b void a(int i) { // ... b(i); // ... } void b(int j) { // ... a(j); // ... }

  24. Ponteiros para Funções • Sintaxe: • tipoDeRetorno (*nomeDoPonteiro) (tipoP1, ... , tipoPN) • Exemplo: // Define a estrutura do ponteiro int (*p)(constchar *); p = puts; // inicializa p ("UFPE"); // faz a chamada (*p) ("UFPE"); // faz a chamada • Também podemos passar ponteiros para funções como parâmetro de outras funções

  25. Exemplo • exemploPonteiroFuncao.c

  26. 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âmetros • argv contém os parâmetros • Obs.: argv[0] contém o nome do programa por isso, argc > 0

  27. 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); return0; }

  28. 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

  29. 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”

  30. A Diretiva #define • 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))

  31. A Diretiva #undef • Apaga uma macro do compilador • Sintaxe: • #undef nomeDaMacro • Exemplo: • #undef max

  32. 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

  33. A Diretiva #ifndef • Sintaxe: #ifndef nomeDaMacro corpoDaMacro // código #endif • Se não existir uma macro chamada nomeDaMacro no compilador corpoDaMacro será compilado

  34. As Diretivas #if, #else e #elif • Sintaxe: #if expressãoConstante1 declarações1 #elif expressãoConstante2 declarações2 ... #elif expressãoConstanteN declaraçõesN #else declarações #endif

  35. Exemplo • exemploDiretivas.c • exemploError.c

  36. Exercícios • 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 • Declare um ponteiro para uma das funções que você fez no exercício anterior e chame-a utilizando o mesmo • 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

  37. Referências • Curso de C da UFMG • http://ead1.eee.ufmg.br/cursos/C/ • Slides de Gustavo (ghcp@cin.ufpe.br) do curso de C/C++

  38. Agradecimentos • Allan Lima, Breno do Vale e Francisco Magalhães • Pelo material cedido para o curso

More Related