Baixe o app para aproveitar ainda mais
Prévia do material em texto
LAPRO I Prof. Dr. Rafael Garibotti Pontifícia Universidade Católica do Rio Grande do Sul Faculdade de Informática - FACIN v Baseado no material cedido pelos Profs. Dr. Marco Mangan e Dr. Matheus Trevisan PONTEIROS AULA SOBRE: INTRODUÇÃO 1 Ponteiro: variável que armazena um endereço de memória de outra variável. ü Contém endereço de memória como seu valor. Ø Exemplos: // Endereço de variável #include<stdio.h> int main(void){ int var = 500; printf("Endereço = %d", var); return 0; } // Uso de um ponteiro #include<stdio.h> int main(void){ int var = 500; int* varPtr; varPtr = &var; return 0; } INTRODUÇÃO 2 Ø O operador * do lado direito de um tipo qualquer, define um ponteiro para aquele tipo. ü Exemplo: float* mediaPtr; Ø O operador & do lado esquerdo de uma variável, permite recuperar o endereço desta variável. ü Exemplo: mediaPtr = &media; Ø O operador * quando utilizado sozinho, à esquerda da variável, retorna o conteúdo do ponteiro. ü Exemplo: printf("media= %d", *mediaPtr); ü Chamado de operador de desreferência. VALORES INICIAIS 3 Ø Boa prática de programação em C/C++. Ø Java inicia as variáveis como zero automaticamente. ü Em C/C++ isso não é verdade. Ø Valor inicial de ponteiros. ü Iniciar como 0, ou NULL. ü NULL: discussão sobre usar 0 ou NULL em C++. • http://www.cplusplus.com/forum/beginner/5604/ TERMINOLOGIA BÁSICA 4 Ø Operadores de referência e dereferência. Ø Exemplo: #include <stdio.h> int main(void) { int var = 500; int* varPtr = 0; varPtr = &var; printf("Valor de var=%d\n",var); printf("Endereço de var=%d\n",&var); printf("Conteúdo de varPtr=%d\n",*varPtr); printf("Endereço de varPtr=%d\n",varPtr); return 0; } ü * é utilizado para dereferência. • Pode ser lido como "valor apontado por..." ü & é utilizado para referência. • Pode ser lido como "endereço de..." // 500 // 500 // 1577302904 // 1577302904 PONTEIROS – MEMÓRIA 5 PONTEIROS – VETORES 6 Ø Em C/C++, um vetor é um ponteiro para um tipo de dado qualquer. Ø Por exemplo, um vetor de inteiros. ü Criado com 10 posições • int numeros[10]; ü Possui 10 espaços de armazenamento de 4 bytes cada. ü Totalizando 40 bytes alocados em memória. PONTEIROS – VETORES 7 Ø Exemplo: #include <stdio.h> int main(void) { int numeros[10]= {1,2,3,4,5,6,7,8,9,0}; printf("%d\n",numeros); printf("%d\n",&numeros[0]); printf("%d\n",*numeros); return 0; } Ø Por isso que passar vetor por parâmetro em função equivale a passar um ponteiro, uma referência para um endereço de memória! // 0xbf83d3fc // 0xbf83d3fc // 1 PONTEIROS – ARITMÉTICA 8 Ø É possível realizar operações sobre ponteiros. Ø Exemplo: #include <stdio.h> int main(void) { int numeros[10]= {1,2,3,4,5,6,7,8,9,0}; int* pnum = numeros; printf(”%d\n”,*(pnum + 5)); printf(”%d\n”,*(numeros + 5)); printf(”%d\n”, numeros[5]); return 0; } Ø O sinal de `+` diz ao compilador para acessar um elemento a partir de 5 'itens' do tipo inteiro começando do endereço do ponteiro (pnum) ou vetor (numeros). // 6 // 6 // 6 PONTEIROS – ARITMÉTICA 9 Ø Estudo de caso: #include <stdio.h> #define TAM 10 void teste_vetor3(int *v) { int *p; int i; for (p = v, i = 0; i++ < TAM; p++) printf(" %d ",*p); printf("\n"); } int main(void) { int vetor[TAM] = { 1,2,3,4,5,6,7,8,9,10 }; teste_vetor3(vetor); return 0; } PONTEIROS – ARITMÉTICA 10 Ø Faça o seguinte teste: #include <stdio.h> int main(void) { int vet[] = {4, 9, 12}; int i, *ptr; ptr = vet; for(i = 0 ; i < 3 ; i++) { printf(" %d ",*ptr++); } return 0; } Ø ... e depois, tente: #include <stdio.h> int main(void) { int vet[] = {4, 9, 12}; int i, *ptr; ptr = vet; for(i = 0 ; i < 3 ; i++) { printf(" %d ",(*ptr)++); } return 0; } // 4 9 12 // 4 5 6 Ø Cuidado com ponteiros! VISUALIZANDO A MEMÓRIA 11 Ø Estudo de caso: #include <stdio.h> int main(void) { int numeros[10]= {1,2,3,4,5,6,7,8,9,0}; int* pnum = numeros; int i, bytes; for (i=0, bytes=0; i < 10; ++i, bytes+=4) { printf("Elemento %d : %d + ”, i, pnum); printf(”%d bytes = %d”, bytes, (pnum+i)); printf(”\n”); } return 0; } VISUALIZANDO A MEMÓRIA 12 ü Elemento 0: 0xbfa5ce0c + 0 bytes = 0xbfa5ce0c ü Elemento 1: 0xbfa5ce0c + 4 bytes = 0xbfa5ce10 ü Elemento 2: 0xbfa5ce0c + 8 bytes = 0xbfa5ce14 ü Elemento 3: 0xbfa5ce0c + 12 bytes = 0xbfa5ce18 ü Elemento 4: 0xbfa5ce0c + 16 bytes = 0xbfa5ce1c ü Elemento 5: 0xbfa5ce0c + 20 bytes = 0xbfa5ce20 ü Elemento 6: 0xbfa5ce0c + 24 bytes = 0xbfa5ce24 ü Elemento 7: 0xbfa5ce0c + 28 bytes = 0xbfa5ce28 ü Elemento 8: 0xbfa5ce0c + 32 bytes = 0xbfa5ce2c ü Elemento 9: 0xbfa5ce0c + 36 bytes = 0xbfa5ce30 VETORES DE PONTEIROS 13 Ø Em C/C++ é possível criar vetores de ponteiros. Ø Exemplo: #include <stdio.h> int main(void) { char *linuxDistro[6] = { "Debian", "Ubuntu", "OpenSuse","Fedora", "Linux Mint", "Mandriva"}; for ( int i=0; i < 6; i++) printf("%s", linuxDistro[i]); return 0; } VETORES DE PONTEIROS 14 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [0] ‘D’ ‘e’ ‘b’ ‘i’ ‘a’ ‘n’ \0 [1] ‘U’ ‘b’ ‘u’ ‘n’ ‘t’ ‘u’ \0 [2] ‘O’ ‘p’ ‘e’ ‘n’ ‘S’ ‘u’ ‘s’ ‘e’ \0 [3] ‘F’ ‘e’ ‘d’ ‘o’ ‘r’ ‘a’ \0 [4] ‘L’ ‘i’ ‘n’ ‘u’ ‘x’ ‘ ’ ‘M’ ‘i’ ‘n’ ‘t’ \0 [5] ‘M’ ‘a’ ‘n’ ‘d’ ‘r’ ‘i’ ‘v’ ‘a’ \0 ARGUMENTOS DE PROGRAMA 15 Ø Em C/C++ pode-se usar a linha de comando para recuperar os argumentos passados ao programa. Ø Utilizam-se duas estruturas básicas: ü int argc: total de argumentos passados ü char *argv[]: ponteiro para strings Ø A funçãomain principal pode ser declarada das seguintes maneiras: ü int main (int argc, char *argv[]) {} ü int main (int argc, char **argv) {} ARGUMENTOS DE PROGRAMA 16 Ø Exemplo: #include <stdio.h> int main (int argc, char *argv[]) { if (argc < 2) printf(”Quantidade de argumentos invalida!"); else{ //resto do programa printf(”Eu sou o programa %s - param %d ", argv[0], atoi(argv[1])); } } ALOCAÇÃO DINÂMICA ALOCAÇÃO DINÂMICA 17 Ø Alocação estática. ü int num; ü char v[10]; Ø E quando a quantidade de memória a alocar for conhecida somente em tempo de execução? ü ptr=malloc(tam); ü free(ptr); Ø Essas funções usam a seguinte biblioteca: stdlib ü #include <stdlib.h> ALOCAÇÃO DINÂMICA 18 Ø Qual o tamanho dos valores a serem armazenados? ü Função sizeof (tipo) Ø Exemplo: #include <stdio.h> #include <stdlib.h> int main (void) { int *ptr, *aux, qtd, i; printf("Quantos nros vc vai digitar?"); scanf ("%d", &qtd); ptr = malloc(qtd * sizeof(int)); aux = ptr; // Guarda o endereço inicial for(i=0; i<qtd; i++, ptr++) scanf ("%d", ptr); // Guarda o conteúdo e avança o endereço ptr = aux; // Retorna a referência do endereço inicial for(i=0; i<qtd; i++, ptr++) printf("%d", *ptr); free(ptr); return 0; } ALOCAÇÃO DINÂMICA 19 Ø E com tipos definidospelo programador? Ø Exemplo: #include <stdio.h> #include <stdlib.h> typedef struct { int dia, mes, ano; } data; int main (void) { data *d; d = malloc( sizeof (data)); d->dia = 1; d->mes = 12; d->ano = 2015; printf("%d %d %d\n", d->dia, d->mes, d->ano); free(d); return 0; } ALOCAÇÃO DINÂMICA 20 Ø E com vetores? Ø Exemplo: #include <stdio.h> #include <stdlib.h> int main (void) { int *v; int n, i; scanf( "%d", &n); v = malloc( n * sizeof (int)); for (i = 0; i < n; ++i) scanf( "%d", &v[i]); for (i = n; i > 0; --i) printf( "%d ", v[i-1]); free(v); return 0; } ATIVIDADE LABORATÓRIO 21 Ø As atividades do laboratório da aula de hoje estão no Moodle.
Compartilhar