#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef double **tabla;

/* Variables and functions */
int /*<<< orphan*/ printf(char *, ...);
int main() {
  float tabla[2][3] = {{1.1, 1.2, 1.3}, {2.1, 2.2, 2.3}};
  printf("\nEl valor de tabla es → %p \n", tabla);
  printf("\n¿Cual es el significado de tabla?\n");
  printf("Es una matriz bidimensional de 2x3 expresada con aritmetica de "
         "punteros\n\n");
  printf("¿Cual es el significado de (tabla+1)?\n");
  printf("La dirección de comienzo de la tabla + 1 → %p\n\n", (tabla + 1));
  printf("¿Cual es el significado de *(tabla+1)?\n");
  printf("Es un puntero a la fila 1 → %p\n\n", *(tabla + 1));
  printf("¿Cual es el significado de (*(tabla+1)+1)?\n");
  printf("Puntero que apunta a la dirección de memoria tabla[1][1] → %p\n\n",
         (*(tabla + 1) + 1));
  printf("¿Cual es el significado de (*(tabla)+1)?\n");
  printf("Apuntar a la fila 0 col 1 → %p\n\n", (*(tabla) + 1));
  printf("¿Cual es el valor de *(*(tabla+1)+1)?\n");
  printf("Contenido de la posición de tabla [1][1] → %f \n\n",
         *(*(tabla + 1) + 1));
  printf("¿Cual es el valor de *(*(tabla)+1)?\n");
  printf("Posición [0][1] → %f\n\n", *(*(tabla) + 1));
  printf("¿Cual es el valor de *(*(tabla+1))?\n");
  printf("El valor de *(*(tabla+1)) es (pos [1][0]) → %f\n\n", *(*(tabla + 1)));
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movl   $0x0,-0x4(%rbp)
mov    0xeda(%rip),%rax
mov    %rax,-0x20(%rbp)
mov    0xed7(%rip),%rax
mov    %rax,-0x18(%rbp)
mov    0xed4(%rip),%rax
mov    %rax,-0x10(%rbp)
lea    -0x20(%rbp),%rsi
lea    0xecd(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xede(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xef5(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf31(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    -0x20(%rbp),%rsi
add    $0xc,%rsi
lea    0xf43(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf68(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    -0x20(%rbp),%rsi
add    $0xc,%rsi
lea    0xf7b(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf90(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    -0x20(%rbp),%rsi
add    $0xc,%rsi
add    $0x4,%rsi
lea    0xfa3(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xfd8(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    -0x20(%rbp),%rsi
add    $0x4,%rsi
lea    0xfed(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1002(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0x1013(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
lea    0x1039(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0x1048(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
lea    0x1054(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0x1063(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
xor    %eax,%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    0xee2(%rip),%rax
mov    %rax,0x10(%rsp)
movaps 0xec6(%rip),%xmm0
movaps %xmm0,(%rsp)
lea    0x10(%rsp),%r14
lea    0xece(%rip),%rdi
mov    %rsp,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0x1019(%rip),%rdi
call   1030 <puts@plt>
lea    0x1031(%rip),%rdi
call   1030 <puts@plt>
lea    0x106e(%rip),%rdi
call   1030 <puts@plt>
lea    0xc(%rsp),%rbx
lea    0xeb3(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0x1073(%rip),%rdi
call   1030 <puts@plt>
lea    0xec9(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0x107e(%rip),%rdi
call   1030 <puts@plt>
lea    0xecf(%rip),%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0x108d(%rip),%rdi
call   1030 <puts@plt>
lea    0x4(%rsp),%rsi
lea    0xef0(%rip),%rdi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0x1098(%rip),%rdi
call   1030 <puts@plt>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xeef(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
lea    0x109b(%rip),%rdi
call   1030 <puts@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xeff(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
lea    0x109c(%rip),%rdi
call   1030 <puts@plt>
movss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xef5(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@__const.main.tabla = [2 x [3 x float]] [[3 x float] [float 0x3FF19999A0000000, float 0x3FF3333340000000, float 0x3FF4CCCCC0000000], [3 x float] [float 0x4000CCCCC0000000, float 0x40019999A0000000, float 0x4002666660000000]]
@.str = [31 x i8] c"\0AEl valor de tabla es \E2\86\92 %p \0A\00"
@.str.1 = [37 x i8] c"\0A\C2\BFCual es el significado de tabla?\0A\00"
@.str.2 = [74 x i8] c"Es una matriz bidimensional de 2x3 expresada con aritmetica de punteros\0A\0A\00"
@.str.3 = [40 x i8] c"\C2\BFCual es el significado de (tabla+1)?\0A\00"
@.str.4 = [51 x i8] c"La direcci\C3\B3n de comienzo de la tabla + 1 \E2\86\92 %p\0A\0A\00"
@.str.5 = [41 x i8] c"\C2\BFCual es el significado de *(tabla+1)?\0A\00"
@.str.6 = [35 x i8] c"Es un puntero a la fila 1 \E2\86\92 %p\0A\0A\00"
@.str.7 = [45 x i8] c"\C2\BFCual es el significado de (*(tabla+1)+1)?\0A\00"
@.str.8 = [67 x i8] c"Puntero que apunta a la direcci\C3\B3n de memoria tabla[1][1] \E2\86\92 %p\0A\0A\00"
@.str.9 = [43 x i8] c"\C2\BFCual es el significado de (*(tabla)+1)?\0A\00"
@.str.10 = [35 x i8] c"Apuntar a la fila 0 col 1 \E2\86\92 %p\0A\0A\00"
@.str.11 = [40 x i8] c"\C2\BFCual es el valor de *(*(tabla+1)+1)?\0A\00"
@.str.12 = [52 x i8] c"Contenido de la posici\C3\B3n de tabla [1][1] \E2\86\92 %f \0A\0A\00"
@.str.13 = [38 x i8] c"\C2\BFCual es el valor de *(*(tabla)+1)?\0A\00"
@.str.14 = [26 x i8] c"Posici\C3\B3n [0][1] \E2\86\92 %f\0A\0A\00"
@.str.15 = [38 x i8] c"\C2\BFCual es el valor de *(*(tabla+1))?\0A\00"
@.str.16 = [51 x i8] c"El valor de *(*(tabla+1)) es (pos [1][0]) \E2\86\92 %f\0A\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca [2 x [3 x float]]
store i32 0, i32* %1
%3 = bitcast [2 x [3 x float]]* %2 to i8*
%4 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), [3 x float]* %4)
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.1, i64 0, i64 0))
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([74 x i8], [74 x i8]* @.str.2, i64 0, i64 0))
%8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.3, i64 0, i64 0))
%9 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%10 = getelementptr inbounds [3 x float], [3 x float]* %9, i64 1
%11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([51 x i8], [51 x i8]* @.str.4, i64 0, i64 0), [3 x float]* %10)
%12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.5, i64 0, i64 0))
%13 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%14 = getelementptr inbounds [3 x float], [3 x float]* %13, i64 1
%15 = getelementptr inbounds [3 x float], [3 x float]* %14, i64 0, i64 0
%16 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.6, i64 0, i64 0), float* %15)
%17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.7, i64 0, i64 0))
%18 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%19 = getelementptr inbounds [3 x float], [3 x float]* %18, i64 1
%20 = getelementptr inbounds [3 x float], [3 x float]* %19, i64 0, i64 0
%21 = getelementptr inbounds float, float* %20, i64 1
%22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.8, i64 0, i64 0), float* %21)
%23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.9, i64 0, i64 0))
%24 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%25 = getelementptr inbounds [3 x float], [3 x float]* %24, i64 0, i64 0
%26 = getelementptr inbounds float, float* %25, i64 1
%27 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.10, i64 0, i64 0), float* %26)
%28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.11, i64 0, i64 0))
%29 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%30 = getelementptr inbounds [3 x float], [3 x float]* %29, i64 1
%31 = getelementptr inbounds [3 x float], [3 x float]* %30, i64 0, i64 0
%32 = getelementptr inbounds float, float* %31, i64 1
%33 = load float, float* %32
%34 = fpext float %33 to double
%35 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([52 x i8], [52 x i8]* @.str.12, i64 0, i64 0), double %34)
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.13, i64 0, i64 0))
%37 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%38 = getelementptr inbounds [3 x float], [3 x float]* %37, i64 0, i64 0
%39 = getelementptr inbounds float, float* %38, i64 1
%40 = load float, float* %39
%41 = fpext float %40 to double
%42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.14, i64 0, i64 0), double %41)
%43 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.15, i64 0, i64 0))
%44 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %2, i64 0, i64 0
%45 = getelementptr inbounds [3 x float], [3 x float]* %44, i64 1
%46 = getelementptr inbounds [3 x float], [3 x float]* %45, i64 0, i64 0
%47 = load float, float* %46
%48 = fpext float %47 to double
%49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([51 x i8], [51 x i8]* @.str.16, i64 0, i64 0), double %48)
ret i32 0
}

LLVM IR (-O2):
@__const.main.tabla = [2 x [3 x float]] [[3 x float] [float 0x3FF19999A0000000, float 0x3FF3333340000000, float 0x3FF4CCCCC0000000], [3 x float] [float 0x4000CCCCC0000000, float 0x40019999A0000000, float 0x4002666660000000]]
@.str = [31 x i8] c"\0AEl valor de tabla es \E2\86\92 %p \0A\00"
@.str.4 = [51 x i8] c"La direcci\C3\B3n de comienzo de la tabla + 1 \E2\86\92 %p\0A\0A\00"
@.str.6 = [35 x i8] c"Es un puntero a la fila 1 \E2\86\92 %p\0A\0A\00"
@.str.8 = [67 x i8] c"Puntero que apunta a la direcci\C3\B3n de memoria tabla[1][1] \E2\86\92 %p\0A\0A\00"
@.str.10 = [35 x i8] c"Apuntar a la fila 0 col 1 \E2\86\92 %p\0A\0A\00"
@.str.12 = [52 x i8] c"Contenido de la posici\C3\B3n de tabla [1][1] \E2\86\92 %f \0A\0A\00"
@.str.14 = [26 x i8] c"Posici\C3\B3n [0][1] \E2\86\92 %f\0A\0A\00"
@.str.16 = [51 x i8] c"El valor de *(*(tabla+1)) es (pos [1][0]) \E2\86\92 %f\0A\0A\00"
@str = [36 x i8] c"\0A\C2\BFCual es el significado de tabla?\00"
@str.17 = [73 x i8] c"Es una matriz bidimensional de 2x3 expresada con aritmetica de punteros\0A\00"
@str.18 = [39 x i8] c"\C2\BFCual es el significado de (tabla+1)?\00"
@str.19 = [40 x i8] c"\C2\BFCual es el significado de *(tabla+1)?\00"
@str.20 = [44 x i8] c"\C2\BFCual es el significado de (*(tabla+1)+1)?\00"
@str.21 = [42 x i8] c"\C2\BFCual es el significado de (*(tabla)+1)?\00"
@str.22 = [39 x i8] c"\C2\BFCual es el valor de *(*(tabla+1)+1)?\00"
@str.23 = [37 x i8] c"\C2\BFCual es el valor de *(*(tabla)+1)?\00"
@str.24 = [37 x i8] c"\C2\BFCual es el valor de *(*(tabla+1))?\00"
define i32 @main() {
%1 = alloca [2 x [3 x float]]
%2 = bitcast [2 x [3 x float]]* %1 to i8*
%3 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %1, i64 0, i64 0
%4 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), [3 x float]* %3)
%5 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([36 x i8], [36 x i8]* @str, i64 0, i64 0))
%6 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([73 x i8], [73 x i8]* @str.17, i64 0, i64 0))
%7 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([39 x i8], [39 x i8]* @str.18, i64 0, i64 0))
%8 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %1, i64 0, i64 1
%9 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([51 x i8], [51 x i8]* @.str.4, i64 0, i64 0), [3 x float]* %8)
%10 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([40 x i8], [40 x i8]* @str.19, i64 0, i64 0))
%11 = getelementptr inbounds [3 x float], [3 x float]* %8, i64 0, i64 0
%12 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([35 x i8], [35 x i8]* @.str.6, i64 0, i64 0), float* %11)
%13 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([44 x i8], [44 x i8]* @str.20, i64 0, i64 0))
%14 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %1, i64 0, i64 1, i64 1
%15 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([67 x i8], [67 x i8]* @.str.8, i64 0, i64 0), float* %14)
%16 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([42 x i8], [42 x i8]* @str.21, i64 0, i64 0))
%17 = getelementptr inbounds [2 x [3 x float]], [2 x [3 x float]]* %1, i64 0, i64 0, i64 1
%18 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([35 x i8], [35 x i8]* @.str.10, i64 0, i64 0), float* %17)
%19 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([39 x i8], [39 x i8]* @str.22, i64 0, i64 0))
%20 = load float, float* %14
%21 = fpext float %20 to double
%22 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([52 x i8], [52 x i8]* @.str.12, i64 0, i64 0), double %21)
%23 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([37 x i8], [37 x i8]* @str.23, i64 0, i64 0))
%24 = load float, float* %17
%25 = fpext float %24 to double
%26 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([26 x i8], [26 x i8]* @.str.14, i64 0, i64 0), double %25)
%27 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([37 x i8], [37 x i8]* @str.24, i64 0, i64 0))
%28 = load float, float* %11
%29 = fpext float %28 to double
%30 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([51 x i8], [51 x i8]* @.str.16, i64 0, i64 0), double %29)
ret i32 0
}