LINGUAGEM: Linguagem C - Capítulo 2 - Parte 7

Vetores para Ponteiros, Ponteiros para Vetores e Ponteiros para Ponteiros

Considere as declarações:
int  * x [10];
 int (* y)[10];
 int * * z;
Questões:
  • O que significam?
  • Quais dos usos abaixo são válidos?
int i,j,k[10],l[10][5],m[5][10];

 x[1] = &i;
 x[3] = j;

 x[5] = k;
 x[7] = k[2];
 x[9] = k + 5;

 x[0] = l[1];
 x[2] = l + 1;
 x[4] = m[1];
 x[6] = &l[3][2];
 x[8] = m[3] + 2;

 y = &i;
 y = k;
 y[2] = k;
 y = &k;

 y = l;
 y = m;
 y = l[1];
 y = m + 2;

 z = k;
 z = l;
 z = m;

Exercícios

  • Seja o seguinte trecho de programa:
int i=3,j=5;
 int *p, *q;
 
 p = &i;
 q = &j;
    • Qual é o valor das seguintes expressões ?
      • p == &i
      • *p - *q
      • **&p
      • 3* - *p/(*q)+7
  • Qual será a saída do programa abaixo supondo que i ocupa o endereço 4094 na memória?
main() {

  int i=5, *p;

  p = &i;

  printf(“%x %d  %d  %d  %d \n”, p,*p+2,**&p,3**p,**&p+4);

}
  • Qual é o resultado do seguinte programa?
#include <conio.h>
#include <stdio.h>

void main(){

      float vet[5] = {1.1,2.2,3.3,4.4,5.5};
      float *f;
      int i;

      f = vet;
      printf("contador/valor/valor/endereco/endereco");
      for(i = 0 ; i <= 4 ; i++){
            printf("\ni = %d",i);
            printf("   vet[%d] = %.1f",i, vet[i]);
            printf("   *(f + %d) = %.1f",i, *(f+i));
            printf("   &vet[%d] = %X",i, &vet[i]);
            printf("   (f + %d) = %X",i, f+i);
      }
}
  • Considere os dois programas abaixo. O que fazem quando executados?
#include <conio.h>
#include <stdio.h>

void main() {
      int vet[] = {4,9,12};

      int i,*ptr;
      ptr = vet;
      for(i = 0 ; i < 3 ; i++) {
           printf("%d ",*ptr++);
      }
}
#include <conio.h>
#include <stdio.h>

void main(){
      int vet[] = {4,9,12};

      int i,*ptr;
      ptr = vet;
      for(i = 0 ; i < 3 ; i++) {
           printf("%d ",(*ptr)++);
      }
}
  • Seja vet um vetor de 4 elementos: TIPO vet[4]. Supor que depois da declaração, vet esteja armazenado no endereço de memória 4092 (ou seja, o endereço de vet[0]). Qual o valor de vet+1, vet+2 e vet+3 se:
    • TIPO = char?
    • TIPO = int?
    • TIPO = float?
  • O que significam as seguintes declarações:
int * pi;
 int ** ppi;
 int * vpi[5];
 int (* pvi)[3];
 int (* pmi)[3][5];
 int * mpi[5][3];
  • Dê exemplo de uma declaração de:
    • vetor para ponteiros para matrizes
    • ponteiro para vetor de matrizes
    • matriz de vetores de ponteiros
    • matriz de ponteiros para vetores
  • Reescreva o programa abaixo, substituindo o comando while pelo comando for.
#include <stdio.h>
#define NUMS 5
void main (void)
{
 int nums[NUMS] = {16,54,7,43,-5};
 int total = 0, *n_pt;
 n_pt = nums; /*armazena o endereço de nums[0] em n_pt*/
 while (n_pt < nums + NUMS)
  total+=*n_pt++;
 printf(“O total dos elementos do vetor é %d”, total);
}
  • Determine a saída do seguinte programa:
#include <stdio.h>

void arr(int (*val)[3])
{
 printf(“\n %d”, *(*val));
 printf(“\n %d”, *(*val +1));
 printf(“\n %d”, *(*(val+1)+2));
 printf(“\n %d”, *(*val)+1);
}

void main (void)
{
 int nums[2][3]={{33,16,29},{54,67,99}};
 arrs(nums);
}
  • Dada a declaração para val na função arr, a referência val[1][2] é válida dentro da função? 
Bibliografia e fonte:

  • [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
  • LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
  • [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
  • DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
  • Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.