[C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)

Iniciado por class_OpenGL, 4 Junio 2016, 18:40 PM

0 Miembros y 1 Visitante están viendo este tema.

class_OpenGL

Hola. Quería preguntar si el hecho de que un arreglo se apunte a si mismo es coincidencia o es una característica de ANSI C, es decir, la dirección del arreglo y la dirección a la que apunta el arreglo es la misma (al menos eso me pasa con MinGW-w64).

int arreglo[4];

if(arreglo == &arreglo) { // Siempre me da 'true'
    ...
}


Gracias

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

geeke

No es coincidencia el estándar garantiza que arreglo y &arreglo siempre apuntaran a la misma dirección (el primer elemento del array) pero tienen tipos diferentes no es lo mismo hacer

Código (cpp) [Seleccionar]
arreglo + 1
Y
Código (cpp) [Seleccionar]
&arreglo + 1

class_OpenGL

En 32 bits sí que sería lo mismo XDD

En 64 bits no, pues la primera se incrementa en 4 y la segunda en 8 :P

Gracias :D

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

geeke

Cita de: class_OpenGL en  4 Junio 2016, 21:27 PM
En 32 bits sí que sería lo mismo XDD

En 64 bits no, pues la primera se incrementa en 4 y la segunda en 8 :P

Gracias :D

Supongamos el siguiente arreglo:

int arreglo[8];

arreglo es de tipo int* un puntero al primer elemento de arreglo
&arreglo es de tipo int (*)[8] un puntero a un arreglo de 8 enteros

Por lo tanto si hacemos arreglo + 1 incrementara 4 bytes (suponiendo int == 4 bytes) pero &arreglo + 1 sabiendo que es un puntero a arreglo de 8 ints el incremento sera 4 * 8 = 32 saltamos 8 bytes justo despues del final de arreglo. Puedes comprobar esto haciendo:

#include <stdio.h>

int main()
{
    int array[8];
    int n = *(&array + 1) - array;
    printf("Size array = %d\n", n); //Debe imprimir 8

    return 0;
}


class_OpenGL

Ups. No consideré el tamaño del arreglo... qué despiste el mío XDD Gracias por la aclaración

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL