Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: naderST en 14 Octubre 2011, 16:59 pm



Título: Arreglos y apuntadores están íntimamente relacionados
Publicado por: naderST en 14 Octubre 2011, 16:59 pm
Buenas a todos en la universidad en la clase de arreglos y apuntadores el profesor nos dijo que están ÍNTIMAMENTE relacionados nos dio este código y nos preguntó que cómo era posible que compilara y funcionara, es decir que dijéramos el por que...

Código
  1. #include <stdio.h>
  2.  
  3. int arreglo[] = { 1, 2,3, 4, 5};
  4.  
  5. int main()
  6. {
  7.    printf("%d\n", arreglo[3]);
  8.    printf("%d\n", 3[arreglo]);
  9.  
  10.    return 0;
  11. }
  12.  

Bueno lo que sé es que el operador [] se resuelve así:

Código
  1. elem1[elem2]

Código
  1. *(elem1 + elem2)

El no va a sumar 3 a la dirección de memoria del arreglo sino que va a sumar (3*sizeof(tipo_arreglo)), pero la pregunta es Por qué esto es posible?


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: rir3760 en 14 Octubre 2011, 18:44 pm
Es posible por dos razones:

1) El operador "[]" es un operador binario, uno de los operandos (no importa cual) debe ser un puntero y el otro un valor entero.

2) Salvo ciertas excepciones (como en el caso del operador sizeof) el uso del nombre de un array resulta no en este sino en un puntero (del tipo apropiado) apuntando al primer elemento del array.

En tu caso el operador "[]" recibe los dos operandos que requiere: el puntero (resultado del uso del nombre "arreglo") y el entero (la constante 3).

Otro caso (cuyo uso solo deberia ser ilustrativo) es:
Código:
printf("%c\n", "Hola, mundo"[3]);
printf("%c\n", 3["Hola, mundo"]);
En ambos casos el caracter que se imprime es 'a'.

Un saludo


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: naderST en 14 Octubre 2011, 19:56 pm
Bueno yo le dije lo del operador y me dijo eso se como funciona mas no el por qué funciona así. No se que es lo que quiere escuchar y quedé con la duda.


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: rir3760 en 15 Octubre 2011, 00:18 am
me dijo eso se como funciona mas no el por qué funciona así.
Pues por lo visto se trata de una confusión. Ese operador funciona de la forma descrita, el porque es así es algo que debería preguntarle al creador del lenguaje.

Mejor platica con el para aclarar las dudas.

Un saludo


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: LearningSpanishProgrammer en 15 Octubre 2011, 03:09 am
Creo que sea un error de la lenguaje. Esto no es util.
El lenguaje C existe desde 1970, no es perfecta... muchas cosas no muy buenas,

Sabes que es eso?
Código:
  void (*(*handler[])())(int *, double) = {};
  printf("%p", handler);

Eso es un cosa no muy buena...


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: rir3760 en 15 Octubre 2011, 03:47 am
Un problema (no lo digo con malicia) es tu manejo del español, si tratas de comunicar algún punto fino (por ejemplo ironía) me temo que nos pones en dificultades (de por si ya es difícil comunicarse mediante texto).

Si bien el lenguaje C existe desde hace años este se estandarizo y, al menos técnicamente, se actualizo en 1989 y 1999. Por supuesto tiene, como cualquier otro lenguaje, sus "verrugas".

En cuanto a esto:
Código
  1. void (*(*handler[])())(int *, double) = {};
No es valido ya que se trata de un array sin indicar su numero de elementos inicializado con (aquí el detalle) una lista vacía.

Edito:

Si queremos complicarlo en serio se puede pero también podemos tratar de hacerlo mas legible utilizando un par de alias para los punteros a funcion:
Código
  1. typedef void (*pf)(int *, double);
  2. typedef pf (*pg)(void);
  3.  
  4. pg handler[10];

Un saludo


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: BlackZeroX en 15 Octubre 2011, 04:02 am
.
http://www.zator.com/Cpp/E4_2_4.htm

Código
  1.  
  2. void *(handler)(int*, double);
  3.  
  4.  

Dulces Lunas!¡.


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: naderST en 15 Octubre 2011, 05:24 am
Se desviaron un poco  :silbar: pero muchas gracias el lunes que tenga clases con él le digo a ver porque en serio no se que carajo quiere escuchar...


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: LearningSpanishProgrammer en 15 Octubre 2011, 13:58 pm
Un problema (no lo digo con malicia) es tu manejo del español, si tratas de comunicar algún punto fino (por ejemplo ironía) me temo que nos pones en dificultades (de por si ya es difícil comunicarse mediante texto).

Si bien el lenguaje C existe desde hace años este se estandarizo y, al menos técnicamente, se actualizo en 1989 y 1999. Por supuesto tiene, como cualquier otro lenguaje, sus "verrugas".

En cuanto a esto:
Código
  1. void (*(*handler[])())(int *, double) = {};
No es valido ya que se trata de un array sin indicar su numero de elementos inicializado con (aquí el detalle) una lista vacía.

Edito:

Si queremos complicarlo en serio se puede pero también podemos tratar de hacerlo mas legible utilizando un par de alias para los punteros a funcion:
Código
  1. typedef void (*pf)(int *, double);
  2. typedef pf (*pg)(void);
  3.  
  4. pg handler[10];

Un saludo

rir3760, si si, pero tengo atentar hablar, o no aprendo. Por esto escribo poco y en pequeñas frases. Pero, gracias por los comentarios.

No lo entendo, si no indicas el numero de elementos, este es deducido de la inicialización.  Creo que eso es un "zero-length array hack" o tambien el "struct hack".

(The point is, C is a nice language but it is also old, so we are forced to accept some language details for backward compatibility, like array to pointer conversion. Languages like Java also have some of these, but in a small scale, too young.)

#Edito:
AT&TSysVr4
Código:
#include <signal.h>
void (*signal(int sig, void (*disp)(int)))(int);
Tenemos que comprender esto.




Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: rir3760 en 15 Octubre 2011, 18:11 pm
El "struct hack" aplica cuando se trata del ultimo campo de una estructura, en tu ejemplo estamos tratando con un array.

En cuanto al manejador de señales no veo el problema, de nuevo si así lo decidimos basta con el uso de alias para reducir (y aclarar) la declaración:
Código
  1. typedef void (*pfn)(int);
  2. pfn signal(int sig, pfn);

Un saludo


Título: Re: Arreglos y apuntadores están íntimamente relacionados
Publicado por: leogtz en 15 Octubre 2011, 18:55 pm
No recuerdo donde leí eso y me gustó la flexibilidad de eso, leí que tienen "asociatividad" y que un buen compilador de C debería de soportar esto 3[array];