[CAPÍTULO 1] - [CAPÍTULO 2] - [CAPÍTULO 3]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6] - [PARTE 7]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6] - [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 comandofor
.
#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.
Coloque aqui o seu email