Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
int x[10]; x = 20; x[0] = 20; x[9] = 50; int y = x[10]; x[10] = 80;
Arrays
Inicializando arrays:
Forma 1:
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}; // 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
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); }
Arrays e Ponteiros
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;
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:
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
char nome[11] = IFBa; // String podem ser inicializadas a partir de constantes printf (%s\n, nome);
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
Fazendo as Pazes com a Linguagem C Semana da SBC Ana Ferreira e Sandro Andrade Setembro / 2010
Matrizes
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
Forma 1:
Forma 2: Forma 3:
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