[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Pilha



On Sun, Mar 24 2002 at 11:36:51pm -0300, Ivan Neto wrote:
> Mas e se um dos argumentos da função chamada for um array? Como a função 
> chamadora coloca esse array na pilha?

Em C, um array consiste, na verdade, em um apontador para o endereco
"base" de um buffer de tamanho conhecido. Entao, em 99.999...% dos casos,
voce nao passa um array para uma funcao, voce passa apenas o apontador
para a base do array. Ou seja, voce passa o apontador por valor (voce cria
uma copia do valor do apontador e passa essa copia), mas o array mesmo (ou
seja, os dados) voce passa por referencia (ou seja, nao copia pra lugar
nenhum; a funcao chamada "pega" o endereco que foi passado por valor e o
usa para acessar diretamente os dados do array). Isso e' otimo, pois
significa que voce nao precisa fazer um monte de operacoes de copias de
elementos pra la' e pra ca' (e' muito mais rapido).

Em linguagem C, acho que nem e' possivel passar um array por valor (nao
consigo imaginar um jeito razoavel de forcar os dados a serem empilhados).
Em C++, talvez seja possivel passar um <vector> por valor (mas nao tenho
certeza).  Em linguagem de montagem, seria possivel, mas bem estupido
(teria que fazer um "loop" para empilhar todos os dados e depois chamar a
funcao).

No caso do EP, a funcao que voces precisam escrever em linguagem de
montagem recebe como parametro, justamente, os apontadores para os dois
"arrays" de dados. Com esses apontadores, a funcao pode acessar todos os
elementos do array, independentemente de eles terem sido alocados na pilha
("short x[100]") ou no "heap" ("short *x; x = malloc(...)").

Ate' +
Nelson