1 - Explique as diferenças entre a passagem por valor e a passagem por referência em uma função. Exemplifique com a função "dobro" feita em sala. Passagem por valor: A função recebe uma cópia da variável que é passada quando for chamada. As alterações são feitas dentro da função e não altera os valores originais. #include<stdio.h> //passagem de parametro por valor int dobroValor(int num){ num=num*2; return num; } //passagem de parametro por referencia void dobroReferencia(int *num){ *num = 2*(*num); } void main(){ int num=10; printf("\n Valor de num antes da chamada: %d\n",num); resposta: 10 dobroValor(num);// forma incorreta da pass. por valor printf("\n Valor de num depois da chamada: %d\n",num); resposta: 10 printf("\n Valor de num antes da chamada: %d\n",num); resposta: 10 num=dobroValor(num);// forma correta da pass. por valor // como uma variável está recebendo o valor retornado pela função sofrerá alteração. printf("\n Valor de num depois da chamada: %d\n",num); resposta: 20 int num2=10; printf("\n Valor de num antes da chamada: %d\n",num2); resposta: 10 dobroReferencia(&num2);// forma correta da pass. por valor printf("\n Valor de num depois da chamada: %d\n",num2); resposta: 20 } 2 - Defina os conceitos de listas, pilhas e filas, destacando as principais diferenças entre as mesmas. Lista: conjuntos de elementos, objetos, variáveis, tarefas ou qualquer coisa que se possa enumerar e formar um conjunto. Exemplo: Lista de compra. Fila: FIFO “primeiro a chegar é o primeiro a sair”. A ordem de inserção e remoção de objetos simula o empilhamento desses objetos. Um nove elemento da fila somente pode ser inserido na último posição(fim da fila) e o elemento só pode ser removido da primeira posição(inicio da fila). Pilha: LIFO “último a entrar, primeiro a sair”. Insere-se elementos no topo da pilha e remove-se ou utiliza-se o elemento que estiver no topo da pilha. 3 - Explique por que o tamanho de um ponteiro para int é o mesmo tamanho de um ponteiro para char, uma vez que o tamanho de um int não é o mesmo tamanho de um char. O endereço é o mesmo tamanho e o que muda é o tamanho alocado na memória. Cada objeto na memória do computador tem um endereço. Na maioria dos computadores, o endereço de um objeto é o endereço do seu primeiro byte. 4 - Esquematize (com um desenho dos "quadradinhos") o endereçamento de memória de uma estrutura do tipo "endereço_residencial", a qual contém: nome da rua (ponteiro para char), numero da casa (inteiro), bairro (ponteiro para char) e cidade (ponteiro para char). No mesmo esquema, explique para onde aponta um ponteiro para esta estrutura. Por fim, mostre o tamanho (sizeof) desta estrutura, explicando o porquê deste tamanho. Char *Nome da rua 1356 Int Numero da casa 1895 Char *Bairro 1958 Char *Cidade 2840 Sempre que declaramos uma variável em C, estamos guardando, selecionando ou alocando um espaço de bytes desses, e dependendo do tipo de variável, o tanto de memória reservada varia. Cada objeto na memória do computador ocupa um certo número de bytes consecutivos. No meu computador, um char ocupa 1 byte, um int ocupa 4 bytes e um double ocupa 8 bytes. A variável do tipo char *Bairro está armazenada no endereço 1958 e usa um byte de memória. O compilador é que controla do local de armazenamento destas variáveis em memória. Quando um ponteiro (a variável) contém um determinado endereço, dizemos que ele aponta para o endereço de memória. Além disso, se o valor deste ponteiro é o endereço de uma outra variável qualquer, dizemos que tal ponteiro aponta para esta outra variável. 5 - Explique quando devemos usar "." e quando devemos utilizar "->" para acessar os membros de uma estrutura. Mostre um exemplo. Uma struct consiste em vários dados agrupados em apenas um. Para acessar cada um desses dados, usamos um ponto“.”para indicar que o nome seguinte é o nome do membro. Um ponteiro guarda o endereço de memória que pode ser acessado diretamente.