UNIVERSIDADE DO VALE DO RIO DOS SINOS – UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS – CENTRO 6 Disciplina: Linguagem de Programação C Prof ª Viviane Todt Diverio Ponteiros e Matrizes Ponteiros Um ponteiro é um endereço de uma variável na memória. Uma variável ponteiro é uma variável capaz de armazenar o endereço de outra. & devolve o endereço do operando (ex.: uso na função “scanf”) * usado para declarar um ponteiro ou devolver o conteúdo de um ponteiro int *b double *c char *s ponteiro para inteiro ponteiro para double ponteiro para caracter Ex.: char a; char *b; a=3; b=&a; printf(“%d”,*b); Exercício: Qual será o valor de count após a execução do seguinte código: int x, *y,count; x=100; count=999; y= &x; count= *y; ________________________________________________________________________________ Matrizes Matriz é o tipo de dado oferecido em “C” para montar coleções de dados do mesmo tipo. Uma matriz precisa ser declarada da mesma maneira que uma variável qualquer de maneira que o compilador possa conhecer o tipo da matriz e reservar espaço de memória suficiente para a mesma. Exs.: int a[5]; double b[3][10]; matriz de uma dimensão (vetor) de cinco elementos (0 a 4) matriz bidimensional: três linhas (0 a 2) e dez colunas (0 a 9) Ponteiros e matrizes - 1 Acesso aos elementos de uma matriz: a) b) através de índices: a[5]=3; b[2][8]=4.3; através de ponteiros: na verdade, a declaração de uma matriz corresponde a declaração de um ponteiro para uma área onde cabem tantos elementos do tipo especificado quanto indicado. É mais rápido acessar as posições da matriz através de ponteiros. Podemos dizer que a declaração de uma matriz corresponde a: int b[15]; significa int *b; sendo que b aponta para uma área de 30 bytes Sabendo disto, é possível acessar os elementos de uma matriz da seguinte forma: void main() { int vet[15]; int *p; int r; for(r=0,p=vet;r<15;r++,p++) printf(“%d %d\n”,vet[r],*p); } Um identificador de matriz é um ponteiro que inicialmente aponta para o primeiro elemento da matriz. Se esse ponteiro for incrementado de um ele passa a apontar automaticamente para o próximo elemento da matriz. É possível ter vários ponteiros apontando para uma mesma matriz. Ponteiros e matrizes - 2 Exs.: void main() { int vet[10]; int *aux, r; for(aux=vet; aux<vet+10;aux++) scanf(“%d”,aux); for(r=0;r<10;r++) scanf(“%d”,&vet[r]); } void main() { int mat[10][5]; int l,c; for(l=0;l<10;l++) for(c=0;c<5;c++) scanf(“%d”,&mat[l][c]); for(l=0;l<10;l++) for(c=0;c<5;c++) printf(“%d”,mat[l][c]); } Inicialização de matrizes: Quando uma matriz é declarada como global ela pode ser inicializada na própria declaração. Ex.: int a[10]={1,2,3,4,5,6,7,8,9,10}; double b[3][3]={ {4.5,3.0,7.8}, {3.2,5.0,9.0}, {8.8,112.15,1003.9} }; Exercícios: 1) Obter valores para um vetor de 8 posições do tipo double. Após, varrer o vetor imprimindo os seus valores. 2) Fazer um programa que lê os valores de um vetor (matriz unidimensional) de 20 posições e verifica quantas vezes o caracter `a` aparece. 3) Fazer um programa que lê os elementos de uma matriz de inteiros com número variável de linhas e de colunas e, em seguida, devolve o maior e o menor elemento da matriz. Ponteiros e matrizes - 3