elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


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


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Arreglos y apuntadores están íntimamente relacionados
« 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?


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #1 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


En línea

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


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #2 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.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #3 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
En línea

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

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #4 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...
En línea

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #5 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
« Última modificación: 15 Octubre 2011, 03:56 am por rir3760 » En línea

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
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #6 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!¡.
« Última modificación: 15 Octubre 2011, 04:08 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #7 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...
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 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.


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

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Arreglos y apuntadores están íntimamente relacionados
« Respuesta #9 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
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Apuntadores, Apuntar a un espacio de memoria especifico
Programación C/C++
cyberserver 6 5,230 Último mensaje 18 Diciembre 2010, 21:10 pm
por Eternal Idol
[C++] problema con apuntadores en class [SOLUCIONADO]
Programación C/C++
STANHMAL 2 2,386 Último mensaje 16 Abril 2012, 02:26 am
por STANHMAL
Ayudenme con apuntadores sii?
Programación C/C++
thapitufa 1 1,999 Último mensaje 2 Diciembre 2012, 06:42 am
por x64core
archivos relacionados
Desarrollo Web
haupter 0 1,365 Último mensaje 11 Abril 2013, 17:13 pm
por haupter
Comparación de strings que estan en arreglos.
Programación C/C++
nrmc17 2 1,931 Último mensaje 3 Diciembre 2015, 00:04 am
por nrmc17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines