Melhores momentos AULA 5 Endereços: a memóra é um etor e o índce desse etor onde está uma aráel é o endereço da aráel. Com o oerador & obtemos o endereço de uma aráel. Exemlos: & é o endereço de &onto é o endereço da estrutura onto &[2] é o endereço de [2] Ponteros: são aráes que armazenam endereços. Exemlos: nt *; /* ontero ara nt*/ char *q; /* ontero ara char*/ double *r; /* ontero ara double*/ Dereferencação: Se aonta ara a aráel, então * é snônmo de. = &; /* aonta ara / (*)++; é o mesmo que ++; * = Artmétca de onteros: se é um aontador ara um nt e o seu conteúdo é 64542, então + é 64546, os um nt ocua 4 bytes (no meu comutador...). + +2 +5 +9 [] [] [9] Vetores e onteros: o nome de um etor é snônmo do endereço da osção ncal do etor. nt []; é snônmo de &[] + é snônmo de &[] +2 é snônmo de &[2]... + +2 +5 +9 [] [] [9]
Vetores e onteros: o nome de um etor é snônmo do endereço da osção ncal do etor. nt []; * é snônmo de [] *(+) é snônmo de [] *(+2) é snônmo de [2]... + +2 +5 +9 Vetores como arâmetros Como arâmetros formas de uma função, e char s[ ]; char *s; são equalentes. O Kernghan e Rtche referem a segunda os dz mas exlctamente que a aráel é um aontador. Outro exemlo nt man(nt argc, char **arg); [] [] [9] Hoje AULA 6 alocação dnâmca de memóra Alocação dnâmca de memóra Alocação dnâmca PF Aêndce F htt://www.me.us.br/ f/algortmos/aulas/aloca.html The C rogrammng Language Bran W. Kernghan e Denns M. Rtche Prentce-Hall Fonte: htt://www.coderoject.com/
Alocação dnâmca As ezes, a quantdade de memóra que o rograma necessta só se torna conhecda durante a execução do rograma. Para ldar com essa stuação é recso recorrer à alocação dnâmca de memóra. A alocação dnâmca é gerencada elas funções e free, que estão na bbloteca stdlb #nclude <stdlb.h> A função aloca um bloco de bytes consecutos na memóra e deole o endereço desse bloco. tr char *tr; tr = (); scanf("%c",tr); tr tyedef struct { nt da,mes,ano; Data; Data *d; d = (szeof(data)); Se é ontero ara uma estrutura então ->camo-da-estrutura é uma abreatura de (*).camo-da-estrutura d->da=3; d->mes=2; d->ano=28; d d da mes d 3 2 da mes ano 28 ano A memóra é nta A memóra é nta Se não consegue alocar mas esaço então retorna NULL. tr = (szeof(data)); f (tr == NULL) { rntf("socorro! deoleu NULL!\n"); ext(exit_failure); É conenente usarmos a função od *Safe (nt nbytes) { od *tr; tr = (nbytes); f (tr == NULL) { rntf("socorro! deoleu " "NULL!\n"); ext(exit_failure); return tr;
free Vetores dnamcamente nt *; nt, n; Fonte: htt://www.zazzle.com.br/ A função free lbera a memóra alocada or. free(d); Há essoas que or questões de segurança gostam de atrbur NULL a um ontero deos da lberaçõa de memóra free(d); d = NULL; rntf("dgte o tamanho do etor: "); scanf("%d", &n); = Safe(n*szeof(nt)); for ( = ; < n; ++) *(+) = ; /* [] = ; */ for ( = ; < n; ++) rntf("end. [%d] = % cont [%d] = %d\n",, (od*)(+),, []); free(); Matrzes dnâmcas Matrzes dnâmcas Matrzes bdmensonas são mlementadas como etores de etores. a m = 6 n = 7 nt **a; nt ; a = Safe(m * szeof(nt*)); for ( = ; < m; ++) a[] = Safe(n * szeof(nt)); 2 a [2] [3] == 7 2 3 4 5 6 5 3 7 3 8 O elemento de a que está na lnha e coluna j é a[][j]. 3 4 5 6 2 6 4 2 8 Lberação de memóra de matrzes Para lberarmos a memóra alocada dnamcamente ara uma matrz deemos segur os assos nersos aos da alocação trocando Safe or free. od freematrzint(nt **a) { nt ; for ( = ; < m; ++){ free(a[]); /* lberar a lnha */ a[] = NULL; free(a);/* lbera etor de onteros */ a = NULL; a nt a[3][4]; Matrzes automátcas a [] [2] == 8 2 3 2 3 2 3 8 4 a a a [] [] [2]
Passagem de arâmetros Suonha que temos os rotótos de funções od f(nt **m); nt g(nt m[][64]); e as declarações nt **a; nt m[6][64]; então temos que f(a); /* ok */ = g(a); /* erro */ = g(m); /* ok */ f(m); /* erro */