Autor
|
Tema: Arreglos y apuntadores están íntimamente relacionados (Leído 5,414 veces)
|
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() { 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?
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
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
|
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
Mensajes: 1.639
|
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
Mensajes: 67
|
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...
|
|
|
En línea
|
Estoy aprendiendo español, y tu estas aprendiendo programación
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
« Ú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
Mensajes: 3.158
I'Love...!¡.
|
. http://www.zator.com/Cpp/E4_2_4.htm void *(handler)(int*, double);
Dulces Lunas!¡.
|
|
« Última modificación: 15 Octubre 2011, 04:08 am por BlackZeroX (Astaroth) »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
naderST
|
Se desviaron un poco 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
Mensajes: 67
|
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.
|
|
« Ú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
Mensajes: 1.639
|
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
|
|
|
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
|
|
|
|
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
|
18 Diciembre 2010, 21:10 pm
por Eternal Idol
|
|
|
[C++] problema con apuntadores en class [SOLUCIONADO]
Programación C/C++
|
STANHMAL
|
2
|
2,386
|
16 Abril 2012, 02:26 am
por STANHMAL
|
|
|
Ayudenme con apuntadores sii?
Programación C/C++
|
thapitufa
|
1
|
1,999
|
2 Diciembre 2012, 06:42 am
por x64core
|
|
|
archivos relacionados
Desarrollo Web
|
haupter
|
0
|
1,365
|
11 Abril 2013, 17:13 pm
por haupter
|
|
|
Comparación de strings que estan en arreglos.
Programación C/C++
|
nrmc17
|
2
|
1,931
|
3 Diciembre 2015, 00:04 am
por nrmc17
|
|