Uma matriz pode ser criada pela utilização de ponteiros para ponteiros. Para isso, a dimensão que representa

as linhas é implementada como um vetor de ponteiros para ponteiros. Cada item da linha faz referência à um vetor de ponteiros, com a dimensão da quantidade de colunas, para o armazenamento das informações propriamente dito. Para essa questão, analise o código a seguir para a remoção da matriz previamente criada através da alocação dinâmica de memória e preencha as lacunas: float ___RemoveMatriz(int n_linhas, float ___matriz)
{
int i;
if (matriz==NULL)
return NULL;
for (i=0; i free (___);
free(___);
return NULL;
}

int main()
{
float **mat;
mat = CriarMatriz(5,5);
if(mat==NULL)
{
printf("Erro criacao da matriz.n");
return 0;
}
mat = RemoveMatriz(5,mat);
return 0;
}
Assinale a alternativa que apresenta a sequência correta das lacunas preenchidas.

* ; * ; matriz[i]; matriz.

** ; ** ; matriz; matriz[i].

* ; ** ; matriz[i]; matriz.

. ** ; ** ; matriz[i]; matriz.

* ; * ; matriz; matriz[i].

1 Resposta

  • Tai

    Os conceitos de endereço e ponteiro são fundamentais em qualquer linguagem de programação. Em C, esses conceitos são explícitos; em algumas outras linguagens eles são ocultos (e representados pelo conceito mais abstrato de referência).  Dominar o conceito de ponteiro exige algum esforço e uma boa dose de prática.

    Endereços

    A memória RAM (= random access memory) de qualquer computador é uma sequência de bytes.  A posição (0, 1, 2, 3, etc.) que um byte ocupa na sequência é o endereço (= address) do byte.  (É como o endereço de uma casa em uma longa rua que tem casas de um lado só.)  Se e é o endereço de um byte então e+1 é o endereço do byte seguinte.

    Cada variável de um programa ocupa um certo número de bytes consecutivos na memória do computador. Uma variável do tipo char ocupa 1 byte.  Uma variável do tipo int ocupa 4 bytes e um double ocupa 8 bytes em muitos computadores.  O número exato de bytes de uma variável é dado pelo operador sizeof. A expressão sizeof (char), por exemplo, vale 1 em todos os computadores e a expressão sizeof (int) vale 4 em muitos computadores.

    Cada variável (em particular, cada registro e cada vetor) na memória tem um endereço. Na maioria dos computadores, o endereço de uma variável é o endereço do seu primeiro byte. Por exemplo, depois das declarações

     char c;

     int i;

     struct {

        int x, y;

     } ponto;

     int v[4];

    as variáveis poderiam ter os seguintes endereços (o exemplo é fictício):

     c        89421

     i        89422

     ponto    89426

     v[0]     89434

     v[1]     89438

     v[2]     89442

    O endereço de uma variável é dado pelo operador  & .  Assim, se  i  é uma variável então  &i  é o seu endereço.  (Não confunda esse uso de & com o operador lógico and, que se escreve && em C.)  No exemplo acima,  &i  vale 89422  e  &v[3]  vale 89446.

    Outro exemplo: o segundo argumento da função de biblioteca scanf é o endereço da variável que deve receber o valor lido do teclado:

     int i;

     scanf ("%d", &i);

    Exercícios 1

    Tamanhos.  Compile e execute o seguinte programa:

    int main (void) {

     typedef struct {

        int dia, mes, ano;  

     } data;

     printf ("sizeof (data) = %dn",  

              sizeof (data));

     return EXIT_SUCCESS;

    }

    Compile e execute o seguinte programa. (O cast (long int) é necessário para que &i possa ser impresso com especificação de formato %ld. É mais comum imprimir endereços em notação hexadecimal, usando a especificação de formato %p, que exige o cast (void *).)

    int main (void) {

     int i = 1234;  

     printf (" i = %dn", i);

     printf ("&i = %ldn", (long int) &i);

     printf ("&i = %pn", (void *) &i);

     return EXIT_SUCCESS;

    }

    Ponteiros

    Um ponteiro (= apontador = pointer) é um tipo especial de variável que armazena um endereço.  Um ponteiro pode ter o valor

    NULL

    que é um endereço inválido.  A macro NULL está definida na interface stdlib.h e seu valor é 0 (zero) na maioria dos computadores.

    Se um ponteiro p armazena o endereço de uma variável i, podemos dizer  p aponta para i  ou  p é o endereço de i.  (Em termos um pouco mais abstratos, diz-se que p é uma referência à variável i.)  Se um ponteiro p tem valor diferente de NULL então

    *p

    é o valor da variável apontada por p.  (Não confunda esse operador * com o operador de multiplicação!)  Por exemplo, se i é uma variável e p vale &i então dizer *p é o mesmo que dizer i.

    A seguinte figura dá um exemplo. Do lado esquerdo, um ponteiro p, armazenado no endereço 60001, contém o endereço de um inteiro.  O lado direito dá uma representação esquemática da sit

    Explicação:

Clique aqui para adicionar a sua resposta.