Departamento de Informtica e Cincias da Computao Linguagem de Programao I Ponteiros e Matrizes Multidimensionais Professor: Joo Paulo id29818187 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Ponteiros e Matrizes Multidimensionais Ponteiros e matrizes multidimensionais Vimos que uma vez que matrizes unidimensionais podem ser representadas por um ponteiro (o nome da matriz) e por um deslocamento (incremento), razovel imaginar que uma matriz multidimensional pode ser representada com uma notao ponteiro equivalente. Uma matriz bidimensional , na realidade, uma coleo de matrizes unidimensionais. Podemos defini-la como um ponteiro para um grupo de matrizes unidimensionais contguas. Ponteiros e matrizes multidimensionais Declarao tipo (*ptr)[expr2] Ao invs de: tipo matriz [expr1][expr2] Generalizao tipo (*ptr)[expr2][expr3]...[exprn] Que substitui: tipo matriz [expr1] [expr2] ... [exprn] Ponteiros e matrizes multidimensionais Exemplo: suponha que x seja uma matriz inteira bidimensional com 10 linhas e 20 colunas. Podemos declarar x como int (*x)[20] Ao invs de: int x[10][20] Na primeira declarao x definido como um ponteiro para (elementos que so) matrizes inteiras unidimensionais de tamanho 20 contguos. Ponteiros e matrizes multidimensionais ... ... ... x x+1 x+9 . . . . . . . . . . . . . . . . . . . . . Este elemento pode ser acessado por *(*(x+1)+5) Ponteiros e matrizes multidimensionais Como podemos acessar, por exemplo, o item na linha 1, coluna 5? x[1][5] ou *(*(x+1)+5) Primeiro, (x+1) um ponteiro para a linha 1. Portanto, o objeto desse ponteiro, *(x+1), refere-se linha inteira. Como a linha 1 uma matriz unidimensional, *(x+1) , na realidade, um ponteiro para o primeiro elemento da linha 1. Adicionamos 5 a esse ponteiro. Por isso, (*(x+1)+5) um ponteiro para o elemento 5 (na realidade o sexto elemento) da linha 1. O objeto desse ponteiro *(*(x+1)+5). Exemplo #include <stdio.h> #include <conio.h> int main() { int x[10][20]; int (*pt_matriz)[20]; int i,j; for (i=0; i<10; i++) for (j=0; j<20; j++) x[i][j] = i + j; pt_matriz = x; j=0; for (i=0; i<10; i++){ printf("Valor de x[%d][%d]= %d.\n",i,j,*(*(pt_matriz+i)+j)); j++; } getch ( ); return(0); } Matrizes de Ponteiros Uma matriz multidimensional pode ser expressa como uma matriz de ponteiros em vez de um ponteiro para um grupo de matrizes contguas. Notao tipo *matriz[expr1]; Ao invs da definio anterior tipo (*matriz)[expr2]; E tambm ao invs da definio convencional tipo matriz[expr1][expr2]; notar a diferena Matrizes de Ponteiros Notao tipo *matriz[expr1]; Observe que o nome da matriz e o asterisco no esto entre parntesis. ... ... ... . . . . . . . . . . . . . . . . . . . . . X[0] X[1] X[9] Matrizes de Ponteiros Esse elemento pode ser acessado por *(x[1]+5) Mais Sobre Declarao de Ponteiros Declaraes de ponteiros podem ser complicadas e necessrio algum cuidado na sua interpretao, principalmente nas que envolvem funes e matrizes. Uma das dificuldades o uso de parntesis que tem duas utilidades Indicar funes Indicar precedncia Mais Sobre Declarao de Ponteiros O que significa int *p(int a)? Uma funo que aceita um argumento int e retorna um ponteiro para int. O que significa int (*p)(int a)? Um ponteiro para uma funo que aceita um argumento inteiro e retorna um inteiro Primeiro par de parntesis = precedncia (ou aninhamento) Segundo par de parntesis = funo Mais Sobre Declarao de Ponteiros O que significa int *(*p)(int(*a)[])? Um ponteiro para uma funo que aceita um ponteiro para uma matriz de inteiros como argumento e retorna um ponteiro para um int. O que significa int (*p)(char(*a)[])? p um ponteiro para uma funo que aceita um ponteiro para uma matriz de caracteres como argumento e retorna um valor inteiro. Mais Sobre Declarao de Ponteiros O que significa int *(*p)(char *a[])? p um ponteiro para uma funo que aceita uma matriz de ponteiros para caracteres como argumento e retorna um ponteiro para inteiros. O que significa int *(*p[7])(char a)? p uma matriz de ponteiros (com 7 elementos) para funes; cada funo aceita um caracter como argumento e retorna um ponteiro para um inteiro. Mais Sobre Declarao de Ponteiros O que significa int (*p[7])(char a)? p uma matriz de ponteiros (com 7 elementos) para funes; cada funo aceita um caractere como argumento e retorna um valor inteiro. O que significa int *(*p[7])(char *a)? p uma matriz de ponteiros (com 7 elementos) para funes; cada funo aceita um ponteiro para caractere como argumento e retorna um ponteiro para um inteiro.