A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Flavio M. Strelow Linguagem C UDESC - SBS Departamento de Sistemas de Informação LPG - I: Ponteiros e Vetores/Matrizes Prof. Flavio Marcello Strelow

Apresentações semelhantes


Apresentação em tema: "Flavio M. Strelow Linguagem C UDESC - SBS Departamento de Sistemas de Informação LPG - I: Ponteiros e Vetores/Matrizes Prof. Flavio Marcello Strelow"— Transcrição da apresentação:

1 Flavio M. Strelow Linguagem C UDESC - SBS Departamento de Sistemas de Informação LPG - I: Ponteiros e Vetores/Matrizes Prof. Flavio Marcello Strelow

2 Flavio M. Strelow Linguagem C Ponteiros ponteiro é uma variável que contém o endereço de um dados, normalmente uma outra variável. Daí o nome, pois ele aponta para outra variável. Ex: quando você anota o endereço de sua casa, você cria um ponteiro para ela. declaração: "*" indica que a variável é um ponteiro sintaxe: tipo_dado *nome_ponteiro; Ex: int x; /*variável declarada como inteiro int *pi; /* compilador sabe que pi é ponteiro */ /* pi é um ponteiro para inteiro */

3 Flavio M. Strelow Linguagem C Ponteiros espaço ocupado pelas variáveis 2 bytes 1 byte 4 bytes

4 Flavio M. Strelow Linguagem C Ponteiros o operador "&" quando aplicado sobre uma variável retorna o seu endereço Ex: #include void main (){ int x = 10, *pi; pi = &x; printf("&x: %p pi: %p", &x, pi); } R: => &x: 19BC pi: 19BC Obs.: Os valores apresentados são endereços de mémoria.

5 Flavio M. Strelow Linguagem C Ponteiros funcionamento de um ponteiro na memória Ex: void main () { int var; int *ptr; var = 10; ptr = &var; }

6 Flavio M. Strelow Linguagem C Ponteiros A Fig 1 dá uma noção gráfica do funcionamento de ponteiros. E está considerando que o endereçamento do sistema é dado por 2 bytes. Assim ptr ocupará 2 bytes; var também 2 bytes, por ser uma variável int. O número 4052 da posição de memória do primeiro byte de var é apenas ilustrativo e, na prática, dependerá do local da memória onde o programa foi carregado. Mas supomos que seja este. Portanto, após a execução de ptr = &var; o conteúdo de ptr será 4052, ou seja, o primeiro byte da variável apontada. Com ptr apontando para var, podemos ler ou modificar o valor desta última de forma indireta através de ptr.

7 Flavio M. Strelow Linguagem C Ponteiros o operador "*" quando aplicado sobre um ponteiro em uma expressão aritmética retorna o dado apontado Ex: void main () { int *tmp_ptr; int x, y; x = 10; tmp_ptr = &x; // tmp_ptra ponta para x y = *tmp_ptr; // conteúdo tmp_ptr = 10; portanto, y = 10. }

8 Flavio M. Strelow Linguagem C Ponteiros Ex.2: void main () { int x, *px; float y, *py; double largura, *altura; x=1; px = &x; /* px aponta para x */ *px = 0; /* conteúdo de px = 0 (x=0) */ x = *px + 1; /* x = conteúdo de px + 1 */ }

9 Flavio M. Strelow Linguagem C Ponteiros ponteiros são variáveis tipadas: possuem tipos diferentes para guardar endereços diferentes. Então um ponteiro para um tipo de dado int possui representação diferente de um ponteiro para tipo de dado float. (int *) (float *) (char *) Ex: main() { int *ip, x; float *fp, z; ip = &x; /* OK */ fp = &z; /* OK */ ip = &z; /* erro */ fp = &x; /* erro */ }

10 Flavio M. Strelow Linguagem C Utilizando Ponteiros modificando valores de variáveis de forma indireta através de ponteiros. Ex: #include void main() { int x = 10; int *pi; pi = &x;/* pi aponta para endereço de x *pi == 10 */ (*pi)++;/* conteúdo de pi + 1 *pi == 11 */ printf("%d", x); } R: ==> 11 ao alterar *pi estamos alterando o conteúdo de x

11 Flavio M. Strelow Linguagem C Utilizando Ponteiros Ex: #include void main() { int x = 10; int *pi, *pj; pi = &x;/* *pi = 10 */ pj = pi;/* *pj = 10 */ (*pi)++;/* conteúdo de pi + 1 (*pi, *pj, x) = 11 */ (*pj)++;/* conteúdo de pj + 1 (*pi, *pj, x) = 12 */ printf("%d", x); /* ==> 12 */ }

12 Flavio M. Strelow Linguagem C Exercício 1 Pratique a declaração e utilização de ponteiros. –defina e inicialize uma variável inteira –defina um ponteiro para inteiro –modifique o valor da variável através do ponteiro – verifique os novos valores da variável usando printf

13 Flavio M. Strelow Linguagem C Vetores e Ponteiros ponteiros oferecem um eficiente e prático meio de acesso e manipulação dos elementos de uma array. EX.: void main () { int ar[] = {10, 50, 20, 30}; int *ptr; ptr = &ar[0]; // ou ptr = ar; } Quando for executado, ptr estará associado ao primeiro byte da array conforme Fig 2.

14 Flavio M. Strelow Linguagem C Vetores e Ponteiros em float m[10] m é uma constante que endereça o primeiro elemento do vetor portanto, não é possível mudar o valor de m Ex: void main ( ) { float m[10], n[10]; float *pf; m = n; //erro: m é constante! pf = m; //ok }

15 Flavio M. Strelow Linguagem C Referenciando Elementos pode-se referenciar os elementos do vetor através do seu nome e o índice entre os colchetes: Ex: #include void main () { m[5] = 5.5; if (m[5] == 5.5) printf("Exito"); else printf("Falha"); }

16 Flavio M. Strelow Linguagem C Referenciando Elementos Pode-se referenciar os elementos de um vetor através de ponteiros: Ex: #include void main () { float m[] = { 1.0, 3.0, 5.75, }; float *pf; pf = &m[2]; printf("%f", *pf);/* ==> 5.75 */}

17 Flavio M. Strelow Linguagem C Referenciando Elementos Pode-se utilizar ponteiros e colchetes: Ex.: #include void main () { float m[] = { 1.0, 3.0, 5.75, }; float *pf; pf = &m[2]; printf("%f", pf[0]);/* ==> 5.75 */} Note que o valor entre colchetes é o deslocamento a ser considerado a partir do endereço de referência: pf[n] => indica enésimo elemento a partir de pf

18 Flavio M. Strelow Linguagem C Vetores - Aritmética de Ponteiros É possível fazer operações aritméticas e relacionais entre ponteiros e inteiros Soma: ao somar-se um inteiro n a um ponteiro, endereçamos n elementos a mais (n positivo) ou a menos (n negativo) pf[2] equivale a *(pf+2) *(pf + n) endereça n elementos a frente *(pf - n) endereça n elementos atrás pf++ endereça próximo elemento vetor pf--endereça elemento anterior vetor

19 Flavio M. Strelow Linguagem C Exemplo #include void main (){ int arint[] = { 1,2,3,4,5,6,7 }; int size = 7;/* tamanho do vetor */ int i, *pi; for (pi=arint, i=0; i < size; i++, pi++) printf(" %d ", *pi); } R: ==>

20 Flavio M. Strelow Linguagem C Exemplo - Variação #include void main (){ int arint[] = { 1,2,3,4,5,6,7 }; int size = 7;/* tamanho do vetor */ int i, *pi; for (pi=arint, i=0; i < size; i++) printf(" %d ", *pi++); } R: ==>

21 Flavio M. Strelow Linguagem C Exemplo - Variação #include void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 7;/* tamanho do vetor */ int i, *pi; pi = arint; printf(" %d ", *pi); pi += 2; printf(" %d ", *pi); } R: ==>

22 Flavio M. Strelow Linguagem C Operações Válidas Sobre Ponteiros É valido: –somar ou subtrair um inteiro a um ponteiro (pi ± int) –incrementar ou decrementar ponteiros (pi++, pi--) –subtrair ponteiros (produz um inteiro) (pf - pi) –comparar ponteiros ( >, >=, <, <=, == ) Não é válido: –somar ponteiros(pi + pf) –multiplicar ou dividir ponteiros (pi*pf, pi/pf) –operar ponteiros com double ou float (pi ± 2.0)

23 Flavio M. Strelow Linguagem C Exercício 2 Escreva um programa que imprima um vetor de inteiros na ordem inversa endereçando os elementos com um ponteiro

24 Flavio M. Strelow Linguagem C Cuidados... C não controla os limites dos vetores, o programador deve fazê-lo Ex: encontre o erro!! #include void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 7, i, *pi; for (pi=arint, i=0; i < size; i++, pi += 2) printf(" %d ", *pi); }

25 Flavio M. Strelow Linguagem C Cuidados... void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 10; int i; for (pi=arint, i=0; i < size; i++) printf(" %d ", arint[i]); }

26 Flavio M. Strelow Linguagem C Cuidados... Um ponteiro deve sempre apontar para um local válido antes de ser utilizado Ex: #include void main () { int i=10, *pi; *pi = i;/*erro ! pi nao tem endereco valido*/ }

27 Flavio M. Strelow Linguagem C Ponteiros Genéricos Um ponteiro genérico é um ponteiro que pode apontar para qualquer tipo de dado Define-se um ponteiro genérico utilizando-se o tipo void: #include void main (){ void *pv; nt x=10; float f=3.5; pv = &x;/* aqui pv aponta para um inteiro */ pv = &f; /* aqui, para um float */ }

28 Flavio M. Strelow Linguagem C Ponteiros Genéricos O tipo de dado apontado por um void pointer deve ser controlado pelo usuário Usando um type cast (conversão de tipo) o programa pode tratar adequadamente o ponteiro #include void main (){ void *pv; pv = &x; printf("Inteiro: %d\n", *(int *)pv); /*=> 10*/ pv = &f; printf("Real: %f\n", *(float *)pv); /*=> 3.5*/} type cast

29 Flavio M. Strelow Linguagem C Ponteiros e Strings strings são vetores de caracteres e podem ser acessados através de char * EX.: void main () { char str[]="abcdef", *pc; for (pc = str; *pc != \0; pc++ ) putchar(*pc); } R: ==> abcdef o incremento de pc o posiciona sobre o próximo caracter (byte a byte)

30 Flavio M. Strelow Linguagem C Ponteiros e Strings operações sobre strings com ponteiros Ex.: void StrCpy (char *destino, char *origem) { // *origem==0 encerra while while (*origem) { *destino=*origem; origem++; destino++; } *destino='\0'; } // na condição do while (*origem) e (*origem != \0) são equivalentes abcde \0 ab origem destino

31 Flavio M. Strelow Linguagem C Ponteiros e Strings variação de strcpy: void strcpy (char *destino, char *origem) { while ((*destino = *origem) != \0) destino++, origem++; } *destino='\0';

32 Flavio M. Strelow Linguagem C Vetores Multidimensionais vetores podem ter diversas dimensões, cada uma identificada por um par de colchetes na declaração Ex.: char matriz[5][10]; declara uma matriz de 5 linhas e 10 colunas: na memória, entretanto, os caracteres são armazenados linearmente: [0,0] [4,9] [0,9] [1,9] [0,0] [4,9]

33 Flavio M. Strelow Linguagem C Vetor de Caracteres Percorrendo vetor com ponteiro: #include #define L 5 #define C 10 void main () { char matriz[L][C]; char *pc; int i; for (i=0, pc=matriz[0]; i < (L * C) ; i++, pc++) *pc = 'P'; for (i=0, pc=matriz[0]; i < (L * C) ; i++, pc++) printf("%c", *pc); }

34 Flavio M. Strelow Linguagem C Vetor de Caracteres Percorrendo vetor com índices: #include #define L 5 #define C 10 void main () { char matriz[L][C]; int i, j; for (i=0, j=0; i

35 Flavio M. Strelow Linguagem C Vetor de Strings Neste caso, cada elemento do vetor é um ponteiro para um caracter Declaração: char *arstr[] = {"Joao", "Maria", "Antonio", "Zacarias", "Carlos"}; arstr é um vetor de ponteiros para char, iniciado com os strings indicados

36 Flavio M. Strelow Linguagem C Vetor de Strings Comparando vetor de string com matriz de char char *as[]= {"Joao","Maria","Antonio","Zacarias","Carlos"}; char ma[5][10]= {"Joao","Maria","Antonio","Zacarias","Carlos"}; Joao Maria Antonio Zacarias Carlos Ponteiros (as) J o a o M a r i a A n t o n i o Z a c a r i a s C a r l o s \0 Matriz (ma)

37 Flavio M. Strelow Linguagem C Cuidados com Strings É comum esquecer de alocar uma área para armazenamento de caracteres void main() { char *pc; char str[] = "Uma string"; strcpy(pc, str); /* erro! pc indeterminado */... }

38 Flavio M. Strelow Linguagem C Ponteiros para Ponteiros É possível definir ponteiros para ponteiros até um nível arbitrário de indireção Ex: #include void main () { char *pc;/* ponteiro para char */ char **ppc;/* ponteiro para ponteiro para char */ pc = "teste"; ppc = &pc; putchar(**ppc); /* ==> t */ }

39 Flavio M. Strelow Linguagem C Exemplo:Troca Variáveis - Ponteiros #include void troca(int *, int *); int main(void){ int x, y; x = 3; y = 4; printf("main - x = %d, y=%d \n", x, y); troca(&x, &y); printf("main - x = %d, y=%d \n", x, y); } void troca(int *x, int *y){ int z; printf("troca - x = %d, y=%d \n", *x, *y); z = *x; *x = *y; *y = z; printf("troca - x = %d, y=%d \n", *x, *y); }

40 Flavio M. Strelow Linguagem C Exercício 3 - Ponteiros Escreva uma função que receba três números reais (float) e reordene-os de forma decrescente. Teste sua implementação. Sugestão para protótipo da função: void ordena(float *a, float *b, float *c);


Carregar ppt "Flavio M. Strelow Linguagem C UDESC - SBS Departamento de Sistemas de Informação LPG - I: Ponteiros e Vetores/Matrizes Prof. Flavio Marcello Strelow"

Apresentações semelhantes


Anúncios Google