Está en la página 1de 27

Fazendo as Pazes com a Linguagem C

Ana Carolina Sokolonski Ferreira


carolsoko@ifba.edu.br

Sandro Santos Andrade


sandroandrade@ifba.edu.br Mini-Curso Semana da SBC IFBa Setembro / 2010

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Dia 2 - Roteiro

Ponteiros (Fundamentos) Arrays Arrays e Ponteiros Aritmtica de Ponteiros Ponteiros void Strings Matrizes

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

No tenha medo !

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Pensamentos errneos:

O problema da linguagem C/C++ so os ponteiros Mude para: O problema da linguagem C/C++ sou eu Vou programar em Java porque mais produtivo e existem mais vagas no mercado Mude para: Vou programar em C/C++ porque estou capacitado e ocuparei cargos melhores Trabalhar com ponteiros no C/C++ muito difcil Mude para: Um ponteiro uma varivel como outra qualquer

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

So variveis como outra qualquer, a diferena que elas contm endereos de outras variveis Representam tecnologia fundamental para desenvolver sistemas eficientes e modernos So fundamentais para implementao das principais estruturas de dados um conceito perfeitamente compreensvel e que no lida com aspectos de nvel to baixo Se voc utilizar uma boa biblioteca de smart pointers programar em C/C++ se torna to produtivo quanto programar em Java
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Variveis so declarados com um tipo e um nome:


<tipo> <nome>, <nome>, ;

Exemplos:
int x; float y, z; char c;

Atribuies s podem ser realizadas com variveis do mesmo tipo ou cuja converso implcita permitida:
y = z; x = c;
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

De forma semelhante ponteiros representam tipos:


<tipo> *<nome>, *<nome>, ;

Exemplos:
int *x; // x do tipo ponteiro para int float *y, *z; // y e z so do tipo ponteiro para float char *c1, c2; // c1 do tipo ponteiro para char mas c2 do tipo char

Assim como para variveis de outros tipos, ponteiros no so inicializados automaticamente pelo C:
int x; int *p; // Qual o contedo de x ? // Qual o contedo de p ?

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Ateno: no estar inicializado diferente de conter o valor 0:


// x contm lixo (valor no definido) int y = 0; // y contm o valor 0 int *p1; // p1 contm lixo (valor no definido) int *p2 = 0; // p2 um ponteiro nulo int x;

Como inicializar ponteiros ?

Operador & (endereo-de)

int x = 0;

// x uma varivel que contm um endereo e um valor int *px = &x; // px tambm uma varivel com endereo e valor, porm seu valor o endereo-de x
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Acessando variveis indiretamente atravs de ponteiros:

Operador * (contedo-da-varivel-para-a-qual-o-ponteiroaponta)

int x = 0; int *px = &x; *px = 10; // a mesma coisa que x = 10; // Altera-se o valor de x indiretamente atravs de px // Se px no contiver um endereo vlido de memria o comportamento imprevisvel e seu programa contm um erro

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Mas pra que complicar ? Por que fazer *px = 10 se posso fazer x = 10 ? Aplicao mais simples de ponteiros: Simulao de passagem de parmetro por referncia:
// No funciona

void dobrarValores(int x, int y) { x *= 2; y *= 2; } void main() { int x = 10, y = 20; dobrarValores(x, y); printf (%d - %d\n, x, y); }

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Porque o cdigo anterior no funcionou ?

O C sempre (sem excees) passa parmetros de funes por valor (cpia) Simulando passagem por referncia

void dobrarValores(int *x, int *y) { // x e y agora so ponteiros *x *= 2; // Utilizo aqui o operador * *y *= 2; } void main() { int x = 10, y = 20; dobrarValores(&x, &y); // Devo passar os endereos printf (%d - %d\n, x, y); }
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Entenda o cdigo anterior:

No estamos passando parmetros por referncia, a linguagem C no possui este mecanismos (o C++ sim) Continuamos passando por valor, mas agora ocorre cpia de ponteiros Utilizamos os ponteiros para, indiretamente, alterar o valor das variveis no escopo da funo main

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Tornando as coisas mais emocionantes :)

Se um ponteiro uma varivel como outra qualquer ento ele tambm possui um endereo Se um ponteiro contm o endereo de outra varivel ento um ponteiro pode conter o endereo de um outro ponteiro:

int x = 0; int *px = &x; int **ppx; // ppx do tipo ponteiro-para-ponteiro-para-int ppx = &px; // Inicializamos ppx com o endereo de px ppx = &x; // No funciona DICA: sempre faa a pergunta dos tipos
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Tornando as coisas mais emocionantes :)


Acessos indiretos funcionam de forma semelhante: DICA: cada operador * presente retira uma ocorrncia de ponteiro-para do tipo Exemplo:
int x = 0, y = 0; int *px = &x; int **ppx = &px; ppx do tipo ponteiro-para-ponteiro-para-int *ppx do tipo ponteiro-para-ponteiro-para-int **ppx do tipo ponteiro-para-ponteiro-para-int
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros (Fundamentos)

Tornando as coisas mais emocionantes :)


int x = 0, y = 0; int *px = &x; int **ppx = &px; int ***pppx = &ppx; PODE OU NO PODE ? **ppx = 10; *ppx = 20; *ppx = y; *ppx = &y; px = 20; **px = &y; **pppx = &y;
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Arrays

Representam agregados contguos de variveis do mesmo tipo Simplificam a criao de uma quantidade grande variveis
// Aloca uma varivel para armazenar um inteiro // Atribui o valor 0 a esta varivel // Aloca e inicializa uma varivel para armazenar um inteiro // Aloca dez variveis contguas para armazenar um inteiro em cada uma delas // z do tipo array-de-int
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

int x; x = 0; int y = 0;

int z[10];

Arrays

Acessando elementos: operador [] Arrays so indexados de 0 at o tamanho-1


// // // // // // Aloca array de 10 int's Erro: 20 int e x array-de-int Ok: o primeiro elemento de x contm 20 Ok: o ltimo elemento de x contm 50 Ok: y ir conter o 11 elemento de x Incorreto: x[20] no uma rea de memria alocada. O seu programa vai compilar mas o resultado imprevisvel.

int x[10]; x = 20; x[0] = 20; x[9] = 50; int y = x[10]; x[10] = 80;

O C, por questes de desempenho, no verifica limites no acesso a arrays


Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Arrays

Inicializando arrays:

Forma 1:

int x[10], c; for (c = 0; c < 10; ++c) x[c] = 0;

Forma 2: Se a quantidade de inicializaes for menor que o tamanho do array os demais itens so inicializados com zero:

int x[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

int x[10] = {0, 1, 2, 3, 4, 5, 6}; // 3 ltimos com zero int x[10] = {}; // Todos com zero int x[] = {0, 1, 2, 3, 4}; // Tamanho inferido da inicializao
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Arrays

Passando arrays como parmetros de funo:


// No temos como saber o tamanho do vetor a partir da sua varivel somente

void exibeArray(int z[], int size) { int c; for (c = 0; c < size; ++c) printf ("%d\n", z[c]); } void main() { int z[10] = {10}; exibeArray(z, 10); }

Esta passagem por valor ou referncia ? Vejamos :)


Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Arrays e Ponteiros

Arrays e ponteiros so equivalentes no C:


int x[10]; int *px = x;

O ponteiro px ir conter o endereo do primeiro elemento do vetor, ou seja, &x[0] Na funo exibeArray anterior o compilador transforma int z[] em int *z Ou seja:
// Perceba que no utilizei &x, x j um ponteiro // O mesmo que x[0] = 10;

int x[10]; int *px = x; *px = 10;

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Aritmtica de Ponteiros

Um ponteiro na realidade pode apontar para qualquer endereo de memria independente do tipo da varivel para a qual ele aponta
int x = 10; void *px = x;

A nica razo para declarar ponteiros para tipos especficos realizar aritmtica de ponteiros:

int x[10]; int *px = x; px++; // Incrementa px de 1 unidade. 1 unidade igual ao nmero de bytes ocupado pelo tipo do ponteiro *px = 20; // O mesmo que x[1] = 20
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Aritmtica de Ponteiros

Ou seja, em:

int x[10] = {}, c; for (c = 0; c < 10; ++c) printf(%d\n, x[c]);

x[c] equivalente a *(x+c), mas em:

int x[10] = {}, *y = x, c; for (c = 0; c < 10; ++c) printf(%d\n, *y++);

O acesso ao c-simo item imediato e portanto mais rpido


Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Ponteiros void

So interessantes para criar estrutura que apontam para qualquer tipo de varivel Podem sofrer casting para ponteiros de tipos especficos

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Strings

Strings so representados no C como array's-de-char:

char nome[11] = IFBa; // String podem ser inicializadas a partir de constantes printf (%s\n, nome);

Toda string possui um caracter adicional, de valor 0, representando o seu trmino:

char nome[] = IFBa; // nome um array de 5 elementos (I-F-B-a-0), ao invs de 4 (I-F-B-a). O caracter de finalizao automaticamente inserido na inicializao acima nome = Curso de C; // Incorreto, atribuio de ponteiros ! if (nome == IFBa) // Incorreto, comparao de ponteiros !
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Strings

Principais funes para manipulao de strings:


strcpy strcat strcmp strlen strstr

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Matrizes

Arrays podem ter mais de uma dimenso (ndice):

int m[10][10]; m[0][0] = 1; m[i][j] na realidade m[i * NCOLUNAS + j];

Se um array-de-int de uma dimenso equivalente a um ponteiro-para-int, um array-de-int de duas dimenses no equivalente a um ponteiro-paraponteiro-para-int equivalente a um ponteiro-para-array-de-int

Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

Matrizes

Passando arrays de mais de uma dimenso como parmetros:

Forma 1:

void exibeMatriz(int m[][NCOLUNAS], int rows); Para invocar a funo: exibeMatriz(m);

Forma 2: Forma 3:

void exibeMatriz(int (*m)[NCOLUNAS], int rows);

void exibeMatriz(int *m, int rows, int cols); Para invocar a funo: exibeMatriz(&m[0][0]);
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010

También podría gustarte