Arreglos y apuntadores están íntimamente relacionados

Iniciado por naderST, 14 Octubre 2011, 16:59 PM

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

naderST

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...


#include <stdio.h>

int arreglo[] = { 1, 2,3, 4, 5};

int main()
{
    printf("%d\n", arreglo[3]);
    printf("%d\n", 3[arreglo]);

    return 0;
}


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

elem1[elem2]

*(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?

rir3760

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:
printf("%c\n", "Hola, mundo"[3]);
printf("%c\n", 3["Hola, mundo"]);

En ambos casos el caracter que se imprime es 'a'.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

naderST

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.

rir3760

Cita de: naderST en 14 Octubre 2011, 19:56 PMme 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

LearningSpanishProgrammer

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?

  void (*(*handler[])())(int *, double) = {};
  printf("%p", handler);


Eso es un cosa no muy buena...
Estoy aprendiendo español, y tu estas aprendiendo programación

rir3760

#5
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:
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:
typedef void (*pf)(int *, double);
typedef pf (*pg)(void);
   
pg handler[10];


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

BlackZeroX

#6
.
http://www.zator.com/Cpp/E4_2_4.htm

Código (cpp) [Seleccionar]


void *(handler)(int*, double);



Dulces Lunas!¡.
The Dark Shadow is my passion.

naderST

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...

LearningSpanishProgrammer

#8
Cita de: 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:
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:
typedef void (*pf)(int *, double);
typedef pf (*pg)(void);
 
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

#include <signal.h>
void (*signal(int sig, void (*disp)(int)))(int);

Tenemos que comprender esto.


Estoy aprendiendo español, y tu estas aprendiendo programación

rir3760

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:
typedef void (*pfn)(int);
pfn signal(int sig, pfn);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language