Bootstrap

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

jakezika

- Lógica

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; ifree (___);
free(___);
return NULL;
}

int main()
{
float **mat;
mat = CriarMatriz(5,5);
if(mat==NULL)
{
printf("Erro criacao da matriz. ");
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) = %d ",  

          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 = %d ", i);

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

 printf ("&i = %p ", (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:

Mais perguntas de Lógica