elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 23:24  


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Arreglos y apuntadores están íntimamente relacionados
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arreglos y apuntadores están íntimamente relacionados  (Leído 975 veces)
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Arreglos y apuntadores están íntimamente relacionados
« en: 14 Octubre 2011, 16:59 »

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
#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í:

Código
elem1[elem2]

Código
*(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?


En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #1 en: 14 Octubre 2011, 18:44 »

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


En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #2 en: 14 Octubre 2011, 19:56 »

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.
En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #3 en: 15 Octubre 2011, 00:18 »

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
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
LearningSpanishProgrammer

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #4 en: 15 Octubre 2011, 03:09 »

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...
En línea

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


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #5 en: 15 Octubre 2011, 03:47 »

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

Un saludo
« Última modificación: 15 Octubre 2011, 03:56 por rir3760 » En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #6 en: 15 Octubre 2011, 04:02 »

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

Código
 
void *(handler)(int*, double);
 
 

Dulces Lunas!¡.
« Última modificación: 15 Octubre 2011, 04:08 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #7 en: 15 Octubre 2011, 05:24 »

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...
En línea
LearningSpanishProgrammer

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #8 en: 15 Octubre 2011, 13:58 »

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
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
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
Código:
#include <signal.h>
void (*signal(int sig, void (*disp)(int)))(int);
Tenemos que comprender esto.


« Última modificación: 15 Octubre 2011, 14:08 por LearningSpanishProgrammer » En línea

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


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #9 en: 15 Octubre 2011, 18:11 »

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

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Leo Gutiérrez.
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 2.968


/^$/


Ver Perfil WWW
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #10 en: 15 Octubre 2011, 18:55 »

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];
En línea

Código
(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}
 

leorocko13@hotmail.com
https://github.com/leogtzr/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una pregunta sobre apuntadores « 1 2 »
Programación C/C++
darkxxx 15 2,060 Último mensaje 22 Septiembre 2008, 11:35
por Eazy
Capacidad de la antena y los IVs capturados estan relacionados?
Wireless en Linux
Ibanrc 0 303 Último mensaje 14 Marzo 2009, 18:27
por Ibanrc
Duda estructuras a apuntadores.
Programación C/C++
Fire544 4 1,442 Último mensaje 21 Diciembre 2009, 03:56
por Fire544
Duda de apuntadores
Programación C/C++
EricCorona 4 836 Último mensaje 31 Enero 2010, 20:17
por maxiestuinge
[Solucionado] Duda funciones y apuntadores
Programación C/C++
yiti007 7 1,446 Último mensaje 23 Febrero 2010, 22:39
por braulio--
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines