Advertisement
Guest User

Untitled

a guest
May 19th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.29 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int main (void)
  4. {
  5.     /*float far[2][2] = { {3.14, 2.72}, {9.8, 1.42}};
  6.     //printf("Endereco de far[0][0] eh igual ao endereco de far: %p %p\n", &(far[0][0]), far);
  7.     printf("Valor de *far: %p\n", *far);
  8.     printf("Valor de **far: %fn" **(far));
  9.     printf("Endereco de far: %p == %p == %p\tValor: %f\n", far, far[0], &(far[0][0]), **(far));
  10.     //printf("Endereco de far: %p == %p == %p\tValor: %f\n", far, far[1], &(far[1][0]), *(far[1]));
  11.     //printf("%f\n", (*(&*(far[1] - 2) + 1) + 1));
  12.  
  13.     //char* end = (char*) far[1] + 0;
  14.     //printf("%p %p", end, &far[1][0]);
  15.     return 0;*/
  16.  
  17.  
  18.     int N = 3;
  19.     float* endf;
  20.     double* endd;
  21.  
  22.     double vet[4] = {4.4, 3.3, 2.2, 1.1};
  23.     float mat[2][2] = {{4.0, 3.0}, {2.0, 1.0}};
  24.  
  25.     endd = vet+1;
  26.     endf = (float*) mat; // converte endereco float** em float*
  27.  
  28.  
  29.     printf("******************************** ITEM A ********************************\n\n");
  30.     // Hipótese: o valor de endd é o endereço de vet + 1; logo, o valor de *endd é o mesmo valor de vet[1]
  31.     printf("%p == %p -> %lf == %lf\n", endd, vet + 1, *endd, vet[1]);
  32.     // Resultado: CORRETO!
  33.  
  34.     // Hipótese: mat é o endereço de mat[0] + 0, de modo que endf armazena esse endereço; logo, mat[0][0] e *endf tem o mesmo valor
  35.     printf("%p == %p == %p => %lf == %lf == %f\n", mat[0] + 0, mat, endf, mat[0][0], **mat, *endf);
  36.     // Resultado: CORRETO!
  37.  
  38.  
  39.     printf("\n\n******************************** ITEM B ********************************\n\n");
  40.  
  41.     // Hipótese: endd + 1 é do tipo double*, logo *(endd + 1) é do tipo double e aponta para vet[2] = 2.2
  42.     printf("%f\n", *(endd + 1));
  43.     // Resultado: CORRETO!
  44.  
  45.     // Hipótese: endd - 1 é do tipo double*, logo endd - 1 é o mesmo valor do que vet
  46.     printf("%p == %p\n", endd - 1, vet);
  47.     // Resultado: CORRETO!
  48.  
  49.     // Hipótese: mat é do tipo float**, o resultado de mat é um ponteiro para o endereço mat[0] + 0
  50.     printf("%p == %p\n", mat, mat[0] + 0);
  51.     // Resultado: CORRETO
  52.  
  53.     // Hipótese: *mat é do tipo float*, o resultado de mat é um ponteiro para o endereço mat[0], que é o mesmo que mat[0] + 0,
  54.     // isto é, dá o mesmo resultado do que a pergunta anterior
  55.     printf("%p == %p\n", *mat, mat[0]);
  56.     // Resultado: CORRETO
  57.  
  58.     // Hipótese: mat[0] é do tipo float*, logo o resultado é um ponteiro para o endereço mat[0], ou seja, o mesmo que o anterior
  59.     printf("%p == %p\n", mat, mat[0]);
  60.     // Resultado: CORRETO
  61.  
  62.     // Hipótese: **mat é do tipo float, logo o resultado é um float; em particular, ele é igual a mat[0][0]
  63.     printf("**mat == %f == mat[0][0] == %f\n", **mat, mat[0][0]);
  64.     // Resultado: CORRETO
  65.  
  66.     // Hipótese: **(mat + 1) é do tipo float; em particular, ele é igual a mat[1][0]
  67.     printf("**(mat + 1) %f == mat[1][0] == %f\n", **(mat + 1), mat[1][0]);
  68.     // Resultado: CORRETO
  69.  
  70.     // Hipótese: endd é do tipo double* (em particular, ele aponta para vet + 1), *endd é do tipo double e é vet[1], logo (*endd) + 3 é vet[1] + 3
  71.     printf("%f == %f\n", (*endd) + 3, vet[1] + 3);
  72.     // Resultado: CORRETO
  73.  
  74.     // Hipótese: endd é do tipo double* (em particular, ele aponta para vet + 1); endd + 3 aponta para vet + 4, que é double*,
  75.     // mas vet + 4 está FORA dos limites do vetor e, portanto, aponta para um local desconhecido da memória. Logo, o valor de *(endd + 3)
  76.     // é desconhecido.
  77.     printf("vet + 3 = %p\tvet + 4 = %p\t (endd + 3) = %p\t*(endd + 3) = %lf\n", vet + 3, vet + 4, (endd + 3), *(endd + 3));
  78.     // Resultado: Aparentemente correto... (?)
  79.  
  80.     // Hipótese: vet + 1 é double*, *(vet + 1) é double e é igual a 3.3, *(vet + 1) + 3 é double igual a 6.3
  81.     printf("%lf == %lf\n", *(vet + 1) + 3, vet[1] + 3);
  82.     // Resultado: CORRETO
  83.  
  84.     // Hipótese: vet é double*, *vet é double (em particular, é igual a 4,4), ((*vet) + 1) é double e igual a 5.4, ((*vet) + 1) + 3 é double igual a 8.4
  85.     printf("%lf == %lf\n", (((*vet) + 1) + 3), ((vet[0]) + 1) + 3);
  86.     // Resultado: CORRETO
  87.  
  88.     // Hipótese: vet[1] é o mesmo que *(vet + 1) e ambos são double; logo, &(vet[1]) é do tipo double*, assim como vet + 1, e ambos apontam para
  89.     // o mesmo endereço
  90.     printf("%p == %p && %lf == %lf\n", &(vet[1]), vet + 1, vet[1], *(vet + 1));
  91.     // Resultado: CORRETO
  92.  
  93.     // Hipótese: endf é do tipo float* e aponta para mat[0] + 0, (char*) endf é do tipo char* e aponta para mat[0] + 0
  94.     // ...
  95.     // (char*) endf + 2 é do tipo char* e avança 2 BYTES na memória (pois a aritmética de ponteiros para char* assume tamanho de 1 byte),
  96.     // de modo que aponta para o TERCEIRO BYTE ocupado por mat[0] + 0 (que, por ser float, ocupa 4 bytes)
  97.  
  98.     printf("\nendff == mat[0] + 0 i.e. %p == %p\nendff aponta para ao primeiro byte de mat[0] + 0\n", endf, mat[0] + 0);
  99.     printf("1º byte de mat[0] + 0: %p\n2º byte de mat[0] + 0: %p\n3º byte de mat[0] + 0: %p\n", ((char*)endf), ((char*)endf) + 1, ((char*)endf) + 2, ((char*)endf) + 3);
  100.     printf("4º byte de mat[0] + 0 eh, na verdade, mat[0] + 1, pois floats ocupam 4 bytes\n");
  101.     printf("%p == %p\n", ((char*)endf) + 4, mat[0] + 1);
  102.     printf("Respondendo a pergunta em especifico: ((char*)endf) + 2 eh o TERCEIRO byte de mat[0] + 0: %p\n", ((char*)endf) + 2);
  103.  
  104.     // Resultado: Aparentemente correto... (?)
  105.  
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement